基于P2P的TCP穿透NAT技术研究
2011-03-14刘健周仲文刘洋
刘健 周仲文 刘洋
四川广播电视大学 四川 610107
0 引言
Internet飞速发展,IPv4地址日益不足,不得不使用NAT技术来提高地址使用率,从逻辑意义上扩展地址空间。P2P技术的出现也是 Internet发展的结果,其优点在于任意两节点间可以随意通信,摆脱了客户端对服务器的依赖。
NAT背后的私有地址对公网地址节点不可见,虽然内网主机可以主动访问外部网络,但公网主机不能主动访问内网主机。同时,内网主机间不能相互识别,进而导致不能直接向对方提供服务。这类问题与P2P技术的初衷——“对等”相违背,阻碍了P2P的发展。在目前NAT技术大面积应用的状态下,急需一种简单有效的办法解决这个问题,同时还要满足“不需要改变现有网络结构”的要求。
1 NAT类型
根据端口映射方式不同,NAT主要分为两大类:ConeNAT(克隆式 NAT)和 SymmetricNAT(对称式 NAT)。ConeNAT把来自于同一个内网地址 A:B的请求都映射到一个公网地址X:Y上。SymmetricNAT把来自于同一内网地址A:B,去往同一个外网地址C:D的请求映射成同一个公网地址X:Y1,去往另外一个外网地址E:F的请求映射成同一个公网地址,但端口不同X:Y2。
研究表明,现存的NAT有88.1%是属于第一种类型,只有2.3%左右的NAT属于第二种。因此,针对ConeNAT的穿透研究更具有实际应用价值。
2 穿透NAT
最新的STUN已经规定其自身只是一种应用于NAT的工具,不再是一整套解决方案。结合TCP建立连接的特点,即要经过三次握手,此过程需要第三方的服务器协助才能穿透NAT,具体步骤见图1。
图1 TCP穿透NAT流程
(1)用户A与公网上的服务器S建立TCP连接。S判断A所连接的NAT A类型,并记录下A的私有地址(172.16.1.2: 4001)以及经过转换后的公网地址(211.0.0.2:5001)(第1步)。同样的信息在用户B与服务器S建立连接后也记录下来:私有地址(192.168.1.3:6001)和公网地址(222.0.0.3:7001)(第2步)。
(2)当A与B之间需要建立TCP连接时,A先向S发送一个请求(第3步),S把B的公网地址(222.0.0.3:7001)回复给A(第4步)。于是A断开与S的连接,并且向B发出一个SYN(A->B)信息,接着A保持监听状态,并每隔一段时间向B发送一个SYN(A->B)(第6步)。当第一个SYN信息到达NAT A后,NAT A记录下A主动与B通信的状态,此后来自B的数据包可以自由穿透NAT A。
(3)S在把B的公网地址回复给A的同时,也把A的公网地址通知给B(第5步)。
(4)B收到S的通知后,断开与S的连接,并且向A发送一个SYN(B->A)信息(第7步),接着B保持监听状态。当这个SYN(B->A)到达NAT B后,NAT B记录下B主动与A通信的状态,此后来自A的数据包可以自由穿透NAT B。如果SYN(A->B)比SYN(B->A)先到达NAT B,SYN(A->B)会被认为是非法而抛弃,如第6步的SYN(A->B);只有比SYN (B->A)晚到达NAT B的SYN(A->B)才会被认为是合法,如第8步的SYN(A->B)。
(5)当合法的SYN(A->B)穿透NAT B到达B(第8步)后,B向A回发一个SYN+ACK(B->A)信息(第9步)。此时来自 B的数据包都被 NAT A认为是合法,所以这个SYN+ACK(B->A)可以自由穿透NAT A到达A。
(6)当 A收到 SYN+ACK(B->A)后,向 B回发一个ACK(A->B)(第10步)。这个ACK(A->B)也可以自由穿透NAT B到达B。于是双方的TCP经过三次握手,建立连接成功(第11步)。
此种穿透法可以在前述的大多数情况下正常建立P2P的TCP连接,具有实际应用价值。但是如果其中有一个 NAT是 SymmetricNAT,那么上述方法就会失效。因为对于不同的目的公网地址,都会映射成不同的端口。
3 结语
通过第三方的协助,P2P顺利穿透NAT,各节点间建立TCP连接。此方法的优点在于简单有效,不需要改变现有的网络结构,在相当长的一段时间都可以应用于实践当中,为网络结构升级换代提供了更加充分的时间。缺点就是需要借助第三方的帮助,增加了设备购置的成本,也增加了管理的成本,同时还增加了安全风险。
[1]Jennigs C. NAT Classification Results using STUN. IETF Internet Draft. October 2004.
[2]RFC5389 Session Traversal Utilities for NAT (STUN). J. Rosenberg, R. Mahy, P. Matthews, D. Wing. October 2008.
[3]BEHAVE-NAT MacDonald, D. and B. Lowekamp, "NAT Behavior Discovery Using STUN", Work in Progress, July 2008.
[4]BEHAVE-TURN Rosenberg, J., Mahy, R., and P. Matthews, "Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)", Work in Progress, July 2008.
[5]Jeffrey L. Eppinger. TCP connections for P2P apps: A software approach to solving the NAT problem. Technical Report CMUISRI-05-104, Carnegie Mello University. January 2005.
[6]Andrew Biggadike, Daniel Ferullo, Geoffrey Wilson, and Adrian Perrig. NAT BLASTER: Establishing TCP connections between hosts behind NATs. In ACMSIGCOMM Asia Workshop, Beijing China. April 2005.
[7]RFC2988 Computing TCP's Retransmission Timer. V. Paxson, M. Allman. November 2000.