乐趣区

关于p2p:p2p之网络穿透NATNAT穿透的原理

1.p2p 是什么?

p2p 是对等网络(peer-to-peer networking)其能够定义为:端对端的资源共享,每一端即可是服务端,也能够是客户端。既能够是资源的提供者,也能够是资源的共享者。

传统 C / S 模型须要实现端和端的资源共享,须要将资源上传到直达服务器。另外一端再去直达服务器下载,如下图:

传统 CS 架构,客户端 1 和客户端 2 之间是无间接交互.png

而 P2P 则不须要将资源上传到服务器,它是端对端传输,每一个端既能够是服务器,也能够是客户端

p2p 架构,无需直达服务器.png

劣势:实时性最高,流量少,更加平安。在视频直播,在线教育,视频安防行业用的比拟多 劣势:一旦进行 p2p 传输之后,用户之间的内容将无奈监管,节约用户带宽,频繁进行读写磁盘

客户端 1 和客户端 2 这样交互是 p2p 最现实的状况 图中客户端 1 和客户端 2 间接连贯,如果他们处于两个不同的内网呢?

2.NAT 是什么?

NAT 俗称网络地址转换,它是一种把外部公有网络地址(IP 地址)转换成公网网络 IP 地址的技术。比方咱们电脑外面网卡地址是 192.168.1.100,然而咱们再百度搜寻“IP”却显示 220.112.224.53,这就是 NAT 的性能。

**NAT 次要是部署在路由器或者交换机上。
**

为什么须要 NAT?

次要还是 IP 地址的有余,应用大量的私有 IP 地址代表较多的公有 IP 地址的形式,将有助于减缓可用的 IP 地址空间的枯竭。用大白话:比方你有一个路由器(家用的那种就能够)这个路由器自身连贯了公网(被调配到了一个公网的 IP 地址)。路由器前面有接了 N 多个设施,每个设施都调配到了一个公有的地址(内网地址),这些地址能够通过这个路由器和外网交互。

其次可能无效地防止来自网络内部的攻打,暗藏并爱护网络外部的计算机。RFC3489 中将 NAT 的实现分为四大类:

  • Full Cone NAT(齐全圆锥型)
  • Address Restricted Cone NAT(地址限度圆锥型)
  • Port Restricted Cone NAT(端口限度圆锥型)
  • Symmetric NAT(对称型)

1. 齐全圆锥型 NAT

在齐全圆锥型 NAT(Full Cone NAT)中,NAT 会将客户机地址 {X:y} 转换成公网地址 {A:b} 并绑定。任何包都能够通过地址 {A:b} 送到客户主机的 {X:y} 地址上。如图所示:

RFC3581——齐全锥型 NAT

2. 地址限度圆锥型 NAT

地址限度圆锥型 NAT(Address Restricted Cone NAT)会将客户机地址 {X:y} 转换成公网地址 {A:b} 并绑定,只有来自主机 {P} 的包能力和主机 {X:y} 通信。如下图所示:

RFC3581——地址限制型 NAT

3. 端口限度圆锥型 NAT

端口限度圆锥型 NAT(Port Restricted Cone NAT)会将客户机地址 {X:y} 转换成公网地址 {A:b} 并绑定,只有来自主机 {P,q} 的包能力和主机 {X:y} 通信。如下图所示:

转存失败从新上传勾销

RFC3581——端口限制型 NAT

4. 对称型 NAT

对称型 NAT(Symmetric NAT)会将客户机地址 {X:y} 转换成公网地址 {A:b} 并绑定为 {X:y}|{A:b}<->{P:q}。对称型 NAT 只承受来自{P:q} 的连贯,将它转给{X:y},每次客户机申请一个不同的公网地址和端口,NAT 会新调配一个端口号{C,d}。如下图所示:

RFC3581——对称型 NAT

Linuxc/c++ 服务器开发高阶学习材料视频:C/C++Linux 服务器开发 / 后端开发 - 学习视频

内容包含 C /C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,K8S,Docker,TCP/IP,协程,DPDK 多个高级知识点。

视频解说:【技术篇】详解,网络穿透,P2P,打洞的外围原理丨 NAT,穿透的原理丨实现网络穿透_哔哩哔哩 (゜ - ゜)つロ 干杯~-bilibili

其中齐全最上层的齐全圆锥形 NAT 的穿透性最好,而最上层的对称形 NAT 的安全性最高。

3. 如何穿透 NAT?

事实上两个客户端互相通信还须要一个辅助服务器(p2pserver) 来保留两个用户的外网地址端口。当用户 A 连贯 B 时、或者 B 连贯 A 时,会向辅助服务器询问对方的外网地址和端口

NAT 穿透组合状况.png

从下面的 NAT 类型中能够看出,有 4 种 NAT,一共 10 种组合

**1. 齐全圆锥型 NAT 和齐全圆锥型 NAT 这种最简略,只须要 B 从辅助服务器拿到 A 的内外网信息,就能够和 A 进行连贯
**

**2. 齐全圆锥型 NAT 和地址限制型 NAT 同上
**

**3. 齐全圆锥型 NAT 和端口限制性 NAT 同上
**

**4. 齐全圆锥型 NAT 和对称型 NAT 同上
**

5. 地址限制型 NAT 和地址限制型 NAT

  • 当 B 从辅助服务器拿到 A 的内外网信息,B 向 A 发送连贯,这个时候 NAT A 设施会抛弃掉 B 发送过去的连贯。
  • 这个时候 B 就向辅助服务器发送申请,让 A 连贯 B 一次,连完后 B 就能够连贯到 A 了,NAT A 不再拦挡 B 过去的连贯。

6. 地址限制型 NAT 和端口限制型 NAT

同上

7. 地址限制性 NAT 和对称型 NAT

同上

8. 端口限制型 NAT 和端口限制型 NAT

同上

9. 端口限制型 NAT 和对称型 NAT

这种无奈穿透,因为 A 须要连过 B,B 能力连到 A,然而 A 无奈连贯到 B,因为 B 的是对称型 NAT,端口始终在变

10. 对称型 NAT 和对称型 NAT

这种也无奈穿透,因为客户机每次申请一个不同的公网地址和端口,NAT 会新调配一个端口号,所以从辅助服务器拿到的端口号是有效的(只是针对和服务器相连的端口号)。

eg:A 和辅助服务器相连,NAT A 会调配一个端口 8081。

A 和 B 相连,NAT A 会调配一个端口号 10020,所以 B 连 A 并不知道 A 须要从 10020 进,所以无奈穿透过 NAT A。不过也有人通过端口预测算法胜利连贯,然而这种并不牢靠。

4. 为什么须要保活链路?

因为一个连贯通过 NAT 设施之后,在 NAT 设施下面绑定的端口是有时效性的,个别是 30 分钟,然而起码的三五分钟就生效了,所以要不停的发送心跳包来保活 NAT 上的这个“洞”。

5. 挪动、联通网络为什么没有电信快?

起因是电信拨号之后调配的是公网 IP。而联通、挪动拨号之后还是内网 IP,也就是 NAT 设施下面还有多层 NAT,屡次转发并且最终的进口只有一个,所以总体来说比较慢

退出移动版