解析每天认识一个设计模式-组合模式:树形结构的统一接口艺术的过程

告别实车测试:手把手教你用Vector VT平台搭建OBC/DCDC的HIL测试台架 本文详细介绍了如何利用Vector VT平台搭建新能源汽车OBC/DCDC的HIL测试台架,涵盖硬件选型、模型部署到自动化测试的全流程。通过HIL仿真测试技术,工程师可以高效验证动力域关键部件,大幅缩短开发周期并降低成本,特别适合新能源汽车三电系统的开发验证。 阅读详情
卤此峙涸厍在当今的网络环境中,大多数设备都位于网络地址转换 (NAT) 设备之后,这导致了一个普遍存在的问题:如何让位于不同 NAT 设备后的两个设备直接建立通信? 这个问题在 P2P 应用中尤为突出,如在线游戏、视频会议、文件共享等场景都需要设备之间的直接通信。

传统的 C/S 架构应用中,客户端可以主动向服务器发起连接,但反过来却不行。这是因为 NAT 设备会阻止来自公网的未经请求的连接尝试。然而,在 P2P 应用中,我们需要两个客户端之间能够直接通信,这就需要突破 NAT 的限制,这就是 P2P 打洞技术所要解决的核心问题。

二.NAT 类型与工作原理

NAT 的基本概念与作用

网络地址转换 (NAT) 是一种将私有网络地址 (如 192.168.1.0/24) 转换为公网地址的技术。它的主要作用是节约公网 IP 地址资源,使得多个私有网络设备可以共享一个公网 IP 地址访问互联网。

在 NAT 设备中,维护着一个映射表,记录了私有 IP 地址和端口到公网 IP 地址和端口的映射关系。当内部设备向外部发送数据时,NAT 设备会将数据包的源 IP 和端口替换为自己的公网 IP 和一个可用端口,并在映射表中记录这一转换。当外部设备返回响应时,NAT 设备根据映射表将数据包转发给对应的内部设备。

NAT 设备通常位于家庭或企业网络的边界,作为内部网络与公网之间的网关。它的存在使得外部设备无法直接访问内部设备,这给 P2P 通信带来了挑战。

NAT 类型及其对通信的影响

根据 NAT 设备的行为特性,可以将其分为四种主要类型:完全圆锥型 (Full Cone)、限制圆锥型 (Restricted Cone)、端口限制圆锥型 (Port Restricted Cone) 和对称型 (Symmetric)。不同类型的 NAT 对 P2P 通信的影响各不相同。

完全圆锥型 NAT

完全圆锥型 NAT 是最开放的 NAT 类型。在这种 NAT 下,一旦内部设备的某个端口被映射到公网地址的某个端口,任何外部设备都可以向这个公网端口发送数据,NAT 设备会将数据转发给对应的内部设备,而不管这些数据来自哪个外部地址。

数学描述:设内部地址为 (iAddr, iPort),映射到公网地址 (eAddr, ePort)。对于任意外部地址 (aAddr, aPort),如果外部设备向 (eAddr, ePort)发送数据,NAT 设备会将其转发给 (iAddr, iPort)。

这种类型的 NAT 对 P2P 通信最为友好,因为一旦映射建立,两个设备之间可以直接通信。

限制圆锥型 NAT

限制圆锥型 NAT 比完全圆锥型 NAT 更严格。在这种 NAT 下,只有当内部设备已经向某个外部 IP 地址发送过数据后,该外部 IP 地址才能向内部设备的映射端口发送数据,但可以是任意端口。

数学描述:设内部地址为 (iAddr, iPort),映射到公网地址 (eAddr, ePort)。对于外部地址 (aAddr, aPort),只有当内部设备已经向 aAddr发送过数据时,NAT 设备才会将来自 (aAddr, aPort)的数据转发给 (iAddr, iPort)。

这种类型的 NAT 允许外部设备与内部设备通信,但仅限于内部设备已经通信过的 IP 地址,而不考虑端口。

端口限制圆锥型 NAT

端口限制圆锥型 NAT 是更严格的一种类型。在这种 NAT 下,只有当内部设备已经向某个外部 IP 地址的特定端口发送过数据后,该外部 IP 地址的该特定端口才能向内部设备的映射端口发送数据。

数学描述:设内部地址为 (iAddr, iPort),映射到公网地址 (eAddr, ePort)。对于外部地址 (aAddr, aPort),只有当内部设备已经向 (aAddr, aPort)发送过数据时,NAT 设备才会将来自 (aAddr, aPort)的数据转发给 (iAddr, iPort)。

