p2p、分布式,区块链笔记: Libp2p分散打孔 2022 IEEE 第 42 届分布式计算系统国际会议研讨会 (ICDCSW)

news2024/10/3 16:50:46

Decentralized Hole Punching

  • 我们提出了一种内置于对等网络库 libp2p [1] 中的去中心化打洞机制。打洞对于对等网络至关重要,它使每个参与者能够直接与任何其他参与者通信,尽管被防火墙和 NAT 隔开。去中心化的 libp2p 打洞协议利用了类似于 STUN(RFC 8489 [2])、TURN(RFC 8566 [3])和 ICE(RFC 8445 [4])的协议,而无需任何中心化基础设施。具体而言,它不需要任何有关网络参与者的先前知识,除了至少一个(任意)节点来引导对等发现。关键见解是,用于打洞的协议(即地址发现和中继协议)可以构建为对资源的需求可以忽略不计。这使得网络中的任何参与者都可以运行这些,从而能够协调打洞尝试,假设至少有一小部分节点不在防火墙或 NAT 后面。

1 INTRODUCTION

  • 消费者设备以及公司网络中的计算机通常位于网络地址转换器(NAT)和(或)防火墙后面。这些设备通常允许(相对)不受阻碍地从网络内部访问互联网,但会阻止从互联网上的计算机到网络上的本地机器的传入连接。
  • 虽然这种网络配置提供了安全和隐私优势,但它对对等(p2p)应用程序的连接提出了重大挑战[6]。在大多数对等网络中,只有一小部分节点资源充足且可公开访问。大多数节点在有限的资源和防火墙和/或NAT后面运行。这些有限节点之间的直接连接是对等网络整体正常运行的关键。因此,已经开发了所谓的“hole punching”技术,以促进位于此类NAT和防火墙后面的节点之间建立直接连接。最近的测量[?]发现IPFS p2p网络中约52%的节点位于NAT之后。
  • 传统上,启动需要运行STUN(NAT会话穿越实用程序/Session Traversal Utilities for NAT)的协调服务器和ICE(交互式连接建立/Interactive Connectivity Establishment)的协调
  • 因此,分散这种基础设施使网络更能抵御有针对性的攻击和诱惑的审查,同时消除了维护服务器的必要性。

2 NATSANDFIREWALLS

  • NAT可以通过将地址从内部网络中的节点映射到外部(面向互联网)地址的方式进行分类。本文将使用RFC 4787[5]中使用的术语。一般来说,NAT是一种将内部地址元组 𝑋 : 𝑥 𝑋:𝑥 X:x(IP和端口)映射到外部地址元组 𝑋 ′ : 𝑥 ′ 𝑋':𝑥' X:x的设备。NAT类型是通过查看由NAT配置的结果( 𝑋 1 ′ : 𝑥 1 ′ 𝑋_1':𝑥_1' X1:x1 𝑋 2 ′ : 𝑥 2 ′ 𝑋_2':𝑥_2' X2:x2)与外部地址( Y 1 : y 1 Y_1:y_1 Y1:y1 Y 2 : y 2 Y_2:y_2 Y2:y2)之间的关系来确定的。
    • Endpoint-Independent Mapping: 对于所有地址( Y 1 : y 1 Y_1:y_1 Y1:y1 Y 2 : y 2 Y_2:y_2 Y2:y2),从同一内部地址 𝑋 : 𝑥 𝑋:𝑥 X:x发送的数据包都映射到同一地址 𝑋 ′ : 𝑥 ′ 𝑋':𝑥' X:x
    • Endpoint-Dependent Mapping: 从同一内部地址 𝑋 : 𝑥 𝑋:𝑥 X:x发送的数据包映射到不同地址 𝑋 ′ : 𝑥 ′ 𝑋':𝑥' X:x。当发送到不同的地址元组时,组合 Y 1 : y 1 Y_1:y_1 Y1:y1 Y 2 : y 2 Y_2:y_2 Y2:y2不同(称为地址和端口相关映射),或者当发送到不同的IP地址时, Y 1 Y_1 Y1 Y 2 Y_2 Y2不同(称为地址相关映射)。

