去中心化技术P2P框架

中心化网络与去中心化网络

1. 中心化网络

        在传统的中心化网络中,所有客户端都通过一个中心服务器进行通信。这种网络拓扑结构通常是一个星型结构,其中服务器作为中心节点,每个客户端只能与服务器通信。如果客户端之间需要通信,必须通过服务器进行路由处理。这种网络结构中,服务器和客户端扮演着不同的角色,服务器为所有客户端提供服务。这种通信网络被称为中心化网络。

特点:

  • 中心服务器:所有客户端都连接到一个中心服务器。

  • 通信方式:客户端之间的通信必须通过服务器中转。

  • 角色区分:服务器和客户端有明确的角色区分,服务器提供服务,客户端请求服务。

2. 去中心化网络

去中心化网络是一种没有中心服务器的网络结构。在这种网络中,每个客户端都是平等的,没有客户端与服务器之分。客户端之间可以直接通信,互相提供服务,同时也使用其他客户端提供的服务。在这种情况下,客户端被称为节点。去中心化网络不仅解除了中心化服务器绝对控制的风险,还提高了网络传输效率,去除了中心化服务器数据路由的压力。

特点:

  • 无中心服务器:没有中心服务器,所有节点都是平等的。

  • 直接通信:节点之间可以直接通信,无需通过中心服务器中转。

  • 角色平等:所有节点既是服务提供者,也是服务使用者。

 

 

去中心化网络的原理

1. P2P 通信

P2P(Peer-to-Peer)通信是去中心化网络的核心。在这种通信方式中,终端设备(节点)之间可以直接通信,无需通过中心服务器。每个节点既是客户端也是服务器,可以同时提供和接收服务。

特点:

  • 直接连接:节点之间直接建立连接,无需通过中心服务器。

  • 对等关系:所有节点在功能上是平等的,没有主从之分。

  • 高扩展性:网络可以轻松扩展,新节点可以随时加入。

2. 节点发现

在去中心化网络中,节点需要能够发现其他节点并建立连接。这通常通过以下几种方式实现:

  • 广播:节点通过广播消息来发现其他节点。

  • 多播:节点通过多播组来发现其他节点。

  • 中心服务器:虽然去中心化网络没有中心服务器,但在某些情况下,可以使用一个临时的中心服务器来帮助节点发现其他节点。

3. 数据存储和检索

在去中心化网络中,数据通常存储在多个节点上,而不是集中存储在一个服务器上。数据的存储和检索通常通过以下方式实现:

  • 分布式哈希表(DHT):使用 DHT 来存储和检索数据。DHT 是一种分布式数据结构,可以高效地存储和检索键值对。

  • 文件共享:节点之间可以直接共享文件,无需通过中心服务器。

4. 网络穿透

网络穿透是实现终端与终端直接通信的一种技术方案。在去中心化网络中,网络穿透通常通过以下技术实现:

  • NAT 穿透:通过 NAT 穿透技术,如 STUN、TURN 和 ICE,解决 NAT 设备对直接通信的限制。

  • 中继服务器:在某些情况下,可以使用中继服务器来中转数据,确保通信的可靠性。

简单理解如下图:

 总结一把:

1.节点发现通常用udp 因为要广播发送,简单易实现。

2.数据存储和检索,并非集中存储,节点之间可以共享文件。

3.nat穿透,主要解决方案 STUN、TURN 和 ICE,解决 NAT 设备对直接通信的限制。以及中继服务器,交互。

 

NAT 的实现

为什么要进行nat?

解决ipv4不够使用的问题,通过ip+port端口映射关系,可以满足公网识别进程的位置。

NAT的三种实现方案对比

类型核心原理IP映射关系端口处理适用场景优缺点
静态NAT一对一固定映射私有IP ↔ 固定公网IP不修改端口服务器对外暴露(如Web服务器)✅ 稳定可预测 ❌ 浪费公网IP ❌ 无地址复用
动态NAT从公网IP池动态分配私有IP ↔ 临时公网IP不修改端口企业内网少量设备临时访问公网✅ 节省少量IP ❌ 并发数受IP池大小限制 ❌ 无法复用已分配IP
端口地址映射(PAT)多对一IP映射 + 端口重写多私有IP ↔ 单一公网IP修改源端口家庭/企业多设备共享单公网IP✅ 极致节省IP(单IP支持数万连接) ✅ 隐藏内网拓扑 ❌ 端口映射表维护复杂

 主要流行:端口地址映射(PAT/NAT Overload)

  • 核心创新 在IP映射基础上引入端口重写,实现多设备共享单一公网IP。例如:

    • 内网设备A(192.168.1.2:5000) → 映射为203.0.113.1:15000

    • 内网设备B(192.168.1.3:6000) → 映射为203.0.113.1:16000

  • 技术实现 NAT设备维护一张端口映射表,记录五元组(源IP、源端口、目标IP、目标端口、协议),确保响应数据包能正确回传。

  • 优势扩展

    • 安全性:外部无法直接看到内网IP和端口,天然具备防火墙特性。

    • 高并发:单个公网IP理论上支持约65,000个端口(TCP/UDP)。

 

