现在我们知道,通过NAT,,内网的计算机向外连结是很容易的。NAT对于内网和外网的计算机是透明的。内网的机器欲访问外面的机器,可在NAT上“打洞”,而且这个“洞”是有方向的。也就是让NAT建一个session,从而建立映射。
那么,如果同一个进程,与外网的两台机器,同时建立联系,情况又是如何呢。
如图所示:Client A的原来那个Socket(绑定了1234端口的那个UDP Socket),现在又要向另外一个Server S2发送了一个UDP包,那么这个UDP包在通过NAT时会怎么样呢?
这时可能会有两种情况发生:
1)是NAT再次创建一个Session,并且再次为这个Session分配一个端口号(比如:62001)。
2)是NAT再次创建一个Session,但是不会新分配一个端口号,而是用原来分配的端口号62000。
前者NAT叫做Symmetric NAT,后者叫做Cone NAT。
当然,我们期望的NAT是第二种。呵呵,如果你的NAT刚好是第一种,那么很可能会有很多P2P软件失灵。(不过可以庆幸的是,现在绝大多数的NAT属于后者,即Cone NAT)