【libp2p——NAT】

news2024/9/28 12:09:48

1. 什么是NAT

NAT(Network Address Translation,网络地址转换)是指一种网络技术,它允许多个设备通过一个公共IP地址连接到互联网。NAT通常被用在家庭或小型办公室的路由器上,以允许多台计算机共享一个互联网连接。这种做法可以节省IPv4地址空间,并且为内部网络提供了一定程度的安全性,因为外部网络无法直接访问内部网络中的设备。

许多路由器支持用于端口转发的自动配置协议,最常见的是UPnP(通用即插即用)或NAT-PMP(NAT端口映射协议)。

2. libp2p如何解决NAT问题

对于libp2p这样的点对点通信库来说,NAT是一个挑战,因为它使得两个位于不同私有网络后面的节点很难直接建立连接。libp2p需要处理NAT穿透问题,以便让这些节点能够相互通信。

为此,libp2p采用了多种技术和协议来解决这个问题,包括但不限于:

  1. STUN (Session Traversal Utilities for NAT): STUN是一种协议,用于发现NAT类型以及获取外部可见的IP地址和端口。
  2. TURN (Traversal Using Relays around NAT): 当直接的P2P连接不可行时,TURN服务器可以作为中继点来转发数据流。
  3. ICE (Interactive Connectivity Establishment): ICE是一种框架,结合了STUN和TURN的功能,用来尝试建立最佳的连接路径。
  4. Hole Punching: 这是一种技术,其中一个节点可以通过向另一个节点发送数据包来“打洞”穿越NAT,从而创建一条直接的UDP连接路径。
  5. UPnP (Universal Plug and Play) / NAT-PMP (NAT Port Mapping Protocol): 这些协议允许应用程序自动配置路由器上的端口映射,以便外部网络可以直接访问内部网络中的服务。

libp2p通过使用诸如STUN、TURN等技术来帮助节点发现它们对外部世界的可访问地址,从而避免了这个问题。此外,libp2p还利用自动NAT配置协议(如UPnP或NAT-PMP)来设置端口映射,以确保节点能够接收来自外部的入站连接。

3. AutoNAT

3.1 背景

虽然识别协议允许对等节点互相告知它们观察到的网络地址,但有时这些地址是不可访问的,因为该对等节点可能位于一个私有网络中(即,在NAT或防火墙之后)。

为了解决广播和尝试连接不可达地址的问题,libp2p实现了一个名为AutoNAT的协议。该协议允许节点判断它们是否位于NAT之后。通过这种方式,节点可以确定它们的公网可达性,并避免广播那些实际上无法被其他节点访问的地址,从而提高P2P网络的整体效率和稳定性。

3.2 协议介绍

AutoNAT允许一个节点通过拨打预定的公共地址来请求其他节点。

  • 对于NAT背后的私有节点,强烈建议如下
    • 不广播私有地址
    • 通过NAT获得一个预留的中继的地址
    • 广播这个中继地址
  • 对于在公网上的节点
    • 启动中继功能以帮助其他节点
    • 考虑激活DHT服务器模式以改善与公网的连接

如果大多数拨号尝试都成功,则该节点可以合理地确定它不在 NAT 后面。另一方面,如果大多数拨号尝试都失败,则强烈表明 NAT 正在阻止传入连接。

3.3 协议实现

AutoNAT协议使用协议ID为/libp2p/autonat/1.0.0,涉及到Dial和DialResponse消息的交换。

启动该协议时,节点1发送一个Dial消息到一个的节点2,该消息包含一个列表的multiaddresses。节点2开始拨打这些地址。如果只少有一个dial是成功的,则节点2发送一个DialResponse消息给node1。消息的主体是ResponseStatus: SUCCESS。如果全部失败,则返回ResponseStatus: E_DIAL_ERROR。
节点1可以通过返回的消息判断自己是否在一个NAT后。

如果响应表明成功,则该节点可能不在NAT后面,并且不需要使用中继服务器来改善其连通性。如果响应指示错误,则该节点可能在NAT之后,可能需要使用中继服务器与网络中的其他节点进行通信。

发起方使用从多个对等体获得的响应来确定自己的NAT状态。如果超过3个节点报告一个成功拨号的地址,节点应该假设它不在NAT后面,并且是可公开访问的。另一方面,如果超过3个对等体报告拨号失败,则该节点应该假定它是不可公开访问的。

4. Circuit Relay