在这里插入图片描述

  • 使用端点无关映射的NAT可以可靠地打孔。节点可以依赖其外部地址 𝑋 ′ : 𝑥 ′ 𝑋':𝑥' X:x来保持稳定,并将此地址通告给其他节点。另一方面,没有可靠的方法使用端点依赖映射来穿透NAT;难点在于预测NAT将分配的端口,随着并发连接尝试的增加,这会变得更加困难。
  • 就我们的目的而言,在最基本的配置中,防火墙在概念上比NAT更简单。防火墙确保来自网络外部地址的数据包只有在之前(在特定时间范围内)从网络内部发送到同一地址时才能通过防火墙。

3 DIRECT CONNECTI ON ESTABLISHMENT IN LIBP2P

  • libp2p使用流多路复用连接,要么利用QUIC流,要么在TCP连接的情况下应用流多路复用器。连接始终是加密的,节点在加密握手期间验证彼此的身份。
  • 运行在libp2p之上的应用程序协议从libp2p堆栈请求流,以便与对等体交换应用程序数据。同时,libp2p本身使用流来运行各种libp2p内部协议。
  • 在下文中,我们将描述如何利用各种libp2p功能在NAT和防火墙中打孔。

3.1 Identify Protocol

  • Identify通常是在新建立的libp2p连接上运行的第一个协议。它服务于libp2p堆栈中的各种用例,但为了讨论的目的,它提供了与STUN协议(RFC 8489[2])大致相似的功能。对等体将观察到的地址(以及其他信息)发送给新连接的对等体。这允许该节点发现其公共IP地址和端口,并推断其是否位于NAT之后。通过观察来自多个对等体的报告地址,该节点还可以推断其位于使用端点依赖或端点独立映射(endpoint-dependent or endpoint-independent mappings)的NAT之后。
  • 使用Identify而不是STUN具有多种优势:
    首先,它本质上是免费的,因为它重用了现有的连接。第二,
    它不需要任何额外的基础设施或配置,因为libp2p网络上的绝大多数节点都支持此协议。第三,可以假设该信息比从STUN连接中获得的信息更可靠,因为该连接利用了与穿孔连接相同的传输协议集。

3.2 AutoNAT Protocol

  • AutoNAT协议是2018年推出的libp2p协议。它用于确定节点的可达性。Identify无法提供这些信息:仅仅知道NAT在传出的数据包上使用某个IP地址并不一定意味着其他节点能够从互联网成功拨打该地址。
  • 使用AutoNAT,节点可以请求peer在一组给定的地址上拨打新连接。然后,peer会报告是否成功建立了新的连接,以及具体的地址。
  • 如果这些定期回拨成功,则节点可以得出结论,它不在阻止传入连接的NAT或防火墙之后。在下文中,我们称之为“公共节点”。另一方面,如果这些回拨尝试经常失败,则节点可以得出结论,它无法接收传入连接(在没有事先协调的情况下),并被称为“专用节点(private node)”。公共节点向私有节点提供(有限的)中继服务。相反,私有节点可能会开始搜索并获取中继服务器的预订,以便稍后与其他节点协调打孔。

3.3 Circuit v2 Protocol

  • Circuitv2是一种中继协议,主要用于协调打孔。该协议的设计非常轻量级,因为运行中继服务器在处理能力或带宽方面不会产生任何不可忽视的成本。
  • 虽然这意味着默认情况下Circuit v2中继不能用作TURN风格(RFC 8656[3])的中继服务器,该服务器在两个节点之间中继整个流量,但它允许网络上绝大多数公共libp2p节点提供中继服务。
  • 为了实现这种最小的占地面积,Circuit v2采用了多种策略:首先,希望使用中继服务的专用节点需要获得该中继的预留。中继服务器限制当前预订的数量,并在达到限制后拒绝传入的预订请求。其次,每个保留仅在特定持续时间内有效,并且只允许在时间有限的中继连接中交换有限数量的数据。
  • 一旦获得预订,private node就会确保与中继服务器的连接保持活动状态——毕竟,中继将无法拨打与该节点的连接。在实践中,private node试图同时与几个中继进行预订。
  • 在获得预订后,节点通告它可以通过中继服务器访问。然后,其他节点能够首先连接到中继服务器,然后要求中继将连接“rely(转发; 转播)”到private node。为此,中继服务器向private node点打开一个新流,并向其通知传入的连接尝试。一旦private node同意建立连接,中继器就会将外部节点流中的所有数据复制到此流上,反之亦然,从而在两个节点之间有效地创建双向字节流。
  • 这两个节点使用此字节流建立虚拟(加密)libp2p连接。这意味着恶意中继无法拦截或更改中继连接上发送的数据。它能做的最糟糕的事情就是停止转发数据,这是libp2p节点能够很好地处理的情况——互联网上的连接经常因各种原因中断。

