Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >P2P通信原理

P2P通信原理

作者头像
naget
发布于 2020-05-07 15:52:15
发布于 2020-05-07 15:52:15
4.8K0
举报
文章被收录于专栏:VegoutVegout

P2P 就是端到端

我发一条微信给你,这不是 P2P。因为消息并不是直接从我手机发送到你的手机,而是从我手机先发送到微信的服务器,服务器再转发到你的手机上(当然,转发给你之前,还会把数据存到服务器),像下边这样:

P2P 是这样:

P2P 技术要解决的问题

目前使用的终端设备(如手机),绝大部分都仅仅拥有特定网络下的内网 IP,而处在不同内网环境中的设备并不能够使用内网 IP 直接进行通信。如何通过一定的手段让这两个处在不同内网环境的设备进行直接通信呢?

P2P 的知识点

我们的终端设备(比如手机),一定是存在于某个内网环境下边的,当设备与内网之外的其他设备进行通信时,需要将内网 IP 转换为一个可以被全球任意设备访问到的公网 IP,这种技术叫做 NAT,全称是 Network Address Translation,即网络地址转换。

根据转换方式的不同,出现了不同的 NAT,理论上有基本 NAT,也有一对多 NAT,但是现实中基本都是一对多 NAT,根据内网设备与外网进行通信时不同的映射规则,又分为以下几种类型:

类型

阐述

锥型 NAT(Full-cone NAT)

内网 ip1:port1 会映射到公网 ip2:port2,ip1:port1 发往外网的包都将通过 ip2:port2 发出;外部任何 ip3:port3 都可以通过发送数据包给 ip2:port2 从而与 ip1:port1 进行通信。

(地址)限制型锥型 NAT((Address)-restricted-cone NAT)

内网 ip1:port1 会映射到 ip2:port2,ip1:port1 发往外网的包都将通过 ip2:port2 发出;外部只有收到过 ip2:port2 数据包的 ip3 才可以发送数据包给 ip2:port2 从而与 ip1:port1 进行通信。

端口限制型锥型 NAT(Port-restricted cone NAT)

内网 ip1:port1 会映射到 ip2:port2,ip1:port1 任何发往外网的包都将通过 ip2:port2 发出;外部只有收到过 ip2:port2 数据包的 ip3:port3 才可以发送数据包给 ip2:port2 从而与 ip1:port1 进行通信。

对称性 NAT(Symmetric NAT)

内网 ip1:port1 任何一个发往外网 ip3:port3 的请求,都将使用独有的公网 ip2:port2;外部只有收到过 ip1:port1 数据包的服务才能返回数据。

总的来说,我们程序发出的包有源地址和源端口,经过 NAT 之后,映射出的公网地址和端口是否会随着目的地址和目的端口的变化而变化,决定了它是锥型还是对称型。这句话有点拗口,但我觉得说的很清楚。同时,只有锥型 NAT 才能进行 P2P,原因是由 P2P 连接的建立过程决定的。

P2P 连接建立过程

P2P 连接的建立首先需要一个拥有公网 IP 的中间服务器 S,两个结点 P1 和 P2。

  1. 结点 P1 和 P2 分别发送数据包给 S,数据包在经过 NAT 时,ip 和 port 进行转换,ip 转换为公网 ip,port 是否转换需要看 NAT 的具体实现。S 拿到转换后的 P1 和 P2 的地址。
  2. S 将 P1 的地址发给 P2,将 P2 的地址发给 P1。这里的地址都是 NAT 地址。
  3. P1 收到 P2 地址后,尝试建立连接,首先发送消息包给 P2(其实是 P2 的 NAT),P2 也同样这样做,在两个结点都收到对方的消息包之后,就可以进行通信了。这个过程也叫做打洞。

之所以需要有打洞这个过程,是因为,NAT 会丢弃自己不认识的地址包,让 NAT 认识它的方法,就是发出一个到这个地址的数据包。比如让 A 认识 B,那就让 A 发一个数据包给 B,不然,B 发给 A 的数据包就会被丢弃。所以打洞的过程不是为了收到对方的数据包,而是为了发送数据包给对方,从而认识对方。这样,之后的通信就可以正常进行了。

刚才之所以说只有锥型 NAT 才可以进行 P2P,原因在第三步可以看出来。结点进行打洞的地址,是通过服务器拿到的,而这个地址在对称型 NAT 的情况下,并不是一定的,可能会随时发生变化。也就是说,P1 与服务器通信使用的 NAT 地址和 P2 与 P1 通信使用的 NAT 地址是不同的(一般情况都是端口不同)。甚至 P1 与服务器通信使用的 NAT 地址都在不断的发生变化。这样让我们没办法拿到隐藏在 NAT 后边内网设备的 NAT 入口,也就没办法进行 P2P 通信了。

