Networking 如何在internet上的本地网络中侦听应用程序?

Networking 如何在internet上的本地网络中侦听应用程序?,networking,routing,Networking,Routing,我想知道像skype(一种流行的聊天客户端)这样的应用程序如何在只有一个路由器的本地网络中工作,它如何在特定的端口上监听 例如:= 在一个网络中,A和B是两台运行skype的机器,两者的网关都是G1 现在,A和B如何在互联网上拥有与G1相同的IP,但如何确保它们在不同的端口上侦听?他们如何向路由器G1请求唯一端口 我想在linux上制作一个简单的文本聊天服务器。如何在两个不同网络中的两台不同计算机之间建立连接?除非A和B实际上在“监听”对传出请求的响应,否则需要对路由器进行配置,以将相关端口号转

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

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

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


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

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

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

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


关键是,不是客户机彼此连接,而是它们连接到服务器,然后服务器再连接到它们以验证它们是否可用,如果其中至少有一个没有防火墙,则引导另一个连接到第一个,而不让其自身进一步通信。如果两者都是防火墙,则is必须通过自身转发消息。

您需要一个中央UDP会合服务器

在从客户端到服务器的初始连接之后,UDP客户端可以被重定向,以便直接相互通信,即使是防火墙

诀窍是从内部打开UDP连接


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

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

    NAT穿越功能可以内置到任何硬件设备或软件应用程序中。通常会给NAT设备带来麻烦,但在启用UPnP时工作良好的应用程序包括:

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

    当这些应用程序启用UPnP时,通过Windows XP ICS进行访问可使其无缝工作。

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

    • 通过广播UDP进行发现,许多游戏都使用UDP进行局域网游戏。客户端向其子网的广播地址发送数据包。对等方可以选择接收此广播并作出响应。缺点是这仅限于当前子网。更通用的INADDR_广播(255.255.255.255)适用于本地链路上的所有子网,但无法路由,因此无法在internet上工作(这是DHCP自动配置使用的)

    • 通过中央(会合)服务器进行发现。每个客户机都知道服务器的地址,后者会通知他们彼此的情况。IRC、Voip、IMs和大多数“对等”网络都使用这种技术

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

    通过使用会合服务器,您可以使用服务器本身相互交谈。客户机A告诉服务器该说什么,然后它又告诉客户机B,因为两个客户机都有到服务器的出站连接

    客户端可以在不使用服务器代理的情况下相互通信。这需要DMZ、端口转发或UPnP。DMZ基本上将所有端口上的所有传入连接转发到给定的本地IP。端口转发仅将某些端口转发到本地IP。UPnP更高级一些,客户端请求路由器临时将端口转发给它,然后您通过集合服务器通知另一个客户端连接到哪里

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

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


    另一个解决方案是使用公共Web服务器,并“滥用”其插入内容的能力来彼此聊天。

    可以说是superuser.com的一个问题,但由一位开发者提出