- 1 -
UDP穿越 NAT原理及实现
马金韬
北京邮电大学,北京(100876)
摘 要:本文是针对于基于 P2P协议的网络传输方面的研究,主要为了解决对等端交互信息
时发生的网关拒收数据的问题,包括了外网端同外网端、外网端同内网端和内网端同内网
端互联的操作。将从理论上进行较为透彻的分析,找到问题的原因,以此找到解决问题的
方法,然后通过实际的方案来解决 NAT穿越的问题。要保证有一个在外网的结点,在本文
中,选择了 TrackerServer作为该结点,来协助客户端穿越 NAT,实现互联。通过实践证
明,该解决方案已经在实际应用中通过。
关键词:P2P;穿越NAT;UDP
1. OLiP平台 UDP穿越 NAT原理简介
简介
NAT(Network Address Translators),网络地址转换[1]:网络地址转换是在 IP地址日益
缺乏的情况下产生的,它的主要目的就是为了能够地址重用。NAT分为两大类,基本的
NAT和 NAPT(Network Address/Port Translator)。
基本的 NAT实现的功能很简单,在子网内使用一个保留的 IP子网段,这些 IP对外是不
可见的。子网内只有少数一些 IP地址可以对应到真正全球唯一的 IP地址。如果这些节点
需要访问外部网络,那么基本 NAT就负责将这个节点的子网内 IP转化为一个全球唯一的
IP然后发送出去。(基本的 NAT会改变 IP包中的原 IP地址,但是不会改变 IP包中的端
口)[2]。
另外一种 NAT叫做 NAPT,从名称上我们也可以看得出,NAPT不但会改变经过这个
NAT设备的 IP数据报的 IP地址,还会改变 IP数据报的 TCP/UDP端口。
.现有 NAPT类型及穿越基本原理
现有的主要 Symmetric NAT型 (对称型)和 Cone NAT型(圆锥型)[3],它们的关键区别
在于:两个 session在网关时的端口是否相同,不同的是前者,相同的时后者[4]。
下面为 Symmetric NAT型(对称型):
图 1 Symmetric NAT型(对称型)
在客户机时
:4000——:8000 :4000——:8000
- 2 -
在网关时,两个不同 session但端口号不同
:62000——:8000 :62001——:8000
服务器 C
:8000
服务器 D
:8000
这种形式会让很多 p2p软件失灵。
下面是 Cone NAT型(圆锥型):
图 2 Cone NAT型(圆锥型)
在客户机时
:4000——:8000 :4000——:8000
在网关时,两个不同 session但端口号相同
:62000——:8000 :62000——:8000
服务器 C
:8000
服务器 D
:8000
目前绝大多数属于这种。Cone NAT又分了 3种类型:
a) Full Cone NAT(完全圆锥型):从同一私网地址端口 :4000发至公
网的所有请求都映射成同一个公网地址端口 :62000 ,可以收到任意外部
主机发到 :62000的数据报。
b) Address Restricted Cone NAT (地址限制圆锥型):从同一私网地址端口
:4000发至公网的所有请求都映射成同一个公网地址端口 :62000,只有当
内部主机 先给服务器 C 发送一个数据报后,才能收到
发送到 :62000的数据报。
c) Port Restricted Cone NAT(端口限制圆锥型):从同一私网地址端口
:4000发至公网的所有请求都映射成同一个公网地址端口 :62000,只有当
内部主机 先向外部主机地址端口 :8000发送一个数据报后,
才能收到 :8000发送到 :62000的数据报。
- 3 -
穿越 NAT的应用场景
图 3 为穿越 NAT的应用场景
穿越 NAT的流程
首先,Client A登陆服务器,NAT A为这次 session分配了一个 40000的端口,那么
Tracker收到 Client A的地址就是 :40000,同样,Client B登录 Server S,NAT
B给此次 Session分配的端口是 60000,那么 Server S收到的 B的地址是
:60000。
此时,Client A与 Client B都可以与 Server S通信了。如果 Client A此时想直接发送信息
给 Client B,那么他可以从 Server S那儿获得 B的公网地址 :60000,但是 Client
A向这个地址发送信息 Client B,后者仍然不能收到,因为如果这样发送信息,NAT B会
将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数 NAT都会执行丢弃动
作)。现在我们需要的是在 NAT B上打一个方向为 (即 Client A的外网地
址)的洞,那么 Client A发送到 :40000的信息,Client B就能收到了。这个打洞
命令由 Tracker来发送。
总结一下这个过程:如果 Client A想向 Client B发送信息,那么 Client A发送命令给
Server S,请求 Server S命令 Client B向 Client A方向打洞,然后 Client A就可以通过 Client
B的外网地址与 Client B通信了。
2. Tracker Server设计
由于在注册 Peer时,已经将该 Peer的外网 IP、端口注册到 Tracker上,所以在
MemberList里面能获得各个 Peer的地址信息。所以,每当注册一个新的 Peer的同时,告
诉该 Peer向另外几个在MemberList里的 Peer打洞,以可以获得其他 Peer传来的数据包,
- 4 -
在打洞完成后,告诉 Tracker打洞过程完成,其他的 Peer可以进行数据传输了,同时,
Tracker向其他 Peer发送打洞(向新 Peer)信息,使其在收到新 Peer的数据包时不会将包
丢掉。
在客户端接收到MemberList后,以使该 Peer为数据的接收进行打洞。在 PeerMessage中的
解析出 Peer的个数(dwPeerSize)和所有 Peer的具体地址,在客户端将依据该信息进行打
洞。具体流程如下:
9.传数据
图 4 具体流程图
1.向 Tracker请求MemberList, 2.获得MemberList和 TRANSMESSAGE并解析;3.向
TRANSMESSAGE中所指的 Peer打洞,在打洞完成后;4.向 Tracker报告;收到
完成信息,告诉其他 Peer可以向该 Peer传送信息;同时告诉其它 Peer向该 Peer打洞;6.
其他各个 Peer开始打洞;7.完成后向 Tracker汇报;告诉该 Peer可以向其他 Peer
发送信息;9.传送数据。
- 5 -
3. NAT穿越时序图
图 5 时序图
由于现有系统是由 TCP短连接实现, 所以,Tracker不能发起连接(针对 NAT后的
Client),这种情况下,我们由 UDP来实现以上过程。
4. 客户端函数调用图框
UDP Connect
图 6 UDP创建连接流程图
- 6 -
这个线程把从 tracker收到的 member list如果是公网 IP的 PEER则加为 partner。 如果
是私网 IP的 Peer则发送打洞信息。
图 7 UDP服务监听流程图
通过创建服务线程,监听在本机 6677端口,接受来自其他 peer的数据. 当收到其它 peer的
打洞信息时,返回一个 Echo信息。当收到其它 peer的数据时 Echo时则检查自己的
memberlist并加入 parternerlist。当收到其它 peer的数据时,会对数据包进行填充封装成系统
可以处理的 packet,然后把封装好的数据包提交给 ProcPacketBody处理。
NatReportToTrack
图 8 UDP服务监听流程图 From TrackServer
通过创建服务线程,监听在本机 6655端口,接受来自 TrackerServer的打洞命令. 当收到
TrackerServer的打洞命令时,根据 TrackerServer发送的 PEER_MSG信息向 Peer发送打洞
信息。
5. 总结
上面已经从理论,设计和实现角度进行了较为详细的分析,本文以 UDP为传输协议,
这样可以避免 TCP长连接造成的效率低下和网络压力过大的问题,可以很好的发挥 UDP
的优势,提高处理效率,降低网络压力,但也有一定的缺点,较为明显的是 UDP在网络环
境不好的情况下出现丢包或数据出错的情况,这些问题以在应用层设计一个对 UDP提供可
靠性的方法来解决。
- 7 -
参考文献
[1] 邢小良,P2P技术及其应用. 2008-2, 40-64
[2]CHU Y-H, RAO SG, ZHANG H. A case for end system multicast [A]. ACM SIGMETRICS [ C], 2000.
[3]BANERJEE S, BHATTACHARJEE B, KOMMAREDDY C. Scalable application layer multicast [A]. ACM
SIGCOMM [ C], 2002.
[4]CHOU PA, PADMANABHAN VN, WANG HJ. Resilient peer-topeer streaming [ R]. Microsoft Research,
2003.
The Principle And Realizing Of Cross
NAT Based On UDP
Ma Jintao
Beijing University of Posts and Telecommunications, Beijing (100876)
Abstract
This paper is mainly about the research of network transmission based on p2p protocol, resolve the
problem that data fail to be received when communicating between two equal clients at the gateway,
including the communication from two outer clients,two inner clients and also from outer client to
inner client. To resolve the problem, we work out an effective solution after intensive analysis. In this
paper,Choose the TrackerServer as the outer node to assist the client through NAT and then complete
the communication. With the fact, this solution has been successfully used on real application.
Keywords : P2P; Cross NAT; UDP