NAT 种类

NAT功能分类对比表

类型映射规则过滤规则P2P兼容性典型应用场景
完全锥型NAT内网地址(iAddr:iPort )固定映射为公网地址(pAddr:pPort ),所有外部请求均可通过该端口访问内网无过滤:任何外部IP和端口均可通过pAddr:pPort 访问内网✅ 高企业对外服务(需主动暴露端口)
IP限制锥型NAT同完全锥型,映射关系固定(pAddr:pPort ↔ iAddr:iPort )IP过滤:仅允许内网主机主动通信过的外部IP访问pAddr:pPort (不限制端口)✅ 中家庭宽带(运营商基础NAT)
端口限制锥型NAT同完全锥型,映射关系固定(pAddr:pPort ↔ iAddr:iPort )IP+端口过滤:仅允许内网主机主动通信过的外部IP和端口访问pAddr:pPort❌ 低企业防火墙(严格安全策略)
对称型NAT动态映射:内网主机每连接一个外部目标,分配新的公网端口(pAddr:pPort_new )会话绑定:仅允许特定外部IP和端口通过对应的动态映射端口访问内网❌ 极低移动网络(4G/5G运营商级NAT)

nat映射表ps:如果源地址和nat后地址一致,则目标地址不进行登记,而是共享nat表。回源转发是通过nat表进行这就导致如果是对称nat,会为这个新的连接分配另一个公网 IP 和端口,有两条记录,使得p2p目的不明确!

 对称NAT

锥形NAT  

关键特性深度解析

1. 完全锥型NAT(Full Cone NAT)
  • 技术特点

    • 映射关系:内网IP:端口公网IP:端口(固定一对一)

    • 无状态过滤:任何外部主机均可通过公网IP:端口访问内网主机(无需内网主机主动发起连接)。

  • 示例场景 内网服务器(192.168.1.100:80)映射为公网地址(203.0.113.10:80),公网用户可直接访问203.0.113.10:80

  • P2P兼容性 最佳,无需打洞即可直接通信。

2. IP限制锥型NAT(Restricted Cone NAT)
  • 技术特点

    • 映射关系固定,但过滤规则基于IP:仅允许内网主机主动连接过的外部IP通过映射端口访问。

    • 端口不限:外部主机可使用任意端口(如从180.93.45.46:8080改为180.93.45.46:1234仍可访问)。

  • 示例场景 内网主机(192.168.1.2:5000)主动连接公网服务器(180.93.45.46:80),则NAT允许来自180.93.45.46(任何端口)的返程流量。

  • P2P兼容性 需通过STUN服务器交换IP信息,可打洞成功。

3. 端口限制锥型NAT(Port-Restricted Cone NAT)
  • 技术特点

    • 过滤规则严格绑定IP+端口:仅允许内网主机主动连接过的外部IP和端口访问映射端口。

    • 示例:若内网主机连接180.93.45.46:8080,则仅允许来自180.93.45.46:8080的返程流量。

  • P2P兼容性 需双方同时向对方发送打洞包以建立双向通道,成功率取决于NAT策略。

4. 对称型NAT(Symmetric NAT)
  • 技术特点

    • 动态端口映射:内网主机每连接一个外部目标(IP:Port ),NAT分配不同的公网端口

    • 严格会话绑定:外部主机必须使用与内网主机通信时相同的IP和端口,且只能通过对应的动态端口访问。

  • 示例场景 内网主机(192.168.1.2:5000)连接公网主机A(180.93.45.46:80)时映射为203.0.113.1:55000;连接主机B(198.51.100.2:443)时映射为203.0.113.1:56000

  • P2P兼容性 极低,需依赖TURN中继服务器转发流量。

 

总结

 

如何识别net网关类型

为什么要是区分nat类型

1.nat类型由服务器探测,得出网络分布nat类型。以后打洞就方便

nat类型识别次数如何计算(去重复)

 1.双方属于完全锥型NAT (1次 p2p大概率成功)

