问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

P2P连接原理简述

创作时间:
作者:
@小白创作中心

P2P连接原理简述

引用
1
来源
1.
https://juejin.cn/post/7362309246556995623

在实现云真机操控的过程中,为了实现非USB模式下的连接,需要使用点对点通信技术进行音视频数据传输及其他数据交互。点对点通信允许直接在两个设备之间建立通信连接,而无需通过中间服务器。在实践的过程中选择了WebRTC进行,本文是对WebRTC实现底层P2P连接的原理简述。

NAT

NAT全称Network Address Translation,即网络地址转换,NAT是用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术,NAT一开始是为了解决IPv4地址短缺而开发的技术,而现在也作为安全防护的一种技术。

NAT工作原理

NAT设备位于私有网络和公用网络之间,以下是一个简单的工作方式示例:

  1. 内部主机发送数据包到外部网络时,数据包首先到达NAT设备。
  2. NAT设备根据配置规则,将源IP地址和端口号按规则进行转换
  3. NAT设备将转换后的数据包发送到外部网络。
  4. 外部网络返回响应数据包时,NAT设备将目的IP地址和端口号进行逆转换,再将数据包发送回内部网络。

NAT分类

要进一步理解NAT,首先就是了解NAT的分类。RFC2663把NAT分成了四类:传统NAT、双向NAT、两次NAT、多宿主NAT。由于最常见的就是传统NAT,这里只介绍传统NAT。传统NAT还可以分成两类:基本NAT(Basic NAT)、NAPT(Network Address Port Translation,网络地址端口转换)。

基本NAT

基本NAT就是只针对IP地址的“重命名”。由于基本NAT并不考虑更高层的协议(如TCP、),所以它只是实现了一个内部IP地址到公网IP地址的一一对应。如果内部IP数量更少,那么每个内部地址都能被映射到一个共有公网IP。如果公网IP数量少于内部IP的话,就不能保证同一时间每个内部设备都能访问外网了(可能分配不到公网IP)。

  • 静态NAT:一对一映射,将一个私有IP地址映射到一个公共IP地址。
  • 动态NAT:动态分配公共IP地址给私有IP地址,使得多个私有IP地址可以共享少量公共IP地址。

NAPT

NAPT也被称为“一对多”的NAT,或者叫PAT(Port Address Translations,端口地址转换)、地址超载(address overloading)。上节讲述的静态NAT和动态NAT都可归类为基础性NAT,它们仅将内网主机的私有IP地址一对一地转换为公网地址,并不将TCP/UDP端口信息进行转换。而NAPT不但会改变经过这个NAT设备的IP数据包的IP地址,还会改变数据包的TCP/UDP端口号。NAPT主要用于企业只有一个公网IP但是有多个业务系统需要被互联网访问的场景。NAPT普遍用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。

NAPT的主要优势在于,能够使用一个全球有效IP地址获得通用性。主要缺点在于其通信仅限于TCP或UDP。当所有通信都采用TCP或UDP,NAPT允许一台内部计算机访问多台外部计算机,并允许多台内部主机访问同一台外部计算机,相互之间不会发生冲突。

NAPT类型

在NAPT模式下,在rfc3489中,根据数据包过滤限制的不同点又可细分为几种不同的类型。

完全圆锥型

  • 一旦内部地址iAddr:iPort映射到外部地址eAddr:ePort,所有发自iAddr:iPort的数据包都经由eAddr:ePort向外发送。
  • 任意外部主机发送的数据包都能经由eAddr:ePort到达iAddr:iPort

受限圆锥形

  • 一旦内部地址iAddr:iPort映射到外部地址eAddr:ePort,所有发自iAddr:iPort的数据包都经由eAddr:ePort向外发送;
  • 但只有曾经接收到iAddr:iPort发送的数据包的外部主机nAddr:any发送的数据包,才能经由eAddr:ePort到达iAddr:iPort。(注意,这里的any指外部主机源端口不受限制。即受限圆锥型限制了可以发送数据包的外部主机的IP,但没有限制外部主机的端口号。)

端口受限型

  • 端口受限圆锥型在受限圆锥型的基础上,加上了对外部主机的端口号限制,即只有曾经接收到iAddr:iPort发送的数据包的外部主机nAddr:nPort发送的数据包,才能经由eAddr:ePort到达iAddr:iPort。