P2P 也用到了一个服务器,跟微信一样。但是不同的是,P2P 中的服务器只作为结点地址的中转站,而微信的服务器是数据的聚宝盆。P2P 让我们的数据仅通过 P2P 连接发送,而不经过任何第三方的服务器。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Vegout 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
P2P技术详解(三):P2P中的NAT穿越(打洞)方案详解(进阶分析篇)
接本系列的上一篇《P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解(基本原理篇)》,本篇将深入分析各种NAT穿越(打洞)方案的技术实现原理和数据交互过程,希望能助你透彻理解它们。
JackJiang
2020/12/14
6.4K0
NAT 穿透原理浅浅说(一)
杨明亮
2017/09/20
24.5K3
NAT 穿透原理浅浅说(一)
NAT穿透技术详解
传统的C/S结构是每个客户端均知道中心化的SERVER,由客户端主动与SERVER进行通信。
tigerzhou
2018/07/20
2.6K0
NAT穿透技术详解
golang nat 打洞
首先介绍下基础nat的四种方式,在进行nat转换的时候,我们在网关路由表上记录了映射关系,这个映射关系可以用六元祖表示
golangLeetcode
2022/08/03
1.7K0
P2P通信原理与实现
当今互联网到处存在着一些中间件(Middle Boxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信. 这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还有其他中间件如防火墙阻挡了链接的建立. 目前部署的中间件多都是在C/S架构上设计的,其中相对隐匿的客户机主动向周知的服务端(拥有静态IP地址和DNS名称)发起链接请求. 大多数中间件实现了一种非对称的通讯模型,即内网中的主机可以初始化对外的链接,而外网的主机却不能初始化对内网的链接, 除非经过中间件管理员特殊配置.
evilpan
2023/02/12
1.5K0
陌陌移动端直播P2P技术
直播业务的主要成本就表现在于带宽上,尤其是在用户要求日益提高的未来,带宽带来的成本问题会越来越大。本文来自陌陌流媒体高级研发工程师白松灵在LiveVideoStack线上分享的演讲,详细剖析如何仅仅借
LiveVideoStack
2020/04/21
1.9K0
陌陌移动端直播P2P技术
腾讯云PCDN:从P2P到万物互联服务框架
大家好,我是腾讯云张鹏,从2014年开始一直深耕P2P技术,攻克P2P技术难题。在过去几年中,腾讯云XP2P技术已在多个产品线落地并经受了大流量阅兵直播、赛事直播等考验,今天我将为大家着重讲解腾讯云P2P技术在网络穿透、网络传输以及网络拓扑组建等方面内容。
LiveVideoStack
2019/09/12
3.3K0
NAT 原理以及 UDP 穿透
一直对 P2P 和 NAT 穿透的知识比较感兴趣,正巧最近看到一篇不需要第三方服务器实现 NAT 穿透的项目(https://github.com/samyk/pwnat),经过学习研究后发现这个项目也有很多局限性;借此机会,学习了下 NAT 原理和 UDP 穿透的实现。
Seebug漏洞平台
2021/04/23
3.7K0
NAT 原理以及 UDP 穿透
STUN 原理理解「建议收藏」
Simple Traversal of UDP over NATs, NAT的UDP的简单穿越,是一种网络协议。是客户机-服务器的一种协议,由RFC 3489 定义。该协议定义了一些消息格式,大体上分为Request/Response。这个协议主要作用就是可以用来在两个处于NAT路由器之后的主机之间建立UDP通信。它允许位于NAT后的客户端找出自己的公网地址,确定自己位于的NAT是哪种类型,以及NAT为这个客户端的本地端口所绑定的对外端口。
全栈程序员站长
2022/09/13
3K0
STUN 原理理解「建议收藏」
P2P通信标准协议(二)之TURN
上一篇P2P通信标准协议(一)介绍了在NAT上进行端口绑定的通用规则,应用程序可以根据这个协议来设计网络以外的通信。但是,STUN/RFC5389协议里能处理的也只有市面上大多数的Cone NAT(关于NAT类型可以参照P2P通信原理与实现),对于Symmetric NAT,传统的P2P打洞方法是不适用的。因此为了保证通信能够建立,我们可以在没办法的情况下用保证成功的中继方法(Relaying),虽然使用中继会对服务器负担加重,而且也算不上P2P,但是至少保证了最坏情况下信道的通畅,从而不至于受NAT类型的限制。TURN/RFC5766就是为此目的而进行的拓展。
evilpan
2023/02/12
1.5K0
P2P通信标准协议(二)之TURN
技术解码 | WebRTC ICE 模块剖析
ICE全称 Interactive Connectivity Establishment ——交互式连通建设形式。 ICE背后的基本思想如下:每个代理都有各种各样的Candidate Transport 地址(IP地址和端口的组合,特定的传输协议(在此中始终为UDP规范))。它可以用来与其他代理进行通信。 这些地址包括: 直接连接的网络接口上的传输地址 ——公网IP直连 NAT公共端的转换传输地址  ——内网NAT映射 从TURN服务器分配的传输地址 ——中继模式 对于1 公网IP直连这类情
腾讯云音视频
2021/08/04
4.1K0
c# 实现p2p文件分享与传输系统
c#实现P2P文件分享与传输系统  二、设计 - 续(NAT穿透)   首先要抱歉,因为这些日子较忙,没有写文章,这个系列拖了很久,现在开始继续。  上一篇文章介绍了p2p系统Tracker Server和Peer,以及文件描述符,本篇接着讲NAT Server的部分。由于p2p网络中使用udp报文,所以只介绍udp穿透。 1. NAT类型 NAT(Network Address Translation, 网络地址转换),是指在IP包通过路由设备时,修改其IP地址信息的技术。一般应用是,通过将内网地址转
hbstream
2018/05/11
2.1K1
Web前端WebRTC 攻略(五) NAT 穿越与 ICE
WebRTC 进行端对端进行实时音视频通讯时,常常一方或者双方都是隐藏在 NAT 之后的内网地址。ICE 则用于寻找一条传输数据通道连接。本文介绍了 NAT 穿越和 ICE 框架的基础知识和主要步骤。 我们知道使用 WebRTC 进行端对端进行实时音视频通讯时,WebRTC 本身是基于点对点(Peer-to-Peer)连接的,最便捷的方式就是通话的双方通过 IP 直连,摆脱原始的直播服务器中转的方式。 如果连接双方都是公网地址,则可以直接访问到对方,从而建立连接。但是在现实的应用场景中,大部分情况下其中一方
用户1097444
2022/06/29
2.7K0
Web前端WebRTC 攻略(五) NAT 穿越与 ICE
WebP2P 让你的直播免流
你在下载的时候,有没有体验过 P2P 下载,能够让你的网速从 10KB 直接提升到 10MB? 你在企业内传输文件的时候,有没有体验过文件秒传? 你在看直播的时候,想不想用别人的流量看直播呢? ... 能做到上面这些场景的技术,叫做 P2P。P2P 技术中,最出名的叫做 WebRTC。WebRTC 是一个含金量非常高的技术。做好的话你可以养活一家公司,做不好,那就只能是一个 demo。 WebRTC 虽然能做很多事,但是并不是所有场景都适合。最大的使用场景是 两个终端在同一个 NAT 内,简单来说,都在一个
villainhr
2018/07/03
2.2K0
内网隧道搭建总结(一)
该操作在vm虚拟机中完成,提前安装了Windows7、kali linux、Windows server2008。
乌鸦安全
2021/10/26
2.2K0
内网隧道搭建总结(一)
网络协议分析03(zhuan 程震老师 用于期末复习)
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 第三章 ARP与ICMP
20岁爱吃必胜客
2022/11/13
5190
网络协议分析03(zhuan 程震老师 用于期末复习)
MongoDB 第一期 :集群搭建
本文主要介绍了如何基于MongoDB搭建高可用集群,包括集群的搭建步骤、配置文件参数解析、集群的监控方式以及如何提高集群的可用性。通过实际例子讲解了如何快速搭建一个高可用的MongoDB集群。
迪B哥
2017/07/06
2K0
MongoDB 第一期 :集群搭建
golang 源码分析(27)p2p udp 打洞
我们平常使用的一般都为私有ip,但是私有ip之间是不能直接通信的,如果要进行通信只能通过公网上的服务器进行数据的转发,难道我们每次发送数据都要经过公网上的服务器转发吗?也不是不可以,但是服务器的承受能力就会大大增加。此时就需要我们的打洞技术的出现了,打洞的出现解决了私有ip之间直接通信的问题(还是需要经过一次公网服务器)
golangLeetcode
2022/08/02
8811
P2P通信标准协议(一)之STUN
前一段时间在P2P通信原理与实现中介绍了P2P打洞的基本原理和方法,我们可以根据其原理为自己的网络程序设计一套通信规则,当然如果这套程序只有自己在使用是没什么问题的。可是在现实生活中,我们的程序往往还需要和第三方的协议(如SDP,SIP)进行对接,因此使用标准化的通用规则来进行P2P链接建立是很有必要的。本文就来介绍一下当前主要应用于P2P通信的几个标准协议,主要有STUN/RFC3489,STUN/RFC5389,TURN/RFC5766以及ICE/RFC5245。
evilpan
2023/02/12
1.8K0
WebRTC NAT穿越原理
NAT虽然带来了不少的好处,但是也增加了端对端直接通信的难度,NAT使得端对端的通信方式在某些场景下只能通过中转服务器进行交互。
码农帮派
2021/01/12
9530
WebRTC NAT穿越原理
相关推荐
P2P技术详解(三):P2P中的NAT穿越(打洞)方案详解(进阶分析篇)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档