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

【go-libp2p学习笔记】使用go-libp2p搭建中转服务器(circuit relay server) libp2p算是一个蛮新的库,提供了非常强大的p2p节点发现/连接/通信能力。IPFS的基石。 中文网上的**技术教程**比较少,所以抛砖引玉开一点坑来体验一下! 阅读详情

Decentralized Hole Punching

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网络的打孔成功率。
stun-client:基于[RFC8489](https)的C#编写的非常基本的STUN客户端 非常简单的STUN客户 顾名思义,这是一个非常简单完成的STUN客户端,它使用C#编写并且基于 ,可以在TCP或UDP上运行。 这是作为概念验证的目的,旨在使用STUN协议向NAT添加NAT打Kong。 它仅实现XOR-MAPPED-ADDRESS , MAPPED-ADDRESS和SOFTWARE属性,这些属性足以向公共STUN服务器请求IP端点。 如何使用 请不要 立即下载

相关推荐

力扣(Leetcode)第1题:两数之和(C语言版本)

题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2: 输入:nums = [3,2,4], target = 6

qq_39855356的博客 3319

什么是Libp2p,简单介绍

Libp2p(library peer-to-peer),是一个模块化的p2p网络架构,能够帮助开发p2p应用。该框架由一系列协议、规范和库组成,可以促进网络节点之间的p2p通信。

vxstar的博客 2662

Nginx源码安装和基础配置

Nginx简介 nginx: 世界第二大web服务器软件,以高并发、低消耗著称,源自于俄罗斯,创建者 Igor(伊戈尔),2004年开源,最早以代理服务器的身份出现,2015成立nginx公司,2019年以6.7亿被F5 Networks公司收购。 代理服务器: 正向:squid 反向: squid:最古老的代理服务器 LVS: 优点: 1.抗负载能力强、是工作在网络4层之上仅作分发之用 2.配置性比较低,这是一个缺点也是一个优点,简单不易出错 3.工作稳定,抗负载能力很强,有完整的双机热备方案

hjyhjy0的博客 500

libp2p 快速开始

Libp2p是一个模块化的网络栈,通过将各种传输和P2P协议结合在一起,使得开发人员很容易构建大型、健壮的P2P网络。

西京刀客 4920

Eureka常见面试题总结

点击关注我的博客原文 Eureka是Netflix组件的一个子模块,也是核心模块之一。云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移(来源springcloud中文网的介绍:https://www.springcloud.cc/)。下图总结了Eureka服务端(以下简称服务端)与Eureka客户端(以下简称客户端)之间协同工作的流程: 流程说明:...

u012105931的博客 2万+

DOSBOX 0.74模拟器安装Windows 95

DosBox本身带有5.0版的DOS系统,启动后虚拟一个Z盘存放有Dosbox特有的外部指令,如config.com、imgmount.com等,经测试,可以顺利安装各版本的windows 3.1系统,但是不能安装win95,需要用原版的dos镜像启动才能安装。1. 获取启动盘镜像文件 下载Win95启动软盘镜像文件,名为boot.img,放到DosBox 0.74的目录下。2. 制作硬盘镜像文件

xjnzhidao的博客 9311

干货|更通用的P2P网络协议栈——Libp2p

Libp2p通过upgrader的muxer模块将普通接口升级为支持流复用的接口,节点间数据传输时会在连接上通过流进行并行数据收发,而不是新建连接,从而减少了节点间新建连接的消耗。数据传输建立在节点连接的基础上,在可以拨号远程节点并建立连接之前,需要知道远程节点的监听地址。Libp2p通过“multiaddr”的编码方案来统一不同协议的地址格式,在Swarm模块根据“multiaddr”解析协议并调用相应协议的接口完成具体操作,从而达到了应用层不需要关注使用的传输层协议的目的。...

weixin_60043341的博客 2924

生成式引擎优化(GEO)全流程解析

生成式引擎优化(GEO)已成为AI时代数字营销新趋势,通过优化企业内容以提升在AI生成答案中的引用率。本文系统梳理了GEO优化的完整流程,包括:1)前期准备与市场调研;2)数据治理与知识库构建;3)模型适配与算法优化;4)内容权威性建设;5)本地化营销;6)效果监测与优化。研究显示,实施GEO的企业AI曝光率提升62%,转化率增长2.3倍。未来GEO将向多模态内容、实时个性化、垂直场景深化方向发展。企业需建立动态知识图谱,采用结构化数据标记,持续优化内容策略,以在AI搜索时代获取流量优势。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 3248

