Client A和 Client B 都是在内网, Client A与Client B可以与Server S通信了。如果Client A此时想直接发送信息给Client B,那么他可以从Server S那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息Client B就能收到了呢?答案是不行,因为如果这样发送信息,NAT B会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。
我想问 是什么原因使NAT把这个数据包丢弃。 或者说,怎样才认为这个包是不请自来的。

解决方案 »

  1.   

    NAT本身会把这个包丢弃,NAT的机制在与如果是假如B和A建立了连接,A对B的回应会先到网关,也就是B的公网地址,通过NAT再把数据回应给B,对B来说,这个过程是透明的。但是假如B和A没有建立连接,A对B发包,则肯定会被NAT抛弃,因为NAT会认为这是非法的。 
    具体可查找关于NAT原理的一些帖子
      

  2.   

    可以通过Server S 向client B发送一个要它向Client A打洞的请求,问题是这个打洞的请求为什么没有被Client A的网关抛弃,他们一样的是不请自到的包?
      

  3.   

    由内向外的洞,也就是B到A的连接是不会被NAT抛弃的。你可以看一下
    http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt
    参考UDP Hole Punching
      

  4.   

    NAT对内部往外的连接,是允许的