跳转到正文
buybitcoinsmart

术语表 /节点与软件

消息头

消息头是什么?
比特币的消息头是包裹在每条点对点消息外的固定24字节信封,包含网络起始字符串、命令名称、载荷长度和校验和。

点对点协议中没有任何内容能够自我描述,因此需要由这个信封来承担这项工作。它的四个字段大小和顺序始终不变,节点可以恰好读取24字节,得知后面还有多少数据,并对任何声称超过 Bitcoin Core 所接受的4,000,000字节的消息直接断开连接。您永远不会看到消息头,但格式错误的消息头正是对等节点连接有时无故消失的原因。

运作方式

消息头的四个字段按固定顺序读取,每个字段都决定着接下来会发生什么。

第0至3字节是标识网络的起始字符串。第4至15字节是命令:一个小写 ASCII 名称,以空字节填充至十二个字符,这就是比特币中每种消息类型的名称都很简短的原因,也是十个字符的 cmpctblock 已接近上限的原因。第16至19字节是载荷长度,以小端序无符号整数表示。第20至23字节是校验和,即对载荷做双重 SHA-256运算后所得结果的前四个字节。

将长度放在载荷之前,是这一设计真正的安全特性。已读取24字节的节点就能判断发送方是否声称了荒谬的内容,Bitcoin Core 会拒绝任何超过4,000,000字节的消息并断开连接,既不分配缓冲区,也不等待可能永远不会到来的数据。如果把长度放在消息体之后,就只能相信发送方会适时停止。

对校验和的重视,应当低于通常的水平。四个字节的哈希可以发现不良链路上翻转的比特,但对说谎的对等节点毫无作用,因为恶意发送方只需对其选定发送的任何内容重新计算校验和。比特币的完整性来自依据共识规则验证内容,绝非来自这个字段。

在较新的软件中,整个结构是可选的。BIP324 的第2版传输协议会加密连接,并以经过混淆的长度帧加上针对最常见消息类型的单字节短标识符,取代明文信封,因此被动观察者无法再从网络数据中读出命令名称。Bitcoin Core 在版本26.0中将其作为可选设置推出,并在后续版本中默认启用。

在哪里会遇到它

消息头出现在数据包捕获和节点自身的诊断信息中。

使用 -debug=net 运行 Bitcoin Core,日志会记录每个对等节点的消息类型和大小,这是观察连接实际运行情况的实用方法。出现 PROCESSMESSAGE: INVALID MESSAGESTART 的日志条目,表示对等节点发送的字节并非以本网络的起始字符串开头,这几乎总是对方配置有误,而不是攻击。Wireshark 的比特币解析器会解析同样的24字节,为每个数据帧添加标注。

消息头 vs 区块头

消息头是传输封装,区块头是共识数据,两者除了名称中的“头”字之外毫无共同之处。消息头为24字节,只在一次传输期间存在,载荷读取完毕后即被丢弃。区块头为80字节,包含版本、前一个区块的哈希、默克尔根、时间戳、难度目标和随机数,并通过哈希运算生成工作量证明,使该区块得以永久确定。前者是包裹上的收件标签,后者是包裹里的内容。

请勿混淆

常见问题

比特币消息头有多大?

恰好24字节:四字节用于网络起始字符串,十二字节用于以空字节填充的命令名称,四字节用于载荷长度,四字节用于校验和,校验和取自对载荷做双重 SHA-256运算结果的前几个字节。

消息头的校验和能让连接变得安全吗?

不能。它只能检测意外损坏。恶意的对等节点会对其发送的任何内容重新计算校验和,因此安全性来自依据共识规则验证载荷,或来自完全取代明文消息头的 BIP324 加密传输。

相关术语

节点与软件中的更多术语

阅读本页英文版