只有NAT确信内部想与外部通信,NAT才会让外部的数据包进入内部。那么NAT是靠什么“确信内部想与外部通信”,就是内部发送一个数据包到这个“外部地址”   
    
  比如下面的网络环境:   
  Client   A   ->Nat   A->....internet   <-Nat   B<-Client   B   
    
  比如Client   A想发送给Client   B一个信息“Hello”。那么直接给Client   B的公网地址发送信息,会被NAT   B丢掉,那么怎么让NAT   B不丢掉这个信息呢?就是告诉NAT   B“Client   B确实想与Client   A通信”,如果告诉NAT   B?简单,让Client   B发送一个“信息”到Client   A的公网地址就好(这个信息就是“打洞”包)   
    
  过程:   
  1   Client   A告诉Server   :   我想与Client   B通信   
  2   Server通知Client   B   :Client   A想与你通信   
  3   Client   B发送一个“打洞包”到Client   A的公网地址(这个打洞包不需要携带任何有效信息)   
  4   Client   A发送“Hello”到Client   B,由于第三步的原因,NAT不会拒绝这个请求,通信成功。   我的问题在第三步,ClientA想给B发包,被丢弃,同理为何B给A发不被丢弃?我研究P2P有段时间了,一直搞不懂这个问题,望高手指点,谢谢

解决方案 »

  1.   

    http://www.cnblogs.com/LixingTie/archive/2009/07/06/1517896.html
      

  2.   

    NAT分锥形和对称两种类型。
    对于锥形NAT,每个内网地址和端口对应固定的公网地址和端口,有些NAT会要求首先由内网向外网的某一地址和端口发送过数据后,从该外地址和端口发送过来的数据才允许进入内网,也就是A先发数据给B,之后B再发数据给A时A可以收到。
    对于对称NAT,由于同一内网地址和端口与不同的外网地址通讯时,NAT所分配的公网地址和端口不同,所以不能这样实现打洞。
      

  3.   

    第三步的B给A发的包在到达NAT A的时候,同样会被丢弃,但这个时候已经经过了NAT B,已经在NAT B处留下了记录,即使被NAT A丢弃,它也已经完成了自己的使命。