丁文静优秀作者
原创内容 来源:小居数码网 时间:2024-07-30 11:31:01 阅读() 收藏:46 分享:70 爆
导读:您正在阅读的是关于【数码知识】的问题,本文由科普作家协会,生活小能手,著名生活达人等整理监督编写。本文有2686个文字,大小约为12KB,预计阅读时间7分钟。
0.引言
本篇文章就主要讲解p2p的原理和实现,对于WebRtc音视频通话中的"打洞"作了详细的解释。为了更好地理解本篇文章的应用背景,可以参考前面的文章,文章列表如下:
WebRTC基础原理和项目经验泛讲(1)
webrtc之一对一通话原理(1)
WebRTC基础原理和项目经验泛讲(2)
webrtc之一对一通话实战与原理(2)
webrtc之一对一通话实战与原理(3)
详细讲解webrtc原理(1)
WebRtC音视频通话之AppRTC实战(2)
WebRtC音视频通话之AppRTC实战(1)
手把手实现WebRtc一对一视频通话实战(7)
webrtc实战打开摄像头和麦克风
手把手实现WebRtc一对一视频通话实战(3)
手把手实现WebRtc一对一视频通话实战(2)
手把手实现WebRtc一对一视频通话实战(1)
手把手实现WebRtc一对一视频通话实战(6)
手把手实现WebRtc一对一视频通话实战(5)
手把手实现WebRtc一对一视频通话实战(4)
手把手实现WebRtc一对一视频通话实战(8)
WebSocket基础讲解(2)
websocket聊天实战(1)
websocket聊天实战(4)之js补充
WebSocket基础讲解(1)
websocket聊天实战(3)
1.p2p简介
p2p:Peer to Peer,点对点的意思,客户端与客户端直接通信,在通信的过程中,不需要服务器的参与,就是去中心化。不论常用的 B/S 还是 C/S,都是一种星型结构,而中心化节点正是服务器,每一个客户端只能与服务器通信。如果客户端与客户端之间需要通信,必须要得通过服务器进行路由处理,才能把数据路由到另一个客户端。在通信过程中,服务器与客户端是充当着不同角色的,不同功能的。服务器是对所有客户端提供服务的,这样的通信网络,被称为中心化网络。如下图所示:
我们常见的一些通信方式,客户端之间通信都是需要有服务器全程参与,客户端与服务器通信时,中间需要经过网关(路由)。网关就是一个数据的出入,即可以是交换机,也可以是路由器。中间可能要经过很多个路由器,最终到达公网的服务器。
2.局域网内部到达公网服务器的数据流程是怎么样?
局域网不同的机器,不同的IP,怎样到达公网的服务器,这就需要NAT(Network Address Transform)网络地址转换。每个局域网的IP都会映射到相应的网关的IP上(形成一个子网),最终形成和公网服务器的IP上。所以对于外界而言,就是公网的IP可以代表局域网的某一个客户端,局域网的收发数据就是使用的公网的IP,形成一种映射关系。NAT就是解决ipv4地址不足,使用IPV4:端口号去解决这个问题,IPV4需要网络穿透,俗称"打洞"。如果都是ipv6地址,那就不需要使用NAT,没必要穿透,每一个设备都有一个实实在在IP地址。前面所说的映射一定是网络进程被映射了。局域网的地址和公网服务器的地址,所经过的每一个网关都会有一个映射表,这个映射表一般是不对外公开。网关就是做穿透最核心的。每个网关都是用IPV4地址:端口去映射到客户端的网络进程中,那两个客户端直接找到相应的网关的IPV4地址:端口,就可以发送数据,这样就能达到"打洞"效果。那从这里可以看出,在"打洞"的过程中,服务器是存在的,当"打洞"完成后,在端到端,传输数据的过程中,就不需要服务器参与了,此时就算服务器挂掉了,端到端也是可以正常通信。
3.客户端与客户端能够直接通信,为什么还要启动服务器?
存储NAT映射表,帮助找到对方,找到对方的网关IP地址和端口号。
4.为什么要用UDP,TCP可以吗?
TCP是基于连接的,TCP是可以的,但是设计起来会非常复杂(滑动窗口,确认机制等)。UDP的好处就是只需要知道对端的IP地址和端口就行了,不需要建立连接。
5.快播是怎样做的p2p呢?
就是把你搜索的关键字和对应的种子做了一个映射关系,这样快播播放器就会拿到这个种子,就可以去找到对应的客户端,去下载资源。快播的服务器是不会存储资源,也就是只做了一个映射的关系,不生产内容,只告诉你资源的地址。快播的技术虽然很厉害,但是它的内容不可控,导致后面快播被查。
注意:也不是所有的网关都能被穿透,这与NAT的类型是有关系。如下类型:
6.NAT类型
这是一个树型结构,是一个互补的关系。NAT主要就分为对称NAT、完全锥形NAT、端口限制锥形NAT、IP限制锥形NAT。这4种类型,由各大路由器或交换机厂商就已经决定了。
(1)完全锥形NAT:对于外面的公网来说,网关都可以映射到内部局域网的机器上,没有任何限制。如家庭局域网可能会选择完全锥形NAT。
(2)限制锥形NAT:网关只允许部分的公网IP:端口映射到内部局域网的机器上。端口或IP进行限制。访问不同外网设备只有一条链路(局域网的机器IP:端口是一样,经过的网关的IP:端口是一样,目的地址不一样)。限制是限制外面发数据进来。如家庭局域网可能会选择限制锥形NAT。
(3)端口限制锥形NAT:网关只允许部分的公网IP:端口映射到内部局域网的机器上和访问。主要是对公网的端口进行限制。
(4)IP限制锥形NAT:网关只允许部分的公网IP:端口映射到内部局域网的机器上和访问。主要是对公网的IP进行限制。
(5)对称NAT:每个局域网的机器向外发数据,如果发送到不同的网关上,都会映射不同的IP地址:端口。访问不同外网设备也就说会存在多条(如2条)链路。映射不同的IP地址:端口,相互不会影响。对成NAT的穿透是非常复杂。如大型电信级设备,可能会选择对称NAT。
注意:路由器或交换机主要是根据不同的安全级别来去设置不同的NAT类型。
7.网络模式解释
桥接模式:虚拟机和物理机形成一个子网,接入到同一个路由器上。在同一个网段上。
NAT模式:把物理机当做一个网关,物理机是虚拟机的网关,物理机的IP映射到虚拟机上,形成一个子网。虚拟机虚拟出来的网络。
仅主机模式:就是虚拟机仅仅允许物理机访问。
8.如何识别网关的NAT?
本质就是给不同的IP发送消息,判断收到回复的地址。根据不同NAT的特点,去识别不同的NAT类型。
8.1对称NAT检测:局域网的客户端给两个不同的服务器(IP:端口不一样)发送数据,两个服务器能够检测到网关的IP:端口。再把服务器1收到地址发送给服务器2,对比服务器1和服务器2收到的地址是否一样,如果一样,那就不是对称NAT,就是锥形NAT,如果不一样,那就是对称NAT。如下图所示:
8.2完全锥形NAT检测:找一台完全没有经过网关给服务器发送过数据的局域网机器,如果服务器能够收到,那就是完全锥形NAT,否则就是限制锥形NAT。如下图所示:
具体分为以下四步:
(1)局域网客户端经过网关,发送数据给服务器1。
(2)服务器1拿到这条记录,告诉服务器2。
(3)服务器2拿到这条数据后,给网关发送数据。
(4)如果第3步成功了,客户端收到了数据。客户端经过网关再给服务器1发送数据。如果服务器1能够收到数据,那就说明是完全锥形NAT,如果多试几次,没有收到那就是限制锥形NAT。
8.3 IP限制锥形NAT检测:如果上面已经检测出限制锥形NAT,查看是否为IP限制锥形NAT检测。这里就只需要局域网客户端经过网关往服务器的同一个IP,不同端口发送数据。如果不同端口能够收到数据,就说明是IP限制,如果不能收到数据,就说明是端口限制。如下图所示:
注意:在代码层面,是没办法修改限制的IP和port,这个都是网关去管控。在打洞之前,只要服务器知道所有网关的类型就行了,所有网关的类型由服务器集中存储,不需要知道对端的网关类型。
9.不同网关穿透组合
不同局域网的客户端,不同的网关,在做“打洞”时,理论上一共是有16种穿透方案。由于A->B,B->A,只要有一端通了就行,那就只有8种了。
如果是一个网关的方案,那一端就是完全锥形NAT。不管怎样另外一端网关都是完全可以穿透。这样的话,又少了3种,还有另外5种。
由于IP限制和端口限制本质上区别并不是很大,又会少2种,那最后就只剩下3种。
经过上面的推算,那就会只有以下3种情况。如下所示:
(1)一端为完全锥形NAT。
(2)两端都是限制锥形NAT。
(3)两端都是对称NAT或者是一个限制锥形NAT与对称NAT。
10.如何穿透NAT
10.1 NAT1为完全锥形NAT,NAT2为任何一种NAT模式,过程如下所示:
(1)客户端1经过网关给服务器发送数据,需要穿透客户端2,。
(2)服务器经过网关2告诉(客户端1对应的网关IP:端口)客户端2,客户端2拿到客户端1对应的网关IP:端口,就可以“打洞”。
10.2 NAT1为限制锥形NAT,NAT2为限制锥形NAT,过程如下所示:
(1)客户端1经过网关1,告诉服务器,需要穿透那个客户端。
(2)服务端告诉经过网关2,告诉客户端2。
(3)由客户端2经过网关2,发送给网关1,最终由客户端1接收数据。由于是限制锥形NAT。这一步是无法发送过去。
(4)由于第3步是过不去,客户端2经过网关2,告诉服务器“我给客户端1端发送了数据,但是发不过去”,请客户端1立即给我发送数据。
(5)这时候,服务器经过网关1,最后通知客户端1。
(6)客户端1经过网关1,直接通过网关2,给客户端2发送数据就会成功。
有人对第6步有个疑问,由于都是限制锥形NAT,为什么能够成功呢?
因为第3步,客户端2给客户端1发送过,有历史记录。网关2认为这是网关1给的回复,那就会成功。
10.3 NAT1为限制锥形NAT,NAT2为对称NAT,过程如下所示:
如果是NAT2为对称NAT,会多生成一条不一样的记录,那上面所说的第6步,就不会认为是回复,就不可能成功。那该怎么做呢?如下所示:
在上面的第4步的时候,服务器再新开一个端口,比如9801。这里就更新下,给9801的端口去发送数据。也就是给服务器的另外一个IP地址和端口发送数据。这个时候服务器和网关2会检测到这条链路信息。由于步骤3和步骤4,之间信息间隔时间很短,这个可能会被执行多次,有多个端口。这个时候NA2告诉NAT1的这些信息,NAT1会逐个去试一试,是一种概率性的测试,这种概率就不太可能100%,这个就是所说的成功率,那提高成功率,就是一项难搞的技术了。
11.实战演练
启动一个服务,
启动两个客户端
这个代码运行实际的效果是,前面“打洞”成功后,后面就可以直接p2p通信,完全不依赖服务器转发。后面有机会再分析。
12.总结
本篇文章关于p2p实现原理,NAT类型,如何穿透作了详细的解释,对于学习WebRtc具有很好的帮助。欢迎关注,转发,收藏,点赞。
上面就是小居数码小编今天给大家介绍的关于(P2p原理)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。
94%的朋友还想知道的:
(592)个朋友认为回复得到帮助。
部分文章信息来源于以及网友投稿,转载请说明出处。
本文标题:p2p技术原理简单理解(P2p原理):http://sjzlt.cn/shuma/152820.html