我曾经认为我对TCP和UDP协议(protocol)的理解虽然有限,但是是正确的。尽管最近,当我意识到共享同一个 torrent 的对等点可以通过 TCP 或 UDP 协议(protocol)相互连接而无需端口转发时,我感到很困惑。路由器如何知道将数据包转发到本地网络中的哪台机器?任何有助于清理的帮助将不胜感激。 Internet 上的 Torrent 协议(protocol)图和文章已大大简化,因此不包含任何有用的信息。
最佳答案
路由器(运行 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。因为两个路由器都看到数据流出,所以它们设置了一条规则以允许数据流入。如果猜对了端口,则来自每一方的数据包都可以通过,因为两台路由器都设置了规则。这称为 UDP/TCP 打洞。
http://en.wikipedia.org/wiki/UDP_hole_punching
我相信 Skype 是使用 UDP 并进行打洞的应用程序的一个例子。
关于tcp - Torrent 点对点连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8993781/