知识卡片
P2P打洞:借助双方各自主动连接产生的临时NAT映射建立直连
内容
P2P网络看似是多对多的直接传输,但实际拆解开来包含控制部分和传输部分两层:控制部分由服务节点负责交换信息、协调连接、查询资源与节点位置;传输部分才是两个实体之间真正的数据交换。传输部分涉及的实体分两类:可以被外部直接访问的,和隐藏在NAT(网络地址转换)设备后面的。只要通信双方里至少有一方可以被直接访问,就能直接通过控制部分建立连接,不需要打洞;只有当双方都隐藏在各自的NAT之后,才出现”打洞”这个问题。所谓打洞,本质是让NAT内部的实体先主动向外部发起一次连接,这个主动连接会在NAT设备上留下一条”临时”的映射关系,之后外部数据包才能通过这条映射被正确转发进内网;每个实体需要把自己打洞得到的外网IP和临时端口上报给P2P网络的服务器,供其他节点后续直接使用这份信息发起连接,同时需要周期性发送心跳维持这条临时映射不被NAT设备清理掉;打洞依赖NAT设备是”Cone类型”(外部主机向已打开端口发送的信息都会被转发给内部主机),如果打洞失败,只能退回到服务器转发模式。这个案例说明NAT穿透问题的本质,是”通信双方都被防火墙类设备单向屏蔽了被动接入能力”,解法是利用两端各自”能主动发起连接”这一点,借助第三方中转协调,换来一条本不该存在的直连通道。
参考来源
- 位置:《高可用架构(第1卷)》第7章《安全与网络》"7.3 CDN对流媒体和应用分发的支持及优化"节,"7.3.5 P2P穿墙打洞"(源文件:_epub-src/OEBPS/Text/Chapter7_3_6.xhtml)
- 结论依据:原文说明"只要至少有一方可以直接被访问,那么就可以利用控制部分建立传输通道,也就不需要进行打洞。当2个实体都被隐藏在NAT后面时,才有打洞这个问题……所谓打洞,实际上是指隐藏在NAT内部的服务器通过连接外部实体时,在NAT服务器上留下的一个'临时'的映射关系……每个实体必须周期性地向P2P网络的服务器发送心跳,该心跳是为了保证打洞的'临时'端口不被清理",直接支撑本卡片结论。
- 原始内容:只要至少有一方可以直接被访问,那么就可以利用控制部分建立传输通道,也就不需要进行打洞。当2个实体都被隐藏在NAT后面时,才有打洞这个问题……每个实体必须周期性地向P2P网络的服务器发送心跳,该心跳是为了保证打洞的"临时"端口不被清理。