STUN FINGERPRINT 消息长度错误 (STUN Fingerprint Length Bug)
条件与症状
自实现 STUN Binding Success Response 时,如果计算 FINGERPRINT 的 CRC 前仍把 STUN Header 的 message length 写成不含 FINGERPRINT 属性的长度,Chrome 等浏览器会将响应判为 fingerprint mismatch。表现通常不是显式报错,而是内置 STUN 候选迟迟不出现,ICE 等待公网 STUN 重试,导致 WebRTC 建链明显变慢。
正确规则
FINGERPRINT 属性本身长度为 8 字节。计算 CRC 时,输入不包含该属性的 8 个字节,但 Header 中的 message length 必须已经包含这 8 字节;随后将 CRC32 结果与 0x5354554E 异或写入属性值。
排查与验证
- 检查响应 Header 的 length 是否等于实际 body 长度。
- 用
crc32(response[..fingerprint_offset]) ^ 0x5354554E重算并比对属性值。 - 用浏览器
chrome://webrtc-internals或 ICE candidate 日志确认本机 STUN 是否产生srflx候选。
相关概念
- 会话遍历工具 (Session Traversal Utilities for NAT, STUN)
- 交互式连接建立 (Interactive Connectivity Establishment, ICE)
- 对称地址转换 (NAT Traversal)
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Network