p2p总结(五):探测NAT类型

完成“打洞”任务,需要一个“局外人”(前文中的S服务)来主持。要完成探测NAT类型的工作,还需引入更多的外部服务: 上图中描述的是一个Cone形NAT。msvrd(主服务main)就是前文中的S,psvrd是主管探测(probe)的服务,两个辅助服务hsvrd1和hsvrd2(h是help的意思)由psvrd来调度。proxy负责联通各个服务程序,将到来的数据包路由给指定的目标服务,对各服务程序来说它是透明的。

对任意一个peer A来说,它除了要主动连msvrd,向其注册自己之外,还要主动发起一个对hsvrd1的连接。

探测任务由主服务msvrd发起,msvrd向psvrd发消息,令其对指定的peer的NAT类型实施探测。当然,msvrd会把其已掌握的有关该peer的关键信息(公网ip,公网port等信息)告知psvrd服务。

psvrd主导的探测流程如下: 如果A直接在公网,流程会走到Full Cone,打洞时,对Full Cone和公网的处理是一样的。

上面的判定逻辑是基于之前讨论过的那几种NAT的特性来做的。也就是说,不管是何种设备,只要表现出相应的特性,就会被该逻辑判定为某种已知的NAT类型。

打洞时,将NAT分为三类做不同处理:

  • Full Cone、公网
  • 带限制(IP或端口限制)的Cone
  • 对称NAT


Prev-p2p小结(四):TCP打洞