我曾经认为我对TCP和UDP协议的理解虽然有限,但是正确的。虽然最近,当我意识到共享一个普通洪流的对等体可以通过TCP或UDP协议相互连接而不需要端口转发时,我感到困惑。路由器如何知道本地网络中的哪台机器将数据包转发到?任何帮助清理它将不胜感激。互联网上的洪流协议图和文章大大简化,因此不包含任何有用的信息。
答案 0 :(得分:7)
路由器(运行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并进行打孔的应用程序的例子。
答案 1 :(得分:1)
严格来说,由于您没有使用“NAT”限定您的术语路由器,因此答案是路由器使用ARP来确定目标主机的MAC地址,然后使用该MAC地址发送和以太网帧作为目标地址。
但我认为那不是你的意思。
您的意思是NATting路由器如何知道转发入站数据包的位置?
答案是路由器维护一个活动“连接”列表,使其能够进行地址转换。它使用外部端口号映射到内部主机地址和端口号。在TCP的情况下,“连接”的概念仅仅是是否存在TCP连接(尽管通常具有停止泄漏的超时)。在UDP的情况下,它更难,因为没有UDP连接本身,所以通常只是通过超时跟踪它。