两边都是Full Cone的情况我实现了,但不知道有一方是Restricted Cone的情况能不能实现,具体怎么实现呢?下面这样行的通不?因为A侧NAT属于Symmetric NAT,且最初A到C发包的过程在A侧NAT留下了如下记录:
A(192.168.0.4:5000)->(210.21.12.140:8000)-> C(210.15.27.166:2000),故A到B发包过程在A侧NAT上留下的记录为:
A(192.168.0.4:5000)->(210.21.12.140:8001)->B(210.15.27.140:8000)(注意,转换后端口产生了变化)。
而B向A的发包,只能根据C给他的关于A的信息,发往A(210.21.12.140:8000),因为A端口受限,故此路不通。
再来看B侧NAT,由于B也向A发过了包,且B侧NAT属于Restricted Cone或Port Restricted Cone,故在B侧NAT上留下的记录为:
B(192.168.0.5:5000)->(210.15.27.140:8000)->A(210.21.12.140:8000),此后,如果A还继续向B发包的话
(因为同一目标,故仍然使用前面的映射),如果B侧NAT属于Restricted Cone,则从A(210.21.12.140:8001)来的包能够顺利到达B;
如果B侧NAT属于Port Restricted Cone,则包永远无法到达B。 
结论3:一侧NAT属于Symmetric NAT,另一侧NAT属于Restricted Cone,也可双向通信。 

解决方案 »

  1.   

    说错了,是一方对称NAT,一方不是对称NAT
      

  2.   

    重复发帖对解决问题没有实际帮助,只要发对版块就可以了。假设A为Symmetric NAT,B为Port Restricted Cone:
    A、B分别登录服务器,服务器记录A、B的公网IP和端口号。A、B需要直接通讯时,A从服务器获得B的公网IP和端口号,不断向B发包联系(定时即可),B从服务器取得A的IP,循环向A的各个端口发包(1字节即可),直到收到A发来包为止,根据收到的端口号,再发包与A联系,双方确认后就可以通讯了。
      

  3.   

    实际编程中B从服务器获取A的IP和端口号,假设端口号为N,先向N发包,然后再发N+1、N-1、N+2、N-2、N+3……CSDN太慢了,超时N次。