KRPC请求格式
所有的 KRPC 消息都是通过 UDP 传输的、经过 Bencode 编码的字典。
本文主要介绍find_node、 get_peers 和 announce_peer 这三个 RPC 调用的请求和响应消息结构。
通用结构元素:
t: 事务 ID (Transaction ID),二进制字符串,由请求方设置,响应方必须在响应中原样返回。y: 消息类型 (Message Type),单个字符,‘q’ 代表查询 (Query),‘r’ 代表响应 (Response),’e’ 代表错误 (Error)。v(可选): 客户端版本信息 (Version),通常是字符串。ip(可选,通常在响应中出现): 响应者看到的请求者的公网 IP 地址和端口 (紧凑的 6 字节二进制字符串)。
1、find_node RPC
目的: 向一个节点请求,获取它所知道的、其 Node ID 在 XOR 距离上最接近指定 target Node ID 的 k 个节点的联系信息。这主要用于路由表的填充和更新,以及在其他查找(如 get_peers)中进行迭代查询。
find_node 请求用于询问某个节点:“请告诉我你认识的、离 target 这个 Node ID 最近的那些节点是谁?”。响应则直接返回一个包含这些节点(最多 k 个)联系信息的紧凑字符串。这个 RPC 是 DHT 网络进行节点发现和路由的基础。