Neo*_*b91 7 udp tcp forwarding
我曾经认为我对TCP和UDP协议的理解虽然有限,但是正确的.虽然最近,当我意识到共享一个普通洪流的对等体可以通过TCP或UDP协议相互连接而不需要端口转发时,我感到困惑.路由器如何知道本地网络中的哪台机器将数据包转发到?任何帮助清理它将不胜感激.Internet上的torrent协议图和文章大大简化,因此不包含任何有用的信息.
路由器(运行NAT)跟踪所有传出的数据包,然后允许传入的数据包响应那些传出的数据包.
因此,如果您与google.com:80建立传出TCP连接,那么它将允许从google.com:80返回(作为响应)数据包.如果两个内部主机建立到同一端口的连接,则可以区分它们,因为本地端口不同,例如:
1)主机A与Google建立连接,路由器使用自己的本地端口10001进行TCP连接
2)主机B进行类似的连接,路由器使用自己的本地端口10002进行TCP连接
如果数据包来自google.com:80并且其地址为路由器WAN IP上的端口10001,则路由器知道将其发送到主机A.如果其寻址端口10002,则路由器知道将其发送到主机B.
如果在路由器后面有两个对等主机(两个NAT),那么就没有办法建立连接,除非有什么东西要传递关于彼此IP的信息(即他们都可以用来交换信息的服务器),他们可以尝试猜测路由器将选择哪个端口作为本地端口,然后开始将该端口上的其他数据发送到路由器WAN IP.由于两个路由器都看到数据流出,因此他们设置了一个允许数据IN的规则.如果端口被正确猜测,那么来自每一方的数据包都可以通过,因为两个路由器都设置了规则.这称为UDP/TCP打孔.
http://en.wikipedia.org/wiki/UDP_hole_punching
我相信Skype是一个使用UDP并进行打孔的应用程序的例子.