2012-01-24 38 views
6

我曾经认为我对TCP和UDP协议的理解虽然有限,但是是正确的。尽管最近,当我意识到共享一个公共洪流的对等端可以通过TCP或UDP协议相互连接而不需要实际的端口转发时,我就感到困惑。路由器如何知道本地网络中的哪台机器将数据包转发到哪里?任何帮助清除这一点,将不胜感激。互联网上的洪流协议图表和文章被大大简化,因此不包含任何有用的信息。Torrent点对点连接

+0

仅供参考:大多数路由器/防火墙的90%阻止UDP! –

+1

你从哪里得到这个统计数据?我从来没有遇到过我的UDP应用程序问题(家中有多个SOHO,咖啡店或办公室),无论是tftp,游戏还是自定义的东西。 –

+0

默认情况下,大多数路由器阻止UDP *广播*。 –

回答

6

路由器(运行NAT)跟踪所有传出的数据包,然后允许传入的数据包作为对这些传出数据包的响应。

因此,如果您向外发送TCP连接到google.com:80,那么它将允许数据包从google.com:80返回(作为响应)。如果两个内部主机连接到同一个端口,可以区分它们,因为本地端口不同,例如:

1)主机A与Google建立连接,路由器使用其自己的本地端口10001作为TCP连接

2)主机B也有类似的连接和路由器使用它自己的本地端口10002 TCP连接

如果一个数据包从google.com:80进来,它解决了在端口10001路由器的WAN IP,则路由器知道将其发送到主机A.如果它的地址为端口10002,路由器知道将其发送到主机B.

如果你在路由器后面有两个对等主机(两个NAT),那么就没有办法建立连接,除非有什么东西可以传输关于其他IP的信息(即,一个他们可以用来交换信息的服务器),他们可以尝试猜测路由器将选择哪个端口作为本地端口,然后开始在该端口上将每个其他数据发送给路由器WAN IP。因为两台路由器都看到数据发送出去,所以他们设置了一个允许数据输入的规则。如果端口被猜测正确,那么来自每边的数据包都可以通过,因为两个路由器都有一个规则设置。这被称为UDP/TCP打孔。

http://en.wikipedia.org/wiki/UDP_hole_punching

相信Skype是它使用UDP和不打孔一个应用程序的一个例子。

+0

谢谢你的深刻反应!我相信我现在已经充分理解了这个话题,让我的思想休息...现在。 顺便说一句,Skype是一个聪明的野兽。我认为它可能会检测到您正在与本地网络中的某个人进行对话时(在路由器重新启动后仍然连接到Internet时,我可以与我的姐姐聊聊) – Neob91

1

严格来说,由于您没有使用'NAT'来限定路由器路由器,因此答案是路由器使用ARP来确定目标主机的MAC地址,然后将具有该MAC地址的以太网帧作为目标地址。

但我认为这不是你的意思。

你的意思是NAT路由器如何知道在哪里转发入站数据包?

答案是路由器维护一个活动的“连接”列表,使其能够进行地址转换。它使用外部端口号映射到内部主机地址和端口号。在TCP的情况下,“连接”的概念仅仅是是否存在TCP连接(尽管通常有超时停止泄漏)。在UDP的情况下,它更难,因为没有UDP连接本身,所以通常是通过超时跟踪它的情况。