“电路中继”是一种传输协议,它通过第三方“中继”节点在两个对等节点之间路由流量。在许多情况下,对等节点无法穿越其网络地址转换(NAT)和/或防火墙,从而使其公开可访问。目前p2p实现了两个版本的协议,以下主要以v2版本为主。
在这里插入图片描述

4.1 p2p中的Circuit Relay

为了在面对NAT等连接障碍时实现点对点架构,libp2p定义了一种名为p2p-circuit的协议。当一个对等节点无法监听公共地址时,它可以拨号连接到一个中继对等节点,该节点将保持一个长期开放的连接。其他对等节点将能够使用p2p-circuit地址通过中继对等节点进行拨号,该地址将转发流量到其目的地。

电路中继协议的灵感来自于TURN,它是交互式连接建立(Interactive Connectivity Establishment)集合中的一部分NAT穿越技术。

中继协议的一个重要方面是它不是“透明的”。换句话说,源节点和目标节点都意识到流量正在被中继。这一点很有用,因为目标节点可以看到用于打开连接的中继地址,并且可能使用它来构建返回源节点的路径。它也不是匿名的——所有参与者都使用其对等ID进行标识,包括中继节点。

4.2 Relay addresses(中继地址)

中继电路是用一个多地址来标识的,这个多地址包括传输的对等体(侦听对等体或“中继目标”)的对等体ID。

假设我有一个libp2p节点,其Peer ID为QmAlice。我想把我的地址给我的朋友QmBob,但我在NAT后面,不让任何人直接拨给我。

这样的地址表示只能表面这个消息是通过电路中继和p2p协议试图连接到QmAlice这个唯一标识
/p2p-circuit/p2p/QmAlice
包括特定中继对等体QmRelay的标识。如果对等端已经知道如何打开与QmRelay的连接,他们将能够联系到我们。
/p2p/QmRelay/p2p-circuit/p2p/QmAlice
更好的方法是在地址中包含中继对等体的传输地址。假设我已经用对等体ID QmRelay建立了到特定中继的连接。他们通过识别协议告诉我,他们正在监听IPv4地址198.51.100.0的55555端口上的TCP连接。我可以构造一个地址,它描述了通过传输的特定中继给我的路径:
/ip4/198.51.100.0/tcp/55555/p2p/QmRelay/p2p-circuit/p2p/QmAlice

以上/p2p-circuit/之前的所有内容都是中继对等体的地址,其中包括传输地址和它们的对等体ID QmRelay。

/p2p-circuit/之后是线路另一端的对等体ID, QmAlice。
在这里插入图片描述

  1. 节点A位于NAT和/或防火墙后面,例如通过自动识别服务检测到。
  2. 因此,节点A向中继R请求预约,即节点A请求中继R代表它侦听传入的连接。
  3. 节点B想要与节点a建立连接。鉴于节点a没有发布任何直接地址,只有一个中继地址,节点B连接到中继R,要求中继R中继到a的连接。
  4. 中继R将连接请求转发给节点A,最终中继A和B发送的所有数据。

5. DCUtR

5.1 背景知识

使用中继作为代理来遍历nat,但是这在扩展和维护方面的成本可能很高,并且可能导致低带宽、高延迟的连接。穿孔是另一种通过使NAT后面的两个节点直接通信来实现NAT穿越的技术。然而,除了中继节点之外,它还需要另一个称为信令服务器的基础设施。libp2p提供了一个穿孔解决方案,它消除了对集中式信令服务器的需求,并允许使用分布式中继节点。

5.2 通过中继直接连接

libp2p DCUtR (Direct Connection Upgrade through Relay)是一种通过打孔在节点之间建立直接连接的协议,不需要信令服务器。DCUtR包括同步和打开到每个对等端预测的外部地址的连接。

DCUtR协议使用协议ID /libp2p/ DCUtR,包括ConnectSync消息的交换。
DCUtR协议支持TCP、QUIC等不同类型的连接,不同类型的连接建立过程不同。

6. Hole Punching

点对点网络上的节点可以分为公共和非公共两类。公共节点是那些可以不受阻碍地访问互联网的节点,而非公共节点位于某种防火墙后面。这适用于家庭和公司网络的大多数节点,以及移动电话。在大多数配置中,公共和非公共节点都可以拨号连接到其他公共节点。但是,不可能建立从公共互联网到非公共节点的连接。
在这里插入图片描述

