tcp - Torrent 点对点连接

标签 tcp udp forwarding

我曾经认为我对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/

相关文章:

MIPS 管道停顿 : SW after LW

ssh - 如何使用 "vagrant ssh"进行 ssh 代理转发?

tcp - 使用 TCP 的 Stackoverflow?

javascript - Chrome UDP套接字未从远程计算机接收

iphone-sdk-3.0 - iPhone SDK中的WinSock相当于什么?

networking - 同一台计算机上的多个应用程序可以接收 UDP 广播吗?

c++ - Linux UDP丢包的原因

tomcat - 通过互联网、tomcat 服务器访问 Localhost

c - 在套接字上设置 TCP ECN (C Linux)

java - 使用 AsyncTask 进行 android 网络连接