对称型

对称型的场景比较复杂一些。我们将内部地址iAddr:iPort与外部主机nAddr:nPort的地址和端口号组成一个四元组(iAddr, iPort, nAddr, nPort),对于四元组中的不同取值,NAT都会对应分配一个外部地址eAddr:ePort;并且也只有曾经收到内部主机数据的对应的外部主机,才能够把数据包发回

穿透服务/协议

不同NAT之间的穿透性

NAT之间连接有十种组合类型

  • 全锥型 全锥型 可打通
  • 全锥型 受限锥型 可打通
  • 全锥型 端口受限锥型 可打通
  • 全锥型 对称型 可打通
  • 受限锥型 受限锥型 可打通
  • 受限锥型 端口受限锥型 可打通
  • 受限锥型 对称型 可打通
  • 端口受限锥型 端口受限锥型 可打通
  • 端口受限锥型 对称型 无法打通
  • 对称型 对称型 无法打通

打洞流程示例

以下演示了,双方都位于不同的NAT服务之下的打洞流程。示例来自于:bford.info/pub/net/p2p…博文。

假设存在两台设备A和B,它们分别位于各自的NAT_A和NAT_B之后。此时A第一次尝试和B建立点对点连接,向NAT_B发送数据包;然而NAT_B经过查表发现,之前并没有A和B的映射(即A的请求无法被转发到B),于是来自A的数据包就会被丢弃。为了能绕过NAT的限制,我们需要借助一台公网上的服务器S做地址转发。如下图1所示:

  1. A与S建立连接(Session A-S),向S注册自己的内网地址10.0.0.1:4321;S会同时记录A在公网的地址155.99.25.11:62000。B与S建立连接(Session B-S),向S注册自己的内网地址10.1.1.3:4321;S会同时记录B在公网的地址138.76.29.7:31000。
  2. A向S发送请求,获取B的地址(Request Connection to B);S会同时把A的地址转发给B(Forward A’s Endpoints to B)。然后A和B都开始尝试相互向对方发送数据包。
  3. 当A向B第一次发送数据包时(Send to B at)会在NAT_A中产生映射(10.0.0.1:4321, 138.76.29.7:31000);此时NAT_B并没有A和B的映射记录,数据包仍然会被丢弃。
  4. 当B向A第一次发送数据包时(Send to A at)会在NAT_B中产生映射(10.1.1.3:4321, 155.99.25.11:62000);因为之前NAT_A已经创建了A和B的映射,所以B请求成功。
  5. 当A向B第二次发送数据包时,因为NAT_B也有了A和B的映射记录,所以A也请求成功。于是打洞完成,A和B可以直接建立点对点连接(Session A-B)。

真实的网络情况可能会更加复杂,比如需要在多层NAT之间打洞。以及目前业界习惯使用UDP协议进行打洞,而不是TCP协议。

ICE

ICE (Interactive Connectivity Establishment) 交互式连接建立协议框架 是一种集成式NAT穿透技术框架,这个框架能让交互双端找到对方,并基于双方的NAT类型建立连接。大致流程如下:

  1. TCP直接连接时,通过HTTP端口或HTTPS端口
  2. UDP直连时,使用STUN (Session Traversal Utilities for NAT) 服务器做地址转发
  3. 间接连接时,使用TURN (Traversal Using Relays around NAT) 服务器做流量中继。

ICE的交互流程中,探测双方的NAT类型是由专门的STUN或TURN服务服完成的。

STUN/TURN 协议

STUNSession Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间建立UDP通信。该协议由RFC 5389定义。

方案

STUN使用下列的算法(取自RFC 3489)来发现NAT中间件以及防火墙(firewalls):

TURN

TURN服务是为了解决对称型NAT无法被穿越的问题,此时需要使用TURN服务来转发流量。

位于对称型NAT之后的客户端需要先在TURN服务器上创建连接,然后告诉所有对端设备发包到这个服务器上,然后服务器再把包转发给这个客户端。并且TURN服务器通常是和STUN服务器成对出现的,当STUN判断NAT为对称型时,就会交由TURN处理。

开源实现

在具体实践过程中,一般不需要我们自己实现穿透服务框架,而是直接使用开源技术,比如coturn

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号