P2P通信
首先我们需要理解P2P的概念,P2P(peer to peer)通信即点对点通信,简单点讲就是两个端之间不需要借助一个中转服务,实现点对点的直接连接进行通信,打个比方:你有两部手机,你需要将一部手机里拍摄的照片传递给另一台手机,你有两种方式
- a) 借助云盘,你在两部手机上各安装一个百度云客户端,使用同一个账号登录,A手机上传图片到云端,B手机通过百度远客户端下载到本地;
- b) 打开两台手机的蓝牙,通过蓝牙将图片传输
其中b方式就是P2P传输,P2P的好处就是不需要一个服务端中继,在很多情况下,这样的中继服务器的开销比较大,耗费很多的资源,比如视频、音频通话;这时候如果使用P2P技术,就会节省很多的服务器开支。以视频通话为例,两个用户的手机想建立起P2P链接,会遇到很多的问题要解决,因为我们的手机绝大部分情况下是位于NAT后端,接下来讲下NAT
为什么要有NAT
因为公网IP是稀缺资源,不可能给每台手机都分配一个公网的IP地址,手机常常是分配了一个局域网的地址,NAPT通过端口多路复用技术,路由器通过端口映射实现局域网内的设备进行了访问外网资源的访问,这里不详细展开讲。
为什么会有NAT穿透技术
因为了有NAT,在P2P建立的路上就出现了几个障碍:
- 一台设备(包括手机/PC等)上有两套IP地址,一个局域网IP地址用于NAT内侧的设备间进行通信,一个映射的外网端口与外网主机进行通信,是路由器动态分配的设备自身并不知道这个映射的端口是多少
- 在两个NAT背后的设备即使知道对方的IP也无法进行点对点通信
这种情况下,就需要穿透技术了(俗称UDP打洞),通过一个中间服务辅助建立起两端的P2P通路,可以简单的理解为让NAT背后的通信两端知道对方的外网访问IP和动态分配的端口。
补充一点知识:大部分情况下,局域网使用锥形NAT(coneNAT),这个种结构的特点就是一个应用访问外网而分配的动态端口由路由器保持着,该应用的所有的对外网的访问都是用该动态分配的端口,但是还有一种对称NAT(symmetric NAT)结构,该架构下路由器为每次外网访问生成一个动态端口,这种情况是无法实现真正的P2P通信的,必须有一个中继服务器。
NAT网络结构
如何实现NAT穿透
首先RFC3489协议定义如何实现不同NAT后的client实现P2P,这是一个实现全功能的协议,后来新的RFC5389协议协议废除了RFC3489,在RFC3489 STUN协议的基础上,新增了对称网络架构下的P2P支持(使用一个中继服务),并定义该协议为一个工具协议,不提供完整的实现,具体的数据传输可以是UDP也可以是TCP(当然实际落地的还是UDP),ICE协议是使用RFC5389协议实现NAT穿透实现方案,比如github开源项目[coturn]全面支持这些RFC,后边将单独使用一篇文章将,基于coturn的使用,来实现NAT穿透。
网友评论