3.4 HolePunchCoordination (DCUtR- Direct Connection Upgrade through Relay)

  • 节点使用DCUtR协议(通过中继进行直接连接升级,Direct ConnectionUpgradethrough Relay)来协调通过中继连接建立直接连接。该协议的设计非常轻量级,在正常情况下,流只需要2次网络往返,每个方向的交换量小于500字节。
  • 一旦私有节点接受中继连接,即被视为协议的发起者,协议交互就会被触发。此时,它不知道其对等节点是公共节点还是私有节点,但它确实通过身份验证获得了对等节点的地址。如果对等体是公共节点,则不需要打孔:发起者可以简单地拨打与对等体的直接连接。这被称为连接反转,如图2所示。

在这里插入图片描述

  • 如果直接连接尝试失败,发起者会得出结论,其对等方最有可能位于NAT本身之后,并开始打孔过程以建立直接连接,如3所示。

在这里插入图片描述

  • 交换的第一条消息是CONNECT消息。它包含节点可用于打孔的地址列表。发起者将此消息发送给其对等方,对等方以CONNECT消息进行回复。发起者使用这些消息的交换来测量中继连接的网络往返时间。

  • 发起者在同一流上以SYNC消息进行响应。当对等方收到此消息时,它会立即开始拨打发起者的地址(如CONNECT消息中所传达的)。启动器等待一半的往返时间(如前一步所测量的),然后它也开始建立直接连接。假设两个对等体之间的路径是对称的,则此同步过程会导致两个节点大约同时向其对等体发送第一个数据包,从而创建所需的NAT映射,让对等体的数据包通过。

  • 用于建立直接连接的确切机制取决于传输协议。在接下来的部分中,我们将描述打孔如何在TCP和QUIC上工作。

  • 一旦在两个节点之间建立了方向连接,就不再需要中继连接,并且可以由端点主动关闭。

  • 3.4.1 HolePunchingonTCP. TCP打孔是一个经过充分探索的概念。它利用了这样一个事实,即与正常的、众所周知的TCP三次握手(SYN、SYN-ACK、ACK)相反,当两个节点在发送SYN后都收到SYN包(而不是SYN-ACK包)时,也可以建立TCP连接。这被称为TCP同步开放[7]。上一节中描述的协调过程确保两个节点同时发送各自的SYN数据包。

  • 3.4.2 Hole Punching on QUIC. 为了打孔QUIC连接,我们采用了一种据我们所知以前文献中没有描述过的技术。

  • 与TCP相反,TCP同步开放用于建立连接,从每一侧启动QUIC连接将导致两个单独的连接,因为每个QUIC连接都由其QUIC连接ID唯一标识。

  • 相反,我们使用协调的角色来确定节点的行为:“客户端”角色开始拨打QUIC连接,而“服务器”发送一些UDP数据包,其中包含发往其他节点的随机有效载荷。这些数据包的唯一目的是创建NAT映射,以允许客户端的数据包通过NAT。

4 HOLE PUNCHING IN THE WILD

4.1 Preliminary Results

  • 在协议开发过程中,我们与协议实验室的约45名志愿者进行了对照实验。该设置由一个有限的中继服务器、一个在线状态服务器和参与者节点组成。参与者运行一个小型守护进程,宣布其存在,并定期尝试与其他参与者建立直接连接。这使我们能够用住宅网络和NAT设备测试我们的打孔程序。

  • 在TCP和QUIC上,打孔成功率分别为86%和93%。绝大多数打孔尝试在第一次尝试时就成功了,我们能够证明重试3次以上并没有提高成功率。