步骤1:私网机器1(192.168.1.3:2341)发送报文给服务器(180.93.45.46:8888)。 服务 器获取到私网机器1的公网IP地址与端口(112.93.14.56:43891)。 步骤2:服务器收到信息后,通知私网机器2(192.168.2.6:6583), 通知信息内含私网机器 1 的公网IP地址与端口(112.93.14.56:43891)。 步骤 3:私网机器 2(192.168.2.6:6583)发送数据给私网机器 1 的公网 IP 地址与端口 (112.93.14.56:43891),此时私网机器 1 就能收到私网机器2发送的报文数据,并且能过 获取私网机器2的公网IP地址与端口(iAddr:iPort)。 步骤4:私网机器1回发报文信息给私网机器2的公网IP地址与端口(iAddr:iPort),此 时私网机器2能够收到报文数据。穿透流程结束。 

2.双方属于限制类型nat (受限,则通过中继服务器转发,最终p2p)

步骤1:私网机器1(192.168.1.3:2341)发送报文给服务器(180.93.45.46:8888),服务 器获取私网机器的公网IP地址(112.93.14.56:43891)。 步骤2:服务器发送通知报文给私网机器2(192.168.2.6:6583),通知报文中内含私网机器 1 的公网IP地址(112.93.14.56:43891)。 步骤3:私网机器2发送报文数据到私网机器1的公网IP地址(112.93.14.56:43891)。由 于NAT1是限制锥型NAT,此时私网机器1是不能收到报文数据的。 步骤4:私网机器2进行完步骤3以后,立即发送报文给服务器(180.93.45.46:8888),要 求私网机器1发送数据给私网机器2的公网IP地址。 步骤5:服务器通知私网机器1,通知信息内含公网IP地址(180.20.198.42.9681)。 步骤6:私网机器1发送报文数据给私网机器2的公网IP地址。由于步骤3发送报文给私 网机器2的公网IP地址,此份报文会被NAT2的路由器认为是步骤3的回复。所以此步骤会 被允许通过。此时已经穿透了NAT2。 步骤7:私网机器2回发报文给私网机器1,此时穿透了NAT1。穿透流程结束。 

3.两边是对称nat (没啥限制,直接用服务器大概率通)

使用 STUN 协议

  • STUN(Simple Traversal of UDP through NAT)协议是一种用于确定 NAT 类型和公共 IP 地址的协议。通过 STUN 协议,可以检测 NAT 类型并判断是否为对称 NAT。

  • 你可以使用 STUN 服务器来测试 NAT 类型。例如,使用 NatTypeChecker 工具,它是一个基于 JavaScript 的 STUN 协议实现,可以检测 NAT 类型 。

使用 P2P 穿透工具

  • 一些 P2P 穿透工具(如 pwnat)可以尝试与对端建立连接,并根据连接结果判断 NAT 类型。如果两边都是对称 NAT,这些工具通常会报告连接失败或需要额外的中继服务器 。

手动测试

手动进行以下步骤来判断 NAT 类型:

  1. 客户端 A 向 STUN 服务器发送请求,获取其公共 IP 和端口号。

  2. 客户端 B 向同一 STUN 服务器发送请求,获取其公共 IP 和端口号。

  3. 客户端 A 和 B 互相发送 UDP 数据包,观察是否能够直接通信。

  4. 如果两边都是对称 NAT,通常会发现无法直接通信,因为每个连接的端口号都是动态分配的,无法预测。

4.NAT1为限制锥型NAT,NAT2为对称NAT。

步骤1:私网机器1(192.168.1.3:2341)发送报文数据给服务器(180.93.45.46:8888), 请求与私网机器2进行透传。

步骤2:服务器(180.93.45.46:8888)发送通知信息给私网机器2。通知信息内含私网机器 1 的公网IP地址(112.93.14.56:43891)。

步骤3:私网机器2收到通知信息,发送报文数据给私网机器1的公网IP地址。此时由于 NAT1 为限制锥形NAT,数据是不被允许进入私网的。同时由于NAT2为对称NAT,所以会在 此次报文发送过程中,会被产生新的映射记录,分配公网地址与端口(iAddr:iPort)。

步骤4:私网机器2进行完步骤3以后,发送报文信息给服务器的另一个端口8889,此步骤 也会在路由器上产生一条新的映射记录,分配公网地址与端口(mAddr:mPort)。服务器同时 也获取到新的公网地址与端口(mAddr:mPort)。

