传统网络模式
传统的 cs 模式,如上图。多个客户端向一个中央服务器请求资源,统一由中央服务器提供资源响应。但这样的模式,对于大文件下载(比如影视片文件),中央服务器将要承担很大的性能压力。包括带宽压力,服务器本身的性能压力。 如果客户端测的带宽高,但服务端的带宽上限较低,客户的下载体验受到制约。尤其当多个人同时下载时,卡顿尤为显著。 我们也能看出这种模式存在的一些劣势:
- 风险高,中央服务器挂了,一切都完了。所有资源都无法下载了
- 网络的资源利用率低,所有的用户都只能从这个中央服务器下载资源。兴许客户端 A 要的资源,客户端 B 正好有呢
P2P 网络特点
为了解决以上问题,P2P(peer-to-peer)网络模型应用而生。它的核心思想即:所有人的资源都可以被别人找到并使用,而不依赖中央服务器
这里涉及寻找资源和下载资源。大致步骤如下
- 假设 ClientA 想要下载一份《程序员自我修养》这本电子书。会给他的邻居发出一份询问,咨询有没有这本电子书
- 被问到的节点没有资源会接着转发给它的邻居。这样层层转发下去知道一个叫 ClientN 的说他这有这本书。
- ClinetN 给 ClientA 发消息,告知它那有资源可以下载
- 于是 ClientA 和 ClientN 就直接通讯上了,直接进行了资源的下载
在 p2p 里面,可以理解为所有人即是服务器又是客户端。以上看着很美好,但也有其缺点
- 占带宽,这种地毯式的搜索资源的方式毕竟在占用带宽。
- 安全
- 自私,我不共享资源,但我下载资源。如果没有一定的奖惩机制,也很难组织一个大型的 p2p 网络
- 知识产权的管理问题
使用场景
- 个人组建自己的 p2p 网络,比如家与公司的两个局域网穿透,相互访问。 比如利用 开源的openp2p,实现内网穿透。让你在公司也能访问家里的内网设备
- 还有某 T 下载等
背后原理
P2P 内网穿透是一种使得位于 NAT(网络地址转换)或防火墙后面的设备能够直接通信的技术。其核心目的是绕过 NAT 设备的限制,从而实现不同网络之间的 P2P 通信。
内网穿透的原理
-
NAT 和防火墙的概念:
- NAT:网络地址转换,将私有 IP 地址转换为公共 IP 地址,允许多台设备共享一个公共 IP。
- 防火墙:控制和监测进出网络的流量,通常会阻止未授权的访问。
-
P2P 通信:
- 直接在设备之间进行数据传输,而无需通过中心服务器转发所有流量,从而降低延迟并节省带宽。
内网穿透的常见方法
-
STUN(Session Traversal Utilities for NAT):
- 用于确定 NAT 类型和公共 IP 地址。
- 客户端向 STUN 服务器发送请求,STUN 服务器返回其公共 IP 和端口。设备可以使用这些信息与其他设备建立连接。
-
TURN(Traversal Using Relays around NAT):
- 当直接 P2P 连接无法建立时,使用 TURN 服务器作为中继。这种方法比 STUN 更为消耗资源,但在 NAT 类型较复杂时仍然有效。
-
ICE(Interactive Connectivity Establishment):
- 结合 STUN 和 TURN,尝试多种连接方式并选择最佳路径进行通信。
内网穿透实现步骤
-
注册客户端:
- 客户端连接到一个公共服务器(例如信令服务器),注册自己。服务器记录客户端的公共 IP 和端口。
-
交换地址信息:
- 客户端通过公共服务器交换彼此的地址和端口信息。这是信令的过程。
-
尝试直接连接:
- 客户端根据交换的地址尝试直接建立连接。如果连接成功,则直接进行 P2P 通信。
-
处理 NAT 问题:
- 如果连接失败,可能是因为 NAT 类型的原因。这时,客户端可能通过 TURN 服务器进行数据中转。
-
建立连接并传输数据:
- 连接建立后,客户端可以直接发送和接收数据。
示例
假设有两个设备 A 和 B 都在 NAT 后,需要建立 P2P 连接:
- A 和 B 向信令服务器注册。
- 服务器返回 A 的公共地址和 B 的公共地址。
- A 尝试直接连接 B 的地址。
- 如果连接成功,A 和 B 可以开始 P2P 通信。
- 如果连接失败,A 可以通过 TURN 服务器将数据发送给 B。
常见应用
- 实时通信(如视频会议、VoIP)。
- 文件共享。
- 在线游戏。
总结
P2P 内网穿透利用 STUN、TURN 和 ICE 等技术手段,实现了在 NAT 和防火墙后设备之间的直接通信。它的核心在于通过公共服务器交换信息并尝试直接连接,从而避免通过中心服务器转发所有流量。这种方式有效提高了通信效率,降低了延迟。