6.1 如何拨打非公共节点

  • 拨号非公共节点的方法:
    • UPnP(通用即插即用):路由器和网络内计算机之间使用的协议。它允许计算机请求某些端口被并转发到该计算机。
    • 端口转发:在路由器上手动配置端口转发。
  • 限制
    • 在许多情况下,UPnP被路由器或防火墙禁用。UPnP也可能无法工作,这取决于路由器的固件。
    • 手动打开端口需要专业技术,并且不强制进行身份验证或授权。

6.2 可能的解决方案(hole punching)

6.2.1 Relaying overview

中继是一种用于在两端之间发送信息的机制。对于非公有节点:
节点A与中继节点R保持永久连接,当节点B想要连接到节点A时,它首先与节点R建立连接,节点R转发该连接上的所有数据包。中继增加了额外的延迟,并且是资源密集型的,因为节点R需要处理大量的流量。使用中继节点还需要技术专长。

6.2.2 如何利用节点R来促成节点A和B直接连接

在其他选择都不够的情况下,网络可以使用一种称为打孔的技术来与非公共节点建立连接。

每个节点连接到中继节点并共享其外部地址和端口信息。服务器临时存储节点的信息,并将每个节点的信息转发给其他节点。客户端可以使用这些信息建立彼此之间的直接连接。

以两个节点A和B为例,它们想要相互拨号:

  1. 两个节点的第一个数据包(例如,在TCP的情况下,一个SYN)通过它们各自的路由器。
  2. 路由器将一个5元组添加到路由器的状态表中。(修改路由器的表)
  3. PacketA和PacketB在各自路由器的防火墙上“打洞”。
  4. 两个包到达对方的路由器。
  5. 当A的数据包到达Router_B时,Router_B检查自己的状态表,发现一个5元组是在节点B发送的数据包中添加的。
  6. 路由器通过“打孔”将数据包转发给B。B的数据包也是如此;到达Router_A后,在Router_A的状态表中匹配一个5元组,将报文转发给a。

路由器状态表(路由表)是存储在路由器中的数据,它列出了到特定网络目的地的路由。5元组结构包括源IP地址、源端口、目的IP地址、目的端口和传输协议。
在这里插入图片描述

6.3 libp2p中的Hole punching

受ICE协议的启发,libp2p包括一个分散的穿孔功能,允许防火墙和NAT穿越,而不需要像STUN和TURN这样的中央协调服务器。

6.3.1 阶段一Preparation

6.3.1.1AutoNAT

在这里插入图片描述
确定节点是否可拨号,例如,发现节点是否位于NAT或防火墙后面。

  • B向它所在网络上的Other_Peers(例如,引导节点)伸出手,并要求每个节点在一组它怀疑可以到达的地址上拨号。libp2p节点有多种发现其地址的方法,但最突出的是使用libp2p标识协议。
  • Other_Peers尝试拨打B的每个地址,并将结果报告给B。
  • 根据报告,B可以判断自己是否是公共节点,并确定是否需要打孔。
6.3.1.2 AutoRelay:动态发现和绑定网络中的中继节点。

IPFS通过Kademlia DHT使用查找方法发现k-最近的公共中继节点:/<RELAY_ADDR>/p2p-circuit/<PEER_ID_B>
在这里插入图片描述
B网络外的Other_Peers可以通过公共中继节点间接呼叫B。在IPFS的情况下,每个公共节点将充当一个中继。B将在Kademlia DHT上查找与其Peer ID最近的对等节点,或者选择已经连接到的公共节点的一个子集。

6.3.1.3 Circuit Relay:连接到发现的中继节点并请求预订。节点可以通过远程中继节点宣布自己可达。

在这里插入图片描述

  • Relay可以通过Circuit Relay v2限制用于中继连接的资源(例如,通过连接数、时间和字节)。在IPFS的情况下,这允许网络中的每个公共节点充当中继,而不会消耗大量资源。
  • 对于每一个被发现的中继
    • B连接到远程节点,并请求中继节点代替它侦听连接,称为reservation;
    • 如果Relay接受预订请求,则B可以宣布自己可通过Relay访问。

6.3.2 阶段二Hole punching

成功率(90%)

6.3.2.1 Circuit Relay(电路中继)

电路中继:通过公共中继节点建立安全的中继连接。节点A与中继节点建立直连。然后节点B通过中继节点请求到节点a的中继连接,创建一个双向通道,并使用TLS来保护该通道。
在这里插入图片描述

  1. A使用B的通告地址中包含的信息通过中继建立到B的中继连接。
  2. A首先建立到Relay的直接连接,然后从Relay请求到B的中继连接。
  3. Relay将请求转发给B并接受。
  4. 继电器将接收转发给A。
  5. A和B可以使用中继上的双向信道进行通信。
  6. A和B使用TLS等安全协议升级中继连接