p2p、分布式,区块链笔记: libp2p基础

【代码】p2p、分布式,区块链笔记: libp2p基础。

ResumeProject的博客 1738

RT-Thread littefs控制GD32F4xx片内Flash

GD32F4xx RT-Thread下使用littefs 控制片内flash 调试记录

madao1234的博客 995

Android15音频进阶之解underrun与overrun思路(一百一十七)

本篇目的:Android15音频进阶之解underrun与overrun思路Underrun:发生在播放:APP准备的数据太少,导致底层没有音频数据可以播放,导致ADSP被“饿死了“,即Underrun。Overrun: 发声在录音:APP录音数据获取太慢了,导致底层录出来的数据太多了,APP播放不了,导致APP被“撑死了”,即Overrun。

Android系统攻城狮 2106

libp2p概览

Introduction to libp2p Why do we need libp2p? libp2p 是一个模块化的网络堆栈,从 IPFS 演变为一个独立的项目。 为了解释为什么 libp2p 是去中心化网络中如此重要的一部分,我们需要退后几步,了解它的来源。 libp2p 的初始实现始于 IPFS(一种对等文件共享系统)内部。让我们从探索 IPFS 旨在解决的网络问题开始。 Web 2.0 我们越来越喜欢互联网,并将其用于日常生活的方方面面,例如学习、与朋友和家人联系、购物、管理财务等等。 我们已经变

MyHerux的博客 3202

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【libp2p——NAT】

AutoNAT允许一个节点通过拨打预定的公共地址来请求其他节点。对于NAT背后的私有节点,强烈建议如下不广播私有地址通过NAT获得一个预留的中继的地址广播这个中继地址对于在公网上的节点启动中继功能以帮助其他节点考虑激活DHT服务器模式以改善与公网的连接如果大多数拨号尝试都成功,则该节点可以合理地确定它不在 NAT 后面。另一方面,如果大多数拨号尝试都失败,则强烈表明 NAT 正在阻止传入连接。

qq_45467608的博客 3060

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

为什么 ETH2.0 要选择 libp2p ?

如果你有持续关注Polkadot、Ethereum 2.0或Substrate的开发近况,你应该听说过libp2p。Libp2p 是一个便于使用者开发去中心化点对点应用的网络框架,它原先是IPFS的网络协议延申,如今已自成一家。 愿景 所有的分布式点对点网络,都会面临一系列不同于传统网络的挑战。Libp2p 是个通用工具包,有了它,开发者就可以在分布式应用上使用可插拔的网...

跨链技术践行者 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[libp2p的一些核心概念]

libp2使用对等体的身份和位置进行区分。对等体的身份是稳定的、可验证的,并在对等体的整个生命周期内有效。在特定网络上,在特定时间点,对等体可能具有一个或多个位置,可以用地址表示。例如,我可以通过全局IPv4地址198.51.100的TCP端口1234进行访问。在一个只支持TCP/IP或UDP over IP的系统中,我们可以很容易地使用熟悉的:表示法编写我们的地址,并将它们存储为地址和端口的元组。然而,libp2p被设计为传输无关,这意味着我们甚至不能假设我们将使用基于IP的网络。

qq_45467608的博客 1925

IPFS、区块链的libp2p

IPFS基本定义 IPFS即InterPlanetary File System,是一个基于内容寻址的、分布式 的、新型超媒体传输协议。IPFS支持创建完全分布式的应用。它旨在使 网络更快、更安全、更开放。IPFS是一个分布式文件系统,它的目标是 将所有计算设备连接到同一个文件系统,从而成为一个全球统一的存储 系统。 IPFS与区块链的基本关系 区块链是什么? 区块链实际上就是一个分布式数据库,而这个数据库是分布式的、基于密码学的分布式账本数据库。其具有分布式、不可篡改、开放与共识等基本特性。 但是,其具

qq_41393481的博客 2225

libp2p连接就像送快递?轻松看懂节点如何“找路”

特点类比快递网络实际效果多协议支持兼容汽车、火车、飞机适应各种网络环境自动寻址快递站帮你找地址无需手动配置复杂参数加密安全包裹上锁+身份验证防止数据泄露或篡改中继穿透顺丰网点代收突破路由器/NAT限制高效复用一条路跑多种车节省带宽,降低延迟让设备像快递网络一样灵活、可靠地通信,无论它们身处何地、用什么方式联网!