这种类型的 NAT 对通信的限制更加严格,要求外部设备的 IP 和端口都必须是内部设备已经通信过的。

对称型 NAT

对称型 NAT 是最严格的一种类型。在这种 NAT 下,内部设备每次向不同的外部 IP 地址或端口发送数据时,NAT 设备都会创建一个新的映射。此外,只有来自该特定外部 IP 地址和端口的数据才能被转发回内部设备。

数学描述:设内部地址为 (iAddr, iPort)。当内部设备向 (aAddr1, aPort1)发送数据时,NAT 设备会创建一个映射 (eAddr1, ePort1)。当内部设备向 (aAddr2, aPort2)发送数据时,NAT 设备会创建另一个映射 (eAddr2, ePort2),即使 aAddr1 == aAddr2但 aPort1 != aPort2。对于外部地址 (aAddr, aPort),只有当内部设备已经向 (aAddr, aPort)发送过数据时,NAT 设备才会将来自 (aAddr, aPort)的数据转发给 (iAddr, iPort)。

这种类型的 NAT 使得 P2P 通信变得非常困难,因为两个设备之间很难建立直接的连接。

NAT 类型对 P2P 通信的影响总结

不同类型的 NAT 对 P2P 通信的支持程度各不相同:

NAT 类型 P2P 通信支持度 直接通信可能性

完全圆锥型 高 容易

限制圆锥型 中等 可能

端口限制圆锥型 低 困难

对称型 极低 几乎不可能

在实际应用中,大多数家用路由器使用完全圆锥型或限制圆锥型 NAT,而企业级路由器可能使用更严格的类型。了解 NAT 的类型对于实现可靠的 P2P 通信至关重要。

三.UDP 打洞原理与实现

UDP 打洞的基本原理

UDP 打洞是实现 P2P 通信的常用方法,其基本原理是利用 NAT 设备的特性,通过中间服务器的协助,在两个客户端的 NAT 设备上建立映射关系,使得它们能够直接通信。

UDP 打洞的核心思想是:即使两个客户端都位于 NAT 之后,只要它们能够同时向对方的公网地址发送数据,它们的 NAT 设备就会建立相应的映射,从而允许后续的数据直接通过。

具体来说,UDP 打洞的过程如下:

客户端 A 和客户端 B 分别向中间服务器 S 发送数据,服务器 S 记录下它们的公网地址 (A_public, A_port)和 (B_public, B_port)。

服务器 S 将 B 的公网地址告诉 A,将 A 的公网地址告诉 B。

客户端 A 向 B 的公网地址发送一个 UDP 数据包,客户端 B 向 A 的公网地址发送一个 UDP 数据包。

由于这两个数据包是主动发送的,它们的 NAT 设备会建立相应的映射,允许后续的数据通过。

一旦映射建立,客户端 A 和 B 就可以直接通信了。

需要注意的是,第二步中客户端 A 和 B 发送的初始数据包可能会被对方的 NAT 设备丢弃,但这并不影响,因为这两个数据包的主要目的是在各自的 NAT 设备上建立映射关系,而不是实际传输数据。

UDP 打洞的数学模型

为了更好地理解 UDP 打洞的原理,我们可以建立一个数学模型。

假设客户端 A 的内网地址为 A_private,映射到公网地址 A_public;客户端 B 的内网地址为 B_private,映射到公网地址 B_public。中间服务器 S 的地址为 S_addr。

在打洞过程中,我们需要解决以下问题:

如何让 A 和 B 获取对方的公网地址?

如何让 A 和 B 的 NAT 设备允许对方的数据通过?

数学上,我们可以将这个问题描述为:找到一种方式,使得对于客户端 A 和 B,有:

image

其中 NAT_X(Y)表示地址 Y 经过 NAT 设备 X 转换后的公网地址。

通过中间服务器 S 的协助,A 和 B 可以获取对方的公网地址。然后,通过同时向对方的公网地址发送数据,它们的 NAT 设备会建立相应的映射,使得:

image

从而允许后续的数据直接传输。

UDP 打洞的具体实现步骤

UDP 打洞的具体实现可以分为以下几个步骤:

客户端注册:客户端 A 和 B 分别向中间服务器 S 发送注册请求,服务器 S 记录它们的公网地址。

交换地址信息:服务器 S 将 A 的公网地址告诉 B,将 B 的公网地址告诉 A。

打洞请求:客户端 A 和 B 同时向对方的公网地址发送 UDP 数据包,触发各自 NAT 设备建立映射。