6.3.2.2 DCUtR:使用DCUtR作为同步机构来协调冲孔。

在这里插入图片描述

  1. A通过Relay向B发送Connect消息。
  2. 连接包含a的地址。libp2p提供了多种机制来发现一个人的地址,例如,通过libp2p识别协议。
  3. B在中继连接上接收Connect消息,并回复一个包含其(非中继)地址的Connect消息。
  4. A测量发送消息和接收B消息之间的时间,从而确定A和B之间通过Relay的往返时间。
  5. 然后,A在中继连接上向B发送同步消息。
  6. A等待一半的往返时间,然后通过B的Connect接收到的地址直接拨打B。
  7. 一旦B收到A的Sync消息,它就直接使用A的Connect消息中提供的地址拨打A。
  8. 一旦A和B同时拨号,就会发生打孔。

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

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

相关文章

Tensorflow 2.0 cnn训练cifar10 准确率只有0.1 [已解决]

cifar10 准确率只有0.1 问题描述踩坑解决办法 问题描述 如果你看的是北京大学曹健老师的tensorflow2.0,你在class5的部分可能会遇见这个问题 import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.layers import Dense, Dropout,MaxPooling2D,Fla…

揭秘 MrBeast 爆款视频秘籍,视频从业者必看!

MrBeast 是美国第一网红&#xff0c;可能也是世界第一网红。他的YouTube频道在2024年9月拥有3.17亿订阅者&#xff0c;成为订阅者最多的频道。这一庞大的粉丝基础不仅代表了他的影响力&#xff0c;也反映了他所创造内容的受欢迎程度。 视频制作的高投入 MrBeast每个视频的拍…

死磕P7: JVM类加载那些事儿,一起探知类的前世今生(一)

这是「死磕P7」系列第 005 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 前面几篇介绍了 JVM 的区域划分及垃圾收集相关的内容&#xff0c;只是告诉了你我有一栋豪华大酒店&#xff0c;大楼里有哪些房间&…

高级前端进阶:揭秘 MemFire Cloud 的强大助力

在前端开发的道路上&#xff0c;我们总是在追求效率与速度的平衡&#xff0c;如何写出优雅的代码&#xff0c;如何让开发流程更加顺滑成为了每个前端开发者的目标。对于那些希望提升效率、减少繁琐开发步骤的开发者来说&#xff0c;MemFire Cloud&#xff0c;一款国产的一站式应…

git忽略python项目中的__pycache__目录

一&#xff1a;编写.gitignore文件 # 忽略 tensorone-storage-log/ 目录 tensorone-storage-log/# 忽略 file_test 目录 file_test/# 忽略 .idea 目录 /.idea# 忽略 .vscode 目录 .vscode# 忽略 __pycache__ 目录及其所有子内容 **/__pycache__/ 二&#xff1a;提交更改&#x…

越来越卷,事无巨细的日报、周报难为死IT牛马们了!如何破局?

现在这环境做牛马真难呀 某中厂朋友吐槽说&#xff1a;“经济下行&#xff0c;公司要求越来越过分&#xff0c;不但要求9106&#xff0c;还要天天写日报都做了什么事项&#xff0c;每个事事项花了多少时间&#xff0c;要用不少时间来写&#xff1b;周报也是要求很细 还要总结&…

蜂鸟bebirdt15、西圣find、泰视朗可视挖耳勺好用吗?测评数据对比看这里

可视挖耳勺在当下已经被广泛使用&#xff0c;不过对于新手来说&#xff0c;选择一款优质产品却并不容易。蜂鸟t15、西圣find、泰视朗可视挖耳勺好用吗&#xff1f;作为一个测评博主&#xff0c;近期有不少用户问我这个问题。 根据目前市场上可视挖耳勺的品牌情况来看&#xff0…

宝塔centOs添加node环境变量

宝塔Linux添加node全局环境变量 ln -s /www/server/nodejs/v20.17.0/bin/node /usr/bin/node ln -s /www/server/nodejs/v20.17.0/bin/npm /usr/bin/npm ln -s /www/server/nodejs/v20.17.0/bin/pnpm /usr/bin/pnpm

Redis: Sorted Set 底层算法的简单分析

概述 我们先看下 Shorted Set 有序集合的内部数据结构所谓有序集合&#xff0c;比如有个容器&#xff0c;容器里边都已经排好序了&#xff0c;那无非就是快速的查找和插入不管你是查找还是插入&#xff0c;肯定要确定那个位置最简单的办法就是从最开头开始&#xff0c;挨个比较…