qq_23949975的博客 627

【libp2p-echo案例】

主机是在集群的顶部管理服务的抽象。它提供了一个清晰的接口,用于连接到给定远程对等节点上的服务。

qq_45467608的博客 1165

p2p、分布式,区块链笔记:libp2p通过libp2p_demo::network实现文件传递功能

主要依赖clap库进行命令行参数解析,使用async_std进行并行操作,使用libp2p_demo::network中的相关方法进行网络建立与文件传输,但是代码量却减少了很多,这是由于libp2p_demo::network对libp2p中的集群事件等相关方法,将文件传递功能进行了集成。

ResumeProject的博客 867

libp2p服务发现之 Multicast DNS(mDNS)

在libp2p中,mDNS和Kademlia DHT都是用于节点发现和连接管理的技术。当一个节点需要加入libp2p网络时,它可以通过mDNS和Kademlia DHT查找和连接其他节点,以建立对等网络。具体来说,mDNS通常用于在局域网中查找其他节点,而Kademlia DHT则是在广域网中查找其他节点。

西京刀客 3244

P2P网络编程-1-从分布式Hash表到LibP2P包的基本概念与使用

学习资料来源: https://zhuanlan.zhihu.com/p/49062384 https://colobu.com/2018/03/26/distributed-hash-table/ libp2p官方文档 本篇文章涵盖内容: 分布式Hash表、Kademlia算法 Libp2p的基本、核心概念 Libp2p的一个简单使用流程(手动编写ping协议实现) 基本的主机配置 一、基本概念 万事万物都要从其概念学起… 1.1 前置概念 分布式Hash表 查表式与计算式 关于分布式多节点情景.

文杰的博客 2672

判断P2P打洞能否成功的方法

在幻影米布串流中,有两种传输模式,P2P模式和转发模式。想要获得延迟更低、画质更优的产品体验,还是得走P2P模式。每个用户的传输方式,最终是由软件根据网络情况而决定的。如果P2P打洞失败,就会走转发模式。幻影米布提供免费的转发模式,而转发本身是需要一定的宽带成本的。因此,幻影米布即便在延迟方面的表现有些差强人意,也是可以理解的。如果对打洞原理,包括NAT的概率进行详细解释的话会有些复杂,我们用户只需要知道NAT有四种类型,分别是:NAT1:Full cone NAT(全锥形NAT);NAT2:Restric

yunnaoguodu的博客 3983

libp2p是什么?

libp2p is used by IPFS as its networking library. libp2p被用作IPFS的网络层。 使用libp2p的一个节点可以另一个节点进行通信能够使用各种不同的传输方式,这些传输方式包括连接延迟,以及通过不同协议进行通信,并根据需求进行协商。 libp2p汇集了各种传输和点对点协议,使开发人员可以轻松构建大型,强大的p2p网络。开发者构建一个p2p网络并不是一件容易的事情。复杂的网络环境、各种各样的通信协议和网络设备的存在使得创建大规模的点对点网络变得复杂并且困难

令狐_JackieHao的博客 1630

Stun方式的P2P实现原理(转)

转帖地址:http://www.cppblog.com/peakflys/archive/2013/01/25/197562.html   二、STUN方式的P2P实现 STUN是RFC3489规定的一种NAT穿透方式,它采用辅助的方法探测NAT的IP和端口。毫无疑问的,它对穿越早期的NAT起了巨大的作用,并且还将继续在NAT穿透中占有一席之地。 STUN的探测过程需要有一个公网IP的ST...

weixin_34293911的博客 302

【探索未来网络】—— libp2p:构建高效弹性P2P系统的强大工具箱

在互联网的广阔天地里,【libp2p】如同一位技艺高超的工匠,精心打造着下一代网络通信的基础框架。它不仅是一系列协议的集合,更是一个梦想与现实交汇的起点,让开发者能够轻松地创建复杂且高效的点对点应用。 ## **项目介绍** libp2p,一个来自Protocol Labs的杰作,是专为构建大规模点对点系统而生的模块化网络框架。它汇聚了过去十五年中网络协议的智慧结晶,旨在简化P2P系统的开发难

gitblog_00017的博客 764
上一篇: 【cpp/c++ summary 工具】 vld(Visual Leak Detector)windows 内存泄漏检测工具
下一篇: 【cpp/c++ summary 工具】 Hunter 报错 CMake hunter error: Unexpected MSVC_VERSION
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值