5 CONCLUSIONS

  • 我们提出了libp2p的打孔机制,在NAT和/或防火墙后面的对等体之间建立直接连接,而不依赖于集中式基础设施。当前的设置允许使用与端点无关的映射在NAT中打孔,并且可以扩展到将来使用其他NAT类型的技术。打孔机构已集成到go-libp2p和rust-libp2p中。随着2021年12月发布的v0.11.0 go ipfs版本[8],默认情况下,IPFSnetwork中的所有公共节点都启用了Circuitv2,到撰写本文时(2022年2月),这大约相当于所有公共节点的20%。一旦在NAT和/或防火墙后面的IPFS节点上默认启用,我们计划进行全面的测量,评估整个异构IPFS网络的打孔成功率。

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

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

相关文章

Vivado - BD(差分时钟、简单分频、RESET、KEY)

目录 1. 简介 1.1 要点 1.2 buffer 介绍 2. vivado 工程 2.1 Block Design 2.2 IBUFDS 2.3 BUFGCE_DIV 2.4 Processor System Reset 2.5 key_mod 2.6 led_drv 3. 编译与调试 3.1 XDC 3.2 Debug 4. 总结 1. 简介 1.1 要点 了解 Utility Buffer v2.2 中的 Buffer…

关于HTML 案例_个人简历展示01

案例效果展示 代码 <!DOCTYPE html> <lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>个人简历信息</title> </he…

C语言高阶【1】--动态内存管理【1】(可以灵活的申请和使用内存,它不香吗?)

本章概述 为什么要有动态内存分配&#xff1f;malloc函数和free函数calloc函数和realloc函数常见的动态内存的错误彩蛋时刻&#xff01;&#xff01;&#xff01; 为什么要有动态内存分配&#xff1f; 情况描述&#xff1a;当我们创建一个变量时&#xff0c;比如&#xff0c;i…

《中安未来护照阅读器 —— 机场高效通行的智慧之选》

在机场&#xff0c;高效与准确的旅客信息处理至关重要。中安未来护照阅读器&#xff0c;为机场带来全新的智能化体验。它能够快速准确地读取护照信息&#xff0c;自动识别多种证件类型&#xff0c;极大提高了值机、安检等环节的效率。无论是繁忙的国际航站楼&#xff0c;还是国…

51单片机的串口

目录 一、串口的介绍 1、硬件电路 二、51单片机的UART 1、串口参数及时序图 2、串口模式图 3、串口和中断系统结构图 4、串口相关寄存器 三、串口向电脑发送数据 1、通过STC-ISP软件 四、电脑通过串口控制LED 1、主函数 2、 UART串口通信模块 一、串口的介绍 串口是一…

倒排索引是什么

倒排索引 简单了解&#xff1a; 什么是正向索引? 基于文档id创建索引。查询词条时必须先找到文档&#xff0c;而后判断是否包含词条 什么是倒排索引? 对文档内容分词&#xff0c;对词条创建索引&#xff0c;并记录词条所在文档的信息。查询时先根据词条查询到文档id&#…

C++和OpenGL实现3D游戏编程【连载13】——多重纹理混合详解

🔥C++和OpenGL实现3D游戏编程【目录】 1、本节要实现的内容 前面说过纹理贴图能够大幅提升游戏画面质量,但纹理贴图是没有叠加的。在一些游戏场景中,要求将非常不同的多个纹理(如泥泞的褐色地面、绿草植密布的地面、碎石遍布的地面)叠加(混合)起来显示,实现纹理间能…

WPS(金山文档)与金蝶云星空通过HTTP实现连接

WPS(金山文档)通过HTTP与金蝶云星空实现数据互通 该方式不需要通过金蝶SDK webapi官方文档地址&#xff1a;https://vip.kingdee.com/article/407944297573586944?langzh-CN&productLineId1&isKnowledge2 一、两种方式 airscript脚本发送http请求和PY脚本编辑器发送…