直接通信:一旦映射建立,客户端 A 和 B 就可以直接交换 UDP 数据包,无需再通过服务器 S。

需要注意的是,在步骤 3 中,客户端 A 和 B 必须同时向对方的公网地址发送数据,否则可能无法建立正确的映射。此外,第一次发送的数据可能会被对方的 NAT 设备丢弃,但后续的数据将能够正确传输。
其中:

Message Type:表示消息的类型,如请求、成功响应、错误响应等。

Message Length:表示消息的长度,不包括头部。

Magic Cookie:固定值 0x2112A442,用于识别 STUN 消息。

Transaction ID:用于关联请求和响应的唯一标识符。

STUN 消息的属性部分包含了各种信息,如 XOR-MAPPED-ADDRESS(客户端的公网地址)、USERNAME(用户名)、MESSAGE-INTEGRITY(消息完整性)等。

STUN 协议在 P2P 中的应用

STUN 协议在 P2P 通信中的主要应用是帮助客户端发现自己的公网地址,这是实现打洞的前提条件。通过 STUN 协议,客户端可以获取以下信息:

公网 IP 地址:客户端在 NAT 设备后的公网 IP 地址。

公网端口:客户端在 NAT 设备后的公网端口。

NAT 类型:客户端所在 NAT 设备的类型。

这些信息对于实现 P2P 通信非常重要,特别是在复杂的网络环境中。

TURN 协议

TURN 协议概述

TURN (Traversal Using Relays around NAT) 是一种在 STUN 无法穿透 NAT 时使用的中继协议。它的基本原理是:当两个客户端无法直接建立连接时,通过 TURN 服务器中转数据。

TURN 协议的核心思想是:如果两个客户端无法直接通信,它们可以通过 TURN 服务器中转数据,从而实现间接的 P2P 通信。

TURN 协议的工作流程如下:

客户端向 TURN 服务器发送 Allocate 请求,请求分配一个中继地址。

TURN 服务器分配一个中继地址,并返回给客户端。

客户端使用这个中继地址与其他客户端通信。

当两个客户端无法直接通信时,它们的数据通过 TURN 服务器中转。

TURN 协议的主要用途是在直接打洞失败时提供回退机制,确保 P2P 通信的可靠性。

TURN 服务器的工作原理

TURN 服务器的工作原理如下:

分配中继地址:TURN 服务器为客户端分配一个公网的中继地址和端口。

建立绑定:客户端与 TURN 服务器建立绑定关系,确保后续的数据可以通过中继地址传输。

数据中继:当两个客户端无法直接通信时,TURN 服务器作为中间人,将数据从一个客户端转发到另一个客户端。

连接维护:TURN 服务器维护连接状态,确保数据传输的连续性。

TURN 服务器的核心功能是在无法直接建立 P2P 连接时提供数据中继服务,确保通信的可靠性。

TURN 协议在 P2P 中的应用

TURN 协议在 P2P 通信中的主要应用是作为打洞失败后的回退机制。当直接打洞无法建立连接时,TURN 协议提供了以下功能:

中继服务:通过 TURN 服务器中转数据,确保通信的可能性。

地址分配:为客户端分配公网的中继地址,便于其他客户端连接。

连接维护:维护连接状态,确保数据传输的连续性。

TURN 协议的主要优势是提供了可靠的回退机制,确保 P2P 通信在各种网络环境下都能工作。

ICE 协议

ICE 协议概述

ICE (Interactive Connectivity Establishment) 是一种综合利用 STUN 和 TURN 协议,帮助对等设备建立连接的框架。它的基本原理是:通过收集多种候选地址,按优先级排序,然后尝试所有可能的连接路径,找到最佳的通信方式。

ICE 协议的核心思想是:收集所有可能的候选地址,包括直接地址、STUN 获取的公网地址和 TURN 获取的中继地址,然后尝试所有可能的连接路径,选择最优的路径进行通信。

ICE 协议的工作流程如下:

候选地址收集:收集所有可能的候选地址,包括本地地址、STUN 获取的公网地址和 TURN 获取的中继地址。

候选地址交换:通过信令服务器交换候选地址信息。

连接性检查:对所有可能的候选地址对进行连接性检查,确定哪些路径可用。

路径选择:根据连接性检查的结果,选择最优的路径进行通信。

ICE 协议的主要优势是能够在各种网络环境下建立可靠的 P2P 连接,特别是在复杂的网络环境中。

ICE 协议的工作原理

