Code Monkey home page Code Monkey logo

dropliu_pnet's Introduction

pnet (p2p network library)

背景

目前的服务大多是 C/S 或 B/S 架构,直接使用常见的网络协议库即可实现,比如HTTP。

但在一些场景,直接使用现有的网络库并不那么方便。比如自动化运维 go-ops,要求批量连接大量主机,并向其下发运维指令。

这就对网络库提出了新的要求,在一个分布式、去中心化的网络中,有N个节点。要求任意节点之间能够互相连通,任意两个节点之间都能够互相通信。

特性

  1. 连接:任意节点间互相连接组网
  2. 路由:根据路由规则找到网络中的目标节点
  3. 通信:网络中的任意节点可以互相收发消息

设计

在p2p 网络中,最基础的单元是节点(Node),节点之间的互联构建出了一个网络。节点要能随时随地互相连通,并且任意两个连通的节点之间能够进行通信。

对于通信的内容最好不要做假设,要支持上层实现专属的协议,甚至是长连接这种。这就要求最好不要固定网络协议,要不然有些场景将难以支撑。同时应该尽量避免向上层暴露底层协议,避免上层关注过多的实现细节。

这就要求我们要提供一个网络抽象层(Network)。网络层负责按照统一的模型,对所有的连接进行管理。

在这一模型下,下层可以是TCP、QUIC,甚至是HTTP实现。而对于上层来说只需要做两件事:

  1. 根据目标节点地址,连接到该节点
  2. 生成一个连接(Connection)或流(Stream),开始读写数据

根据这一过程,上层可以打开多个连接,在不同连接上实现不同协议。比如一元请求(请求/响应),或是流式传输。这又涉及到一个问题,接收方并指导对端可能采用什么协议,势必需要一个握手过程来指定通信协议,我称之为连接通道(Chnnel)。

上层生成流时,要指定连接的通道,由下层连接进行协商:

  1. 通道是否存在?
  2. 是否需要鉴权?
  3. 传递附加信息?
  4. ...

连接和通信的问题解决了,但还面临着一个要求,怎样在网络中找到任意一个节点进行互通?因为这是去中心化的网络,新加入的节点只要连接上当前网络的任意一个节点就算加入成功,这意味着网络拓扑图可能成环、树形,也可能是一条直线。

所以在节点和网络之间还应该由一个中间层,即路由(Router)。作用在于当前节点连接非直连节点时,查找目标节点,规划连接路径,给出要连接的下一跳节点。

dropliu_pnet's People

Contributors

dropliu avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.