TPAMI 2024 | 数据不平衡克星,ProCo算法:长尾视觉识别的终极解决方案!

题目&#xff1a;长尾视觉识别的概率对比学习 作者&#xff1a; Chaoqun Du, Yulin Wang, Shiji Song, Gao Huang 摘要 长尾分布经常出现在现实世界的数据中&#xff0c;其中大量的少数类别包含有限数量的样本。这种不平衡问题极大地损害了主要为平衡训练集设计的标准监督学…

AI表情包项目变现实操,适合新手小白

做表情包还能赚钱吗&#xff1f;可能很多朋友会觉得这个问题很奇怪&#xff0c;毕竟我们平时用的表情包都是免费的。今天就带大家了解一下表情包背后的商业模式。 1、项目概况 微信表情包的售价一般在1~200元之间&#xff0c;最低售价是1元。可以看到网上这些表情包的销量还是…

【反素数】

题目 思路 首先分析 的性质 一定是 中约数最大的一定是约数同是最大的数字中值中最小的进一步挖掘性质&#xff0c;紧贴枚举的做法 约数最大值最小&#xff08;也决定了层数、其它约束&#xff09;&#xff0c;是枚举的比较条件实现上述目的&#xff0c;枚举的质数种类在大小…

数据结构:栈 及其应用

逻辑结构&#xff1a; 栈&#xff08;Stack&#xff09;是一种遵循后进先出&#xff08;LIFO, Last In First Out&#xff09;原则的有序集合 &#xff08;受限的线性表&#xff09;。这种数据结构只允许在栈顶进行添加&#xff08;push&#xff09;或删除&#xff08;pop&…

爆火!大模型算法岗 100 道面试题全解析,赶紧收藏!

大模型应该是目前当之无愧的最有影响力的AI技术&#xff0c;它正在革新各个行业&#xff0c;包括自然语言处理、机器翻译、内容创作和客户服务等等&#xff0c;正在成为未来商业环境的重要组成部分。 截至目前大模型已经超过200个&#xff0c;在大模型纵横的时代&#xff0c;不…

后端学习路线

后端学习路线 一、编程语言 至少需要学习一门编程语言&#xff0c;建议学习JAVA和GO语言。 二、数据库 数据库分为关系型数据库和非关系型数据库&#xff0c;区别在于分关系型数据库常用于大数据&#xff0c;而非关系型数据库一般不在大数据方面使用。 关系型数据库&#x…

重塑未来:组织文化建设助你应对时代挑战

在当今迅速变化的时代&#xff0c;变化已成为不可避免的常态。无论是技术的迅猛发展&#xff0c;还是市场需求的瞬息万变&#xff0c;个人和组织都必须学会适应和迎接变化。本文将探讨变化的重要性&#xff0c;并通过系统思维和敏捷方法论的视角&#xff0c;阐述如何有效地管理…

ai生产力 输出内容变现新方式 AI头像生成教程和变现方式分析

ai生产力 输出内容变现新方式 AI头像生成教程和变现方式分析&#xff1a;特别是以AI头像与壁纸生成为例&#xff0c;我们可以详细分析其制作过程和变现方式。 制作过程 选择合适的AI工具&#xff1a; 在市场上&#xff0c;存在多款AI生成图像的工具&#xff0c;如Stable Diff…

OJ在线评测系统 后端判题机架构搭建 使用原生实现Java安全管理器环境隔离

原生实现安全管理器环境隔离 限制用户的操作权限 文件 网络 执行 Java安全管理器 SecurityManager 来实现更严格的限制 是 Java 提供的保护 JVM Java安全的机制 可以实现更严格的资源和操作限制 编写安全管理器 只需要继承 SecurityManager类 我们可以从这个参数perm参数拿…

软件测试学习笔记丨curl命令发送请求

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32332 一、简介 cURL是一个通过URL传输数据的&#xff0c;功能强大的命令行工具。cURL可以与Chrome Devtool工具配合使用&#xff0c;把浏览器发送的真实请求还原出来&#xff0c;附带认证信…

Spring Boot打造:小徐影院管理平台

第1章 概述 1.1 研究背景 随着现代网络技术发展&#xff0c;对于小徐影城管理系统现在正处于网络发展的阶段&#xff0c;所以对它的要求也是比较严格的&#xff0c;要从这个系统的功能和用户实际需求来进行对系统制定开发的发展方式&#xff0c;依靠网络技术的的快速发展和现代…