编辑:在评论(并阅读链接的页面)后,我应该撤消我的建议。我不删除它,为好的图形,但改变了最后一部分。
如果我理解正确的,你有两个客户端都在NAT防火墙,它允许传出连接,但不向前入流的连接,如果没有专门配置做这样的(因为他们不知道背后其中它注定的本地主机)。
原则,在其整个存在时间的TCP连接总是在这些地址(例如,我们有保持不变四位数字)连接两个相同的IP地址和端口号。在NAT的情况下,你实际上有两个连接,但这不是从客户端计算机A(也没有从服务器S)可见:
Client A -------(LAN)------ NAT B ------ (Internet) -------- Server S
IP A IP B1 | IP B2 IP S
Port a | Port b Port s
的TCP分组具有[A:A/S:S](或[S:s/A:a])地址和Internet部分上的[B2:b/S:s](或[S:s/B2:b])地址。这个连接由这个[IP:port/IP:port]四元组标识,所以如果你试图改变这四个数字中的一个,这必须是一个新连接(否则数据包将被丢弃)。
所以,如果你第一次与你的服务器来说,你不能继续向其他客户讲同样的连接上,除非服务器转发的内容。
UDP数据包的情况实际上是一样的,区别在于没有连接,并且NAT必须是智能的并且猜测哪个数据包是对其他数据包的答案,并且因此将其转发给正确的方向。
正如指出的意见和其他的答案,这里就是NAT可以被欺骗了一点:我们首先发送一个UDP包到其他客户端,这将是由NAT获得扔掉那里。但是另一个客户端发送的应答数据包对传出数据包不是真正的答案(因为这个数据包从来没有被其他客户端的NAT收到),但是IP地址和端口号相匹配,它仍然可以通过。如果NAT也转换端口号,这可能会变得更加复杂。
对于TCP,它可以工作类似,如果两个NAT都没有真正保持打开的连接,而只是在发送之前发送SYN时转发(更改)了数据包。它更加复杂,因为TCP序列号也必须在这里匹配。
你只使用tcp进行通信,对吗? – 2011-04-16 17:26:50