SCoRe: 通过强化学习教导大语言模型进行自我纠错

大语言模型(LLMs)在推理任务中,如数学问题求解和编程,已经展现出了优秀的性能。尽管它们能力强大,但在实现能够通过计算和交互来改进其回答的算法方面仍然面临挑战。现有的自我纠错方法要么依赖于提示工程,要么需要使用额外的模型进行微调,但这些方法都有局限性,往往无法产生有…

Java项目实战II基于Java+Spring Boot+MySQL的海滨体育馆管理系统的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着健康意识的提升和体育运动的普及&#xff0c;海滨体育馆作为集休闲、健身、娱乐于一体的综合性场…

MongoDB伪分布式部署(mac M2)

1. 序言 本博客是上一博客的进阶版&#xff1a;mac M2安装单机版 MongoDB 7.x&#xff0c;上一博客可以看做是单机、单节点部署MongoDB本博客将介绍单机、多服务部署MongoDB&#xff0c;实际就是伪分布式部署 2. 副本集(Replica Set)方式部署 2.1 什么是副本集&#xff1f; …

DNS与ICMP

一、DNS 在TCP/IP协议中&#xff0c;要用IP地址和端口号来连接服务器&#xff0c;但是直接输入数字用户体验感不好&#xff0c;所以就发明了主机号&#xff08;字符串&#xff09;&#xff0c;用host文件作主机名与IP的映射关系储存。 随着数量的增多&#xff0c;手动管理太麻…

【机器学习】集成学习——提升模型准确度的秘密武器

【机器学习】集成学习——提升模型准确度的秘密武器 1. 引言 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过结合多个弱模型来提升整体预测准确性的技术。通过将多个模型的预测结果进行组合&#xff0c;集成学习在复杂任务中展现了极强的泛化能力。本文将探讨…

基于微信的乐室预约小程序+ssm(lw+演示+源码+运行)

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

深入探讨指令调优的局限性

深入探讨指令调优的局限性 摘要 指令调优&#xff08;Instruction Tuning, IT&#xff09;是通过使用指令-响应对训练大型语言模型&#xff08;LLMs&#xff09;的过程&#xff0c;已成为将基础预训练LLMs转化为开放领域对话代理的主要方法。尽管IT取得了显著的成功和广泛的应…

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例 在某地市的 XX 音乐节保障准备期间&#xff0c;为确保活动期间的网络质量&#xff0c;现场新开了 4.9G HUAWEI 室外基站。在网络优化和测试中&#xff0c;发现UE无法实现从 2.6G 到 4.9G 的正常切换。虽然现场具备 4.9G信号覆…

算法与数据结构--二分查找

原理 简单说就是每次二分取中间值&#xff0c;然后将中间值与我们要找的值比较&#xff0c;如果比它大就移动左边界到其右侧&#xff0c;如果比它小就移动右边界到其左侧。直到中间值等于该值或者经过移动直至右边界在左边界左侧为止。 二.具体实现 public int searchInsert(…

数据结构 ——— 单链表oj题:反转链表

目录 题目要求 手搓一个简易链表 代码实现 题目要求 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 手搓一个简易链表 代码演示&#xff1a; struct ListNode* n1 (struct ListNode*)malloc(sizeof(struct ListNode)); assert(n1);…

【重学 MySQL】五十三、MySQL数据类型概述和字符集设置

【重学 MySQL】五十三、MySQL数据类型概述和字符集设置 MySQL数据类型概述MySQL字符集设置注意事项 MySQL数据类型概述 MySQL是一个流行的关系型数据库管理系统&#xff0c;它支持多种数据类型&#xff0c;以满足不同数据处理和存储的需求。理解并正确使用这些数据类型对于提高…

已解决:org.springframework.web.HttpMediaTypeNotAcceptableException

文章目录 写在前面问题描述报错原因分析&#xff1a; 解决思路解决办法1. 确保客户端请求的 Accept 头正确2. 修改 Controller 方法的 produces 参数3. 配置合适的消息转换器4. 检查 Spring 配置中的媒体类型5. 其他解决方案 总结 写在前面 在开发过程中&#xff0c;Spring 框…