ICE 协议的工作原理可以分为以下几个步骤:

候选地址收集:

本地候选地址:设备的本地 IP 地址和端口。

服务器反射候选地址:通过 STUN 协议获取的公网地址和端口。

中继候选地址:通过 TURN 协议获取的中继地址和端口。

候选地址优先级排序:

本地候选地址通常具有最高优先级。

服务器反射候选地址次之。

中继候选地址优先级最低。

候选地址交换:

通过信令服务器交换候选地址信息。

每个设备都获得对方的所有候选地址。

连接性检查:

对所有可能的候选地址对进行连接性检查。

使用 STUN 协议的 Binding 请求和响应进行检查。

路径选择:

根据连接性检查的结果,选择最优的路径。

优先选择直接连接的路径,其次是中继路径。

ICE 协议的核心优势是能够自动适应各种网络环境,选择最佳的通信路径,确保连接的可靠性和性能。

ICE 协议在 P2P 中的应用

ICE 协议在 P2P 通信中的主要应用是提供一种可靠的连接建立机制,特别是在复杂的网络环境中。它的主要应用场景包括:

视频会议:在 WebRTC 中,ICE 协议用于建立对等设备之间的音视频连接。

文件共享:在 P2P 文件共享应用中,ICE 协议用于建立对等节点之间的直接连接。

在线游戏:在在线游戏中,ICE 协议用于建立玩家之间的低延迟连接。

实时通信:在各种需要实时通信的应用中,ICE 协议提供可靠的连接建立机制。

ICE 协议的主要优势是能够在各种网络环境下建立可靠的 P2P 连接,特别是在 NAT 设备后的网络环境中。它已经成为现代 P2P 应用中连接建立的标准方法。奈坠柑日袄计寂春凸顺
Linux CentOS 8系统离线升级内核版本 CentOS 8操作系统离线场景下升级内核版本 阅读详情

相关推荐

11. TI MSPM0G3507 DMA传输实战:ADC数据自动搬运与电压采集

本文以TI MSPM0G3507为例,详细讲解了如何利用DMA(直接存储器访问)实现ADC数据的自动搬运与电压采集。通过实战演示,解放CPU资源,提升系统实时性与效率,适用于电赛备赛及嵌入式开发中的数据采集场景。

weixin_42465140的博客 131

探索每天认识一个设计模式-组合模式:树形结构的统一接口艺术的过程

探索javascript异步进阶的过程

ASADGSDASXA的博客 799

通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控

ASK、FSK和PSK是三种基础数字调制技术。ASK通过改变载波振幅传输信息,实现简单但抗干扰弱;FSK利用频率变化传递信号,抗干扰较强但频谱利用率一般;PSK通过相位变化编码数据,抗干扰和频谱效率最优但同步要求高。三种技术各具特点,分别适用于不同通信场景:ASK用于低速光纤通信,FSK常见于无线广播,PSK则广泛应用于Wi-Fi、蓝牙等现代通信系统。

limengshi138392的博客 8725

说一说每天认识一个设计模式-组合模式:树形结构的统一接口艺术的过程

说一说javascript异步进阶的过程

ASFASFASAXA的博客 503

探索robotics-toolbox-python:从基础安装到高级机器人运动学应用

本文详细介绍了robotics-toolbox-python工具箱,从基础安装、环境配置到机器人运动学与动力学的核心应用。通过D-H参数、URDF导入和内置模型三种方式快速构建机器人模型,并演示了正逆运动学计算、关节空间与任务空间轨迹规划以及三维可视化仿真。该工具箱极大地简化了机器人算法开发流程,是进行机器人学研究和应用实践的强大工具。

i1j2k的博客 496

逆向实战:TikTok X-Gorgon算法解析与Unidg补环境技巧

本文详细解析了TikTok X-Gorgon算法的逆向工程全流程,包括参数定位、变种RC4算法还原及Unidbg补环境技巧。通过动态调试与静态分析相结合,揭示了X-Gorgon的生成逻辑和加密细节,为移动安全研究提供了实用指南。

weixin_28568819的博客 693

分析每天认识一个设计模式-组合模式:树形结构的统一接口艺术的过程

分析javascript异步进阶的过程

SAFADGADSGASA的博客 666

数据驱动的老年人健康管理与生活品质提升实践研究