步骤5:服务器(180.93.45.46:8889)发送通知信息给私网机器1。通知信息内含步骤4产 生的新记录公网地址与端口(mAddr:mPort)。 此时根据 iPort 与 mPort 产生的相隔时间很 短,可以来判断iPort 的值,即需要穿透的端口。为了判断的根据准确,可以在产生mPort 之前也加上一次新记录,即再步骤3以前让NAT路由器产生一条记录,这样准确度会大大穿 透的概率。

步骤6:根据mPort的值,来猜测iPort的值,发送报文信息给私网机器2的公网地址与端 口(mAddr:mPort)。 准确的mPort值,则能够穿透NAT2。

步骤7:收到穿透报文信息后,回复报文信息。流程完毕。

步骤核心逻辑

NAT穿透失败的根本原因

  1. NAT1的限制锥型规则

    • 仅允许内网机器1主动通信过的外部IP(如服务器IP 180.93.45.46)返程流量进入,私网机器2的初次连接请求会被NAT1直接丢弃

  2. NAT2的对称型规则

    • 私网机器2每次连接不同目标(如服务器或NAT1的公网地址)时,NAT2会分配不同的公网端口(如 iPortmPort),导致传统打洞无法直接定位有效端口。

解决方案

触发两次端口映射

  • 步骤3:私网机器2首次尝试连接NAT1的公网地址(112.93.14.56:43891),触发NAT2生成映射记录 iPort

  • 步骤4:私网机器2转而连接服务器的另一个端口(8889),触发NAT2生成新映射记录 mPort

端口推测机制

  • 对称型NAT(如NAT2)在为同一内网主机的连续连接分配端口时,可能采用递增或固定偏移策略(例如 mPort = iPort + 1)。

  • 服务器通过对比两次映射端口 iPortmPort 的生成时间间隔与差值,推测出 iPort 的可能值。

主动验证猜测端口

  • 步骤6:服务器通知私网机器1向推测的端口 mAddr:mPort(实际目标为 iPort)发送穿透报文。

  • 若猜测正确,NAT2会将报文转发至私网机器2,完成双向通道建立。

总结

 1.双方属于完全锥型NAT (1次 p2p大概率成功)

2.双方属于限制类型nat (受限,则通过中继服务器转发,最终p2p)

3.两边是对称nat ()

4.NAT1为限制锥型NAT,NAT2为对称NAT。

        总结:步骤3由于是锥形,不会产生记录。所以需要额外记录这次nat ip:port,步骤4 又产生多余的记录。只能靠猜测4是ip:port+1的模式,进行尝试。最后客户机1根据上述两点进行猜测。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

muduo源码阅读:linux timefd定时器

⭐timerfd timerfd 是Linux一个定时器接口,它基于文件描述符工作,并通过该文件描述符的可读事件进行超时通知。可以方便地与select、poll和epoll等I/O多路复用机制集成,从而在没有处理事件时阻塞程序执行,实现高效的零轮询编程模…

Pinia 3.0 正式发布:全面拥抱 Vue 3 生态,升级指南与实战教程

一、重大版本更新解析 2024年2月11日,Vue 官方推荐的状态管理库 Pinia 迎来 3.0 正式版发布,本次更新标志着其全面转向 Vue 3 技术生态。以下是开发者需要重点关注的升级要点: 1.1 核心变更说明 特性3.0 版本要求兼容性说明Vue 支持Vue 3.…

【图像处理 --- Sobel 边缘检测的详解】

Sobel 边缘检测的详解 目录 Sobel 边缘检测的详解1. 梯度计算2. 梯度大小3. 梯度方向4. 非极大值抑制5. 双阈值处理6. 在 MATLAB 中实现 Sobel 边缘检测7.运行结果展示8.关键参数解释9.实验与验证 Sobel 边缘检测是一种经典的图像处理算法,用于检测图像中的边缘。它…

LeetCode 热题100 15. 三数之和

LeetCode 热题100 | 15. 三数之和 大家好,今天我们来解决一道经典的算法题——三数之和。这道题在 LeetCode 上被标记为中等难度,要求我们从一个整数数组中找到所有不重复的三元组,使得三元组的和为 0。下面我将详细讲解解题思路&#xff0c…

基因组组装中的术语1——from HGP

Initial sequencing and analysis of the human genome | Nature 1,分层鸟枪法测序hierarchical shotgun sequencing

安全开发-环境选择

文章目录 个人心得虚拟机选择ubuntu 22.04python环境选择conda下载使用: 个人心得 在做开发时配置一个专门的环境可以使我们在开发中的效率显著提升,可以避免掉很多环境冲突的报错。尤其是python各种版本冲突,还有做渗透工具不要选择windows…

数字体验驱动用户参与增效路径

