条件与症状

自实现 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 异或写入属性值。

排查与验证

  1. 检查响应 Header 的 length 是否等于实际 body 长度。
  2. 用 crc32(response[..fingerprint_offset]) ^ 0x5354554E 重算并比对属性值。
  3. 用浏览器 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