如何应用程序在Internet上本地网络中收听?

时间:2010-01-07 11:56:45

标签: networking routing

我想知道skype(一个流行的聊天客户端)这样的应用程序如何在本地网络中与一个路由器一起工作,如何在特定端口上侦听?

例如:=  在一个网络中,A和B是运行skype的两台机器,两者的网关都是G1,

现在A和B将如何在互联网上拥有与G1相同的IP,但他们如何确保他们在不同的端口上监听?他们如何向路由器G1询问唯一端口。

我想在linux上创建一个简单的文本聊天服务器。如何在两个不同的网络中的两台不同计算机之间建立连接?

5 个答案:

答案 0 :(得分:2)

解决您的问题的方法是在网络中的某个位置安装转发服务器。

不同的程序使用不同的方式相互连接。但是每个聊天服务器(包括Skype)都有一台服务器,用于转发有关子网IP /端口可用性的数据或信息。
有两种类型的客户端:“监听”客户端和“被动”客户端。听力客户端可以通过路由器端口转发直接访问Internet,“被动”客户端必须使用其他技巧来获取外部数据,线路外部服务器或其他端口进行监听。

关键是,不是客户端彼此连接,而是连接到服务器,服务器然后连接回它们以验证它们是否可用,并且,如果它们中的至少一个没有防火墙,则指示另一个连接到第一个一,排除了进一步的沟通。如果两者都是防火墙,那么就必须通过它自己转发消息。

答案 1 :(得分:1)

您需要一个中央 UDP Rendezvous Server

在从客户端到服务器的初始连接之后,即使防火墙,也可以重定向UDP客户端以直接与彼此通信。

诀窍是从内部打开UDP连接。

  1. Check out Real-Time Media Flow Protocol and how they use it.
  2. Check out UDP Hole Punching
  3. alt text http://labs.adobe.com/technologies/stratus/images/p2pvideo_250x215.jpg

答案 2 :(得分:1)

传统NAT服务器使用NAT服务器外部接口的地址和随机端口号替换源地址和端口。这适用于简单协议(如HTTP和SMTP),但它可能会为需要NAT服务器外部接口上的多个响应端口的更复杂协议带来问题。如果没有NAT编辑器和类似的软件修复程序的帮助,NAT服务器也不会知道存储在应用程序层标头的数据部分中的信息。

Windows XP对这些问题的回答是NAT Traversal,它可以自动允许启用UPnP的NAT客户端应用程序与UPnP NAT设备通信。 NAT Traversal提供了一些方法,允许UPnP客户端了解NAT服务器的公共IP地址,并为UPnP NAT客户端应用程序协商动态分配的端口映射。

NAT Traversal功能可以内置到任何硬件设备或软件应用程序中。通常会导致NAT设备出现问题但在启用UPnP时运行良好的应用程序包括以下内容:

多人互联网游戏 音频和视频通信 终端服务客户端和服务器 点对点文件共享应用程序

当这些应用程序启用了UPnP时,通过Windows XP ICS进行访问可以让它们无缝地工作。

答案 3 :(得分:1)

主机发现

  • 手动发现,客户A知道客户B是谁

  • 通过广播UDP发现,用于局域网播放的很多游戏。客户端将数据包发送到其子网的广播地址。同伴可以选择接收此广播并做出回应。缺点是这仅限于当前子网。更一般的INADDR_BROADCAST(255.255.255.255)适用于本地链路上的所有子网,但无法路由,因此无法通过Internet工作(这是DHCP自动配置使用的)。

  • 通过中央(Rendezvous)服务器进行发现。每个客户端都知道服务器的地址,后者通知他们彼此。这种技术被IRC,Voip,IM和大多数“点对点”网络使用。

通信

在初步发现完成后,您希望能够与彼此交谈。在互联网上,这可能会变得棘手。现在大多数人都有自己的路由器并且坐在NAT后面,所以直接连接是不可能的。

使用Rendezvous服务器,您可以使用服务器本身相互通信。客户端A告诉服务器说什么,然后它告诉客户端B,因为两个客户端都有到服务器的出站连接。

客户端可以在没有服务器代理的情况下相互通信。这需要DMZ,端口转发或UPnP。 DMZ基本上将所有端口上的所有传入连接转发到给定的本地IP。端口转发仅将某些端口转发到本地IP。 UPnP有点高级,客户端请求路由器临时转发端口,然后通过集合服务器告诉其他客户端连接的位置。

聊天应用实施

对您的问题最简单的解决方案是最有可能使用所有客户端都知道的中央服务器代理主机发现以及可能的客户端之间的通信。如果您希望客户端直接通信,您可以只代理主机发现,然后让DMz,手动端口转发或UPnP完成其余工作。

另一种解决方案是通过上面讨论的NAT遍历技术进行直接通信,并进行手动主机发现。

另一种解决方案是使用公共网络服务器并“滥用”其插入内容以相互聊天的能力。

答案 4 :(得分:0)

除非A和B实际上“监听”对传出请求的响应,否则您的路由器需要进行配置以将相关端口号转发给相关主机。这不是您可以在代码中请求的内容,而是您需要在路由器上配置的内容。