摘要 全球人口老龄化趋势显著,2025年65岁以上人口预计达8.57亿,中国老年人口已突破3亿。老年人健康挑战突出,75%以上患慢性病,且独居老人心理健康与应急需求迫切。数据驱动的健康管理通过智能设备(如跌倒检测、远程监测)和AI技术(如疾病预测算法)提升效率,改善生活品质。研究提出差异化需求解决方案,如慢性病患者的持续监测与用药管理,高龄老人的综合护理服务,并探讨政策与商业模式以推动智慧养老产业发展,2024年市场规模已达6.8万亿元。

聚焦程序设计语言理论与前沿技术落地,拆解代码世界的底层逻辑,探索语言设计的 “创造与沟通” 之道。从编译原理、类型系统到 AI 技术在金融、医疗、制造、养老、大健康等领域的实战案例,分享硬核技术干货与工程化思考。 1631

带你了解每天认识一个设计模式-组合模式:树形结构的统一接口艺术的过程

带你了解javascript异步进阶的过程

ASADGSDASXA的博客 893

YT8531 PHY芯片硬件设计与MDIO/RGMII实战指南

以太网PHY芯片是FPGA系统实现网络通信的物理层核心,其关键在于标准接口(如MDIO管理总线和RGMII数据接口)的正确实现与协同。MDIO作为IEEE 802.3定义的低速配置通道,负责寄存器级控制与状态监控;RGMII则通过双沿采样精简引脚,在千兆速率下兼顾性能与PCB布线可行性。技术价值体现在电压兼容性(支持1.8V/2.5V/3.3V)、可编程时序调节(RX_DELAY/TX_DELAY)及多级环回测试能力,显著提升国产FPGA平台(如Xilinx Zynq)的工程鲁棒性。典型应用场景涵盖嵌入式网

weixin_42453228的博客 1337

麒麟信安3.3-6C电网版虚拟机安装避坑指南:从ISO下载到SSH配置全流程

本文提供麒麟信安3.3-6C电网版虚拟机的详细安装与配置指南。针对电力行业仿真测试需求,重点解析从ISO镜像获取、虚拟机环境准备、安装过程中的三大“雷区”(如多管理员密码逻辑、分区方案、网络配置)到首次启动后的网络、SSH及root策略配置的全流程避坑要点,帮助技术人员高效、安全地完成部署。

rainy的博客 854

解析每天认识一个设计模式-组合模式:树形结构的统一接口艺术怎么做

解析javascript异步进阶怎么做

ACASCASCAS的博客 745

SCADA|用KingSCADA实现设备台账的查询功能

以上为用KingSCADA实现设备台账的查询功能,另外还有一些细节功能,比如当点击增加按钮时弹出的信息窗口内的信息希望是在选中的某行信息,只要找到差不多的设备,修改个别参数即可,避免增加时弹出空白页,所有信息都需要填写。以上为实现设备台账查询的最简单实现,实际项目中可能会更复杂,你做过哪些设备台账或相关的功能,有比较好的创意或高难度功能方法,欢迎在留言区评论,或在交流群探讨,互通有无,共同进步。首先完成界面的组态工作,主要是通过查询按钮,查询SQLServer数据库的设备台账数据,然后填充到报表内。

做有价值的事,积累有价值的笔记! 480

探讨一下每天认识一个设计模式-组合模式:树形结构的统一接口艺术的过程

探讨一下javascript异步进阶的过程

ACASCASCAS的博客 717

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

解析每天认识一个设计模式-组合模式:树形结构的统一接口艺术的原则

解析javascript异步进阶的原则

ASADGSDASXA的博客 639

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

了解一下每天认识一个设计模式-组合模式:树形结构的统一接口艺术怎么做

了解一下javascript异步进阶怎么做

ASADGSDASXA的博客 861

分享一个每天认识一个设计模式-组合模式:树形结构的统一接口艺术的用法

分享一个javascript异步进阶的用法

ACASCASCAS的博客 749

探索每天认识一个设计模式-组合模式:树形结构的统一接口艺术的用法

探索javascript异步进阶的用法

ACASCASCAS的博客 941

说一说每天认识一个设计模式-组合模式:树形结构的统一接口艺术怎么做

说一说javascript异步进阶怎么做

ASADGSDASXA的博客 589

分享一个每天认识一个设计模式-组合模式:树形结构的统一接口艺术怎么做

分享一个javascript异步进阶怎么做

ASFASFASAXA的博客 639
上一篇: 带你了解每天认识一个设计模式-组合模式:树形结构的统一接口艺术的编程语言
下一篇: 了解一下每天认识一个设计模式-组合模式:树形结构的统一接口艺术可操作性
普通网友
博客等级 码龄1年 37粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值