内容概要 在数字化转型深化的当下,数字内容体验已成为企业与用户建立深度连接的核心切入点。通过个性化推荐引擎与智能数据分析系统的协同运作,企业能够实时捕捉用户行为轨迹,构建精准的用户行为深度洞察模型。这一模型不仅支撑内容分发的动…

Python 字符串(str)全方位剖析:从基础入门、方法详解到跨语言对比与知识拓展

Python 字符串(str)全方位剖析:从基础入门、方法详解到跨语言对比与知识拓展 本文将深入探讨 Python 中字符串(str)的相关知识,涵盖字符串的定义、创建、基本操作、格式化等内容。同时,会将 Py…

使用C++实现简单的TCP服务器和客户端

使用C实现简单的TCP服务器和客户端 介绍准备工作1. TCP服务器实现代码结构解释 2. TCP客户端实现代码结构解释 3. 测试1.编译:2.运行 结语 介绍 本文将通过一个简单的例子,介绍如何使用C实现一个基本的TCP服务器和客户端。这个例子展示了如何创建服务器…

Java Web开发实战与项目——Spring Boot与Spring Cloud微服务项目实战

企业级应用中,微服务架构已经成为一种常见的开发模式。Spring Boot与Spring Cloud提供了丰富的工具和组件,帮助开发者快速构建、管理和扩展微服务应用。本文将通过一个实际的微服务项目,展示如何使用Spring Boot与Spring Cloud构建微服务架构…

VMware建立linux虚拟机

本文适用于初学者,帮助初学者学习如何创建虚拟机,了解在创建过程中各个选项的含义。 环境如下: CentOS版本: CentOS 7.9(2009) 软件: VMware Workstation 17 Pro 17.5.0 build-22583795 1.配…

Linux8-互斥锁、信号量

一、前情回顾 void perror(const char *s);功能:参数: 二、资源竞争 1.多线程访问临界资源时存在资源竞争(存在资源竞争、造成数据错乱) 临界资源:多个线程可以同时操作的资源空间(全局变量、共享内存&a…

LD_PRELOAD 绕过 disable_function 学习

借助这位师傅的文章来学习通过LD_PRELOAD来绕过disable_function的原理 【PHP绕过】LD_PRELOAD bypass disable_functions_phpid绕过-CSDN博客 感谢这位师傅的贡献 介绍 静态链接: (1)举个情景来帮助理解: 假设你要搬家&#x…

【无人集群系列---无人机集群编队算法】

【无人集群系列---无人机集群编队算法】 一、核心目标二、主流编队控制方法1. 领航-跟随法(Leader-Follower)2. 虚拟结构法(Virtual Structure)3. 行为法(Behavior-Based)4. 人工势场法(Artific…

Oracle Fusion Middleware更改weblogic密码

前言 当用户忘记weblogic密码时,且无法登录到web界面中,需要使用服务器命令更改密码 更改方式 1、备份 首先进入 weblogic 安装目录,备份三个文件:boot.properties,DefaultAuthenticatorInit.ldift,Def…

MongoDB 复制(副本集)

MongoDB 复制(副本集) 引言 MongoDB是一个高性能、可扩展、易于使用的文档存储系统。它以JSON-like的文档存储结构,支持灵活的数据模型。在分布式系统中,为了提高数据可用性和系统稳定性,常常需要实现数据的备份和冗余。MongoDB提供了副本集…

【Erdas实验教程】009:非监督分类及分类后评价

文章目录 一、分类过程二、分类评价ERDAS 的 ISODATA 算法是基于最小光谱距离来进行的非监督分类,聚类过程始于任意聚类平均值或一个已有分类模板的平均值;聚类每重复一次,聚类的平均值就更新一次,新聚类的均值再用于下次聚类循环。这个过程不断重复,直到最大的循环次数已…

一周学会Flask3 Python Web开发-Jinja2模板访问对象

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象,如果如何来访问呢? 我们看下下面示例: 定义一个Student类 cla…

git 命令 设置别名

在Git中,您可以通过以下命令查看所有的alias(别名): git config --get-regexp alias 这个命令会列出所有配置的alias,例如: alias.st.status alias.co.checkout alias.br.branch ... 如果您想查看某个特定a…

React Router v5 vs v6 路由配置对比

React Router v5 vs v6 路由配置对比 React Router 是 React 中最常用的路由库,从 v5 到 v6 版本,发生了较大变化。本文对比 React Router v5 和 React Router v6 的配置方式,帮助开发者顺利迁移。 1. 安装依赖 React Router v5 npm inst…