UDP NAT穿透俗称p2p打洞。
讲到NAT, 追溯一下NAT产生缘由:使用ipv4的时候,地址数量有限,NAT设备可让接上它的其余设备在其上共享ip,缓解地址不够用。固然ipv6的概念早就来临了,国内推广的程度和推广慢缘由这里就先忽略,下面介绍一下NAT穿透以及实现。服务器
NAT的类型(NAPT)架构
彻底锥型(Full Cone)tcp
内部地址[internal_ip:internal_port]经过NAT映射外部地址[external_ip:external_port], NAT分配端口后,全部外部设备能够经过这个[external_ip:external_port]和[internal_ip:internal_port]通讯
受限锥型(Restricted Cone), 或者说是IP受限锥型测试
内部必须主动连接外部, 被访问的目标设备[tag_exrenal_ip:*]能够与之任意端口通讯, 而其余外部IP则不能
端口受限锥型(Port Restricted Cone), 或者说是IP + PORT受限锥型google
在受限锥型的基础之上,对端口进一步约束;目标设备[tag_exrenal_ip:tag_port1]能够与之通讯,而[tag_exrenal_ip:tag_port2]不行
对称型(Symmetric)阿里云
每次对外访问, NAT映射外部地址[external_ip:external_port]的端口均不同。如: 当主机A访问主机B, A的IP被映射为[ip:port1]后; 当主机A访问主机C, A的IP被映射为[ip:port2]后。
穿透NAT的协议spa
Google穿透协议[RFC3489][RFC5766]系列介绍了[STUN][TURN]协议(协议版本变化),属于 client-server的协议,经过client与server之间发送数据包,通讯以获取一些信息。
STUNcode
STUN-client位于NAT后面,它经过与STUN-server交互,发送\接收[协议的]数据报,能够经过抓包 简略查看(好比tcpdump)交互过程,最终将NAT类型和内外二元组返回给STUN-client。固然详细的 通讯过程,查看goole定义RFCxxxx的协议,最好结合开源的client实现结合。
TURNserver
TURN-client一样和server交互,其做用是穿透失败,使用中继,确保通讯成功的低优先级策略。 就是实际数据中转的传输中心,固然若是TURN存在NAT,须要支持hairpin。协议简要归纳:client Allocate请求、建立Permission、创建Channel等等,经过在TURN-server上分配一个Port,做为 己方的一个候选通讯 [ip:port]。
ICE图片
穿越协议[RFC5245],能够理解为对STUN和TURN的扩展,利用STUN\TURN client收集、检查、优 先级本地候选地址,用于其余peer使用并用于链接。
NAT穿透实现
试验几个组件
1.STUN服务器使用google开放stun.l.google.com:19302 2.TURN使用开源coturn,主机阿里云便可,支持hairpin 3.客户端实现,使用开源ice4j(实现了STUN\TURN的client,协议版本可能有异)
架构
流程
step1:经过ice4j获取候选[ip:port] step2:经过login-server权限校验以及SDP交换 step3:检测彼方SDP,进而通讯,ice完成
结语
UDP穿透成功,两端位于对称NAT后,这里没有使用生日攻击等端口预测,经过realy能够通讯