搞懂 P2P 技术 (1) - P2P x IPv4 x NAT

前言

之前工作上遇到需要将自家 IPCam 与 iOS/Android 手机做 P2P 串流影音,研究了许多有关 P2P 的技术,因此想写一系列有关 P2P 技术的文章.

P2P

为什麽会需要 P2P

在了解一门技术前,我们先来看看为什麽会需要这门技术,这门技术是为了解决什麽问题

Centralized vs Decentralized vs Distributed

中心化网路 (Centralized)

p2p_centralized

所有 client 都连接到同一台 Server,Server 拥有所有 client 的数据讯息

可以想成是国家央行发行货币,所有人的钱都来自国家央行

  • 优点
    • 部署简单好维护
    • 集中管理数据
  • 缺点
    • 安全及隐私风险 (中心 server 遭破解串改,全部都会受影响)
    • 离 Server 较远的 client 拿资料的时间会更长
    • server 一但故障,其他 client 都不可使用

去中心化网路 (Decentralized)

p2p_decentralized

顾名思义就是不只有一台 server,会有多台 server ,所以当一台或多台 server 故障时,client 还是可以继续从其他 server 存取数据

可以想成是很多银行可以存钱领钱,有美银、高盛、摩根、富国等等银行,且每家都能互相转钱

  • 优点
    • 中心化网路有较高的容错率 (因为有多个 server)
    • 更好的性能 (在一些用户多的地区新增节点)
  • 缺点
    • 安全及隐私风险 (与中心化一样)
    • 较高维护成本 (系统设计较复杂多变)
    • 较难部署

分布式网路 (Distributed)

p2p_distributed

类似 Decentralized , 没有唯一的中心 server,用户间可以共享资料所有权,消除了中心 server 的概念,如此可以避免中心 server 故障导致所有 user 无法使用的问题,internet 就是一个分布式网路,p2p 也属於此类

可以想成是目前的区块链比特币,并没有像央银银行的角色,货币是由链上的所有主机帮你做验证交易纪录等等,必须要串改超过 51% 以上的主机才能成功串改资讯,较安全

  • 优点
    • 极高的容错率
    • 资料透明安全,不易遭串改
    • 资源共享
  • 缺点
    • 较高维护成本 (系统设计较复杂多变)
    • 较难部署

三种网路方式皆有各自优点,可以依照遇到的情况去设计.

在 IoT 应用中,假如你要控制家中的 IPCam,就会有以下两种做法

  • 中心化方式为透过 Server 转发 command 给 IPCam
    • p2p_centralized_connect
    • 这种作法的优点在於好部署修改,有新增功能时只要 Server 改完部署,其他设备就可更新支援此功能,缺点就是 Server 只要故障就完全不能控制 IoT 装置,且 Server 的硬体效能要很好才足以应对庞大的 client,需要每月一笔租 Server 机器及流量的费用
  • 分布式方式为不透过 Server 直接向 IPCam 下达指令
    • p2p_distributed_connect
    • 这种作法的优点在於不需要每月一笔租 server 机器及流量的费用,不会有 Server 故障导致无法操作 IoT 装置的问题,硬体效能也不需要很好,缺点就是部署程序变得复杂,因为不是每个人都会定期更新手机 app 及 IoT Firmware,还有程序码会变得复杂,需要处理 p2p tunnel 断线重新 p2p 流程,也叫容易发生断线重连,e.g. 手机由 4G/5G 环境走到有 Wifi 环境,网卡自动切换成 Wifi 就会导致断线需重新 p2p.

疑问 : 分布式方式在复杂的 Internet 下,如何让手机与 IoT 装置沟通,就是接下来我们要讲解 P2P 技术的部分

什麽是 P2P (Peer to Peer)

P2P 是一种无中心化的技术,每一个 client 既是 client 也是 server,在每台主机皆存在共享的数据,以此降低资料遗失安全性等等的风险.

IPv4

Internet 能够如此成功进入人类的生活中,IP 的设计可以说是非常重要的一个基础,可以把 IP 想成你在 Internet 世界里的地址,任何人要寄信给你都需要知道你的地址才能与你通信,IPv4 的设计就是希望可以容纳大家上网,IPv4 总共有 4 * 8(bits) = 32 bits,大约为 43 亿,在当时认为已经非常足够使用,但如今在 Internet 高速发展下,IPv4 已经不够用了,所以网路专家一方面寻找 IPv4 替代方案(也就是 IPv6),一方面研究如何减缓 IPv4 耗尽的问题,於是 NAT 诞生了.

NAT (Network Address Translation)

就如同字面上的意思,他会在私有网域及公有网域之间做将封包的 IP 做转换,根据 RFC1918 保留了三段 IP 地址给内部网路做使用,10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255,这些地址在公有网路上是没有意义的,且不需像 IANA 做申请,如此就大大增加了 IPv4 环境可以容纳的上网装置,因为一个组织只需要一个公有 IP 即可让所有内部装置连上 Internet.

