【译】DEVp2p 线协议

By | 2018年7月14日

原文链接:https://github.com/ethereum/wiki/wiki/%C3%90%CE%9EVp2p-Wire-Protocol

运行以太坊/Whisper/&c.客户端的节点间的P2P通信被设计为【由一个简单的线协议控制】,尽可能利用如RLP这样已有ÐΞV技术和标准的协议。

此文档将尝试全面说明该协议。

 

底层(Low-Level)

ÐΞVp2p节点通过发送使用RLPx(一个经加密和验证的传输协议)的信息进行通信。节点可以自由地在任何指定的TCP端口上发送和接受连接(默认的连接监听端口是30303)。尽管TCP提供了一个面向连接的通道(connection-oriented medium),但ÐΞVp2p节点仍通过发送数据包进行通信。RLPx提供了发送和接收数据包的基础设施。(RLPx信息详见:https://github.com/ethereum/devp2p/blob/master/rlpx.md

ÐΞVp2p节点通过RLPx发现协议DHT找到其他节点。节点连接也可以通过向客户端指定RPC API(client-specific RPC API)提供端点来指定。

 

载荷内容(Payload Contents)

提供了数种可能被在RLP中编码的不同类型(type)的载荷。这里的“类型”永远由RLP的第一个条目决定,被解释为一个整数。

ÐΞVp2p被设计用于在基础的线协议之上支持任意的子协议(又名 capabilities)。每个子协议都被给予了足够其所需要的message-ID空间(所有的这类协议都必须静态地指定其需要的message ID数量)。在建立连接和发送问好消息(“hello” message)后,有着同样的【关于【使用哪种(版本的)子协议】】信息的两个节点就能对消息ID空间的组成达成共识。

消息ID被认为从ID 0x10开始是“紧凑的”(0x00~0x10为ÐΞVp2p消息保留),并根据字母表顺序给每个子协议共享。没有共享的子协议被忽略掉。如果数个版本共享了同一个(同名的)子协议,数字更大的会被保留,其他的则会被忽略。

 

P2P

Hello

0x00 [p2pVersion: P, clientId: B,[[cap1: B_3, capVersion1: P], [cap2: B_3, capVersion2: P], …], listenPort: P, nodeId: B_64]

第一个在连接上发送的包。由双方发送一次。直到Hello被接收前,可能不会发送其他信息。

p2pVersion 指定P2P协议实现的版本。当前必须为1

clientID 以人类可读的字符串形式指定客户端软件的identity(如:”Ethereum(++)/1.0.0”)

cap 以length-3 ASCII字符串形式指定一个参与者的 capability。当前受支持的capability是:eth,ssh

capVersion 用一个正整数指定一个参与者的capability版本。当前被支持的eth版本为34,ssh版本为1

listenPort 指定客户端正在监听的端口(通过当前连接所穿过的接口)。值0意为客户端未在监听

nodeId 节点独一无二的identity,被指定为一个512位hash,可用于识别节点身份。

 

Disconnect

0x01 [reason: P] 告知节点即将断开连接:如果信息被节点接收到,则应立即断开连接。当信息发送中时,运行良好的hosts将在自己断开连接前,给他们的节点“a fighting chance”(读作:等待2秒)来断开连接。

reason 是一个可选的整数,指定一个断开连接的原因:

0x00 请求断连

0x01 TCP子系统错误

0x02 违反协议。如异常信息,坏RLP,错误魔法数(magic number)&c

0x03 无用节点

0x04 节点过多

0x05 已连接

0x06 p2p协议版本不兼容

0x08 客户端退出中

0x09 意外identity(即,identity与之前的连接/可信节点告知的不同)

0x0a identity与此节点相同(连接自己)

0x0b 收取消息超时(即,发送上一个ping后没有受到任何消息)

0x10 具体到子合约的其他原因

 

Ping 0x02 [] 为从节点发来的pong请求立即回复

Pong 0x03 [] 回复节点的ping包

无实现(曾经是 GetPeers) 0x04

无实现(曾经是Peers) 0x05

 

节点 identity和reputation

ÐΞVp2p节点的identity是一个secp256k1公钥

节点有为给定ID评级的自由(这个节点在过去发挥了多大作用)并根据这个给出偏好(preference)。节点也可以跟踪节点id(和它们的出处)以帮助确定潜在的中间人攻击。客户端有标记新节点的自由,并使用节点id作为确定一个节点的reputation的手段

 

会话管理(Session Management)

在连接后,所有客户端(即连接的双方)都必须发送一个hello消息。在收到hello消息后对网络和版本的兼容性进行验证,随后会话被集火,任何其他的P2P管理都可(可能)被发送。

 

断连消息可能在任意时刻发出。

 

 

点击量:391

发表评论

邮箱地址不会被公开。 必填项已用*标注