p2p_nat_1

但是 NAT 这样的设计是有缺点的,外部网路主机无法直接与在 NAT 路由器内的内网主机进行连线

一般没有 NAT 情况下,Internet 上的两台主机只要知道彼此 IP 就能进行通讯

p2p_nat_2

在有一方於 NAT 情况下,外部网路主机 B 要与内部网路主机 A 通讯,就会遇到 NAT 不知道要将来自 B 的封包转给哪一台内部主机

p2p_nat_3

除非 A 已经先访问过 B 主机的情况下,NAT 会将 A 的转址纪录在 mapping table 中,之後由 B 发给 A 的封包,NAT 就会透过 mapping table 转址将封包正确转发给 A

p2p_nat_4

但如果两台主机皆在 NAT 下,此时不管是由 A 或 B 发起 (A → B 或 B → A),都无法连接到对方,因为两边的 mapping table 都是空的没有纪录

p2p_nat_5

此时就必须要由任一方先发起封包,假设由 A 发起 (1),此时 A 的 NAT mapping table 会留下 A 的转换 IP (2),但封包到了 B 的 NAT 时,因 B 的 NAT mapping table 为空,所以会先失败 (3),再来由 B 发起封包给 A (4),会在 B NAT mapping table 留下 B 的转换 IP (5),封包到了 A NAT 後 (6),因 A 的 NAT mapping table 存在 A 的 IP,所以封包可以顺利到达 A (7),A 在发送封包到 B (8),此时双方的 NAT mapping table 皆有纪录(9, 10),在 NAT 里的 Client 就能顺利相互通讯,此时 P2P 就成功了,反之亦然

p2p_nat_6

NAT 类型

Full-cone NAT (完全锥型 NAT)

  • 一旦内部位址(iAddr:iPort)对映到外部位址(eAddr:ePort),所有发自 iAddr:iPort 的封包都经由 eAddr:ePort 向外传送。
  • 任意外部主机都能经由发送封包给 eAddr:ePort 到达 iAddr:iPort。

p2p_full_cone_nat

Restricted cone NAT (受限锥型 NAT)

  • 一旦内部位址(iAddr:iPort)对映到外部位址(eAddr:ePort),所有发自 iAddr:iPort 的封包都经由 eAddr:ePort 向外传送。
  • 唯 iAddr:iPort 曾经发送封包到外部主机(nAddr:any),外部主机才能经由发送封包给 eAddr:ePort 到达 iAddr:iPort。(注:any 指外部主机源埠不受限制。)

p2p_full_cone_nat

Port-Restricted cone NAT (端口受限锥型 NAT)

类似受限制锥形 NAT(Restricted cone NAT),但是还有埠限制。

  • 一旦内部位址(iAddr:iPort)对映到外部位址(eAddr:ePort),所有发自 iAddr:iPort 的封包都经由 eAddr:ePort 向外传送。
  • 在受限圆锥型 NAT 基础上增加了外部主机源埠必须是固定的。

p2p_full_cone_nat

Symmetric NAT (对称型 NAT)

  • 每一个来自相同内部 IP 与埠,到一个特定目的地 IP 和埠的请求,都对映到一个独特的外部 IP 和埠。
    同一内部 IP 与埠发到不同的目的地和埠的资讯包,都使用不同的对映
  • 只有曾经收到过内部主机资料的外部主机,才能够把封包发回

p2p_full_cone_nat

Symmetric NAT 无法实现 P2P ,原因就在於对称型每次的请求都会对应到不同的外部 IP 和 Port

结论

有关 P2P、IPv4、NAT 就先介绍到此,下一篇会介绍实现 P2P 需要哪些协定工具,STUN、TURN、ICE 是什麽

参考资源


<<:  【JavaScript】很适合今天的NaN

>>:  搞懂 P2P 技术 (2) - STUN x TURN x ICE

[D01]试用期从零开始的k8s

前言 写在前面 这是一个记录自己成长的三十天挑战 进入公司原本说要做 data 结果进来之後才发现很...

Day36 | WebView Snippets管理页面设计与开发

哈罗,大家好,我是韦恩。今天的文章是系列文的第三十六篇。我们会把完整snippet的元件与routi...

[DAY 09]深度学习模型实作 -- 前导

前言 HIYO!又是阿峻我啦~ 再经过之前的环境处理系列之後,我们就要来开始实作几个常见的 Deep...

Day9 Pandas模组一

今天的影片内容为介绍具有强大功能的Pandas模组(对...熊猫模组) 利用这个模组,可以很方便的执...

大脑如何精准学习 (2) 积极主动参与/好奇心

终於读到我很想读的段落了。 积极主动参与 active engagement - 定义 这里讲的是「...