我正在分析 RTMP(实时消息传递协议)并发现一些非常奇怪的东西。在其中一个捕获的数据包中,TCP 有效负载长度比预期的要长。这是 Wireshark 中的数据包:
该C3
字节使 RTMP 比预期的要长。在 RTMP 有效负载视图中令人惊讶的是:
如您所见,该C3
字节在 RTMP 视图中消失了。但它是 TCP 有效负载的一部分。我不知道为什么会这样,我怀疑:
一些更长的 UTF-8 字符?
根据维基百科,AMF0 中的字符串被编码为 16 位 UTF-8。这意味着它可以是 8/16 位。但是,
\u33C3
和\uC32E
都是韩文字符,在第二张图片中显示这不是我的情况。TCP有效负载的填充/转义字符?
不...我从来没有听说过...
关于 TCP 的一些我不知道的事情?
这是我发现的:
一个。它不是 RTMP 消息的片段,TCP 数据包包含 RTMP 消息所需的所有内容。
湾。校验和很好,一切似乎都很好。
C。数据包被对端正确确认(图中未显示)
d。这是可复制的,通过使用流媒体软件 Wirecast
我在这里错过了什么吗?为什么 Wireshark 可以正确解码有效载荷?为什么 Wireshark 简单地删除C3
(这表明它与 AMF0 编解码器无关)?我很困惑。请帮忙 :'(
RTMP 协议规范在这里:https ://wwwimages2.adobe.com/content/dam/acom/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf
哦,我终于想通了!根据 Adobe 的文件,
和
(Chunk header,也叫“chunk basic header”,不是消息头,完全不一样!)
这里
type 3
指的是块头类型 3,它位于具有 value 的第一个字节的前两位0b11xxxxxx
。六个字节的重置是流ID(这里是3,0bxx000011
)。这两个语句与我的问题的行为相匹配:偏移 128 字节上的新块(消息头不计数)与块头type 3
。Wireshark 确实正确解析了它。有点令人困惑:他们不将块头视为消息的一部分,这是有道理的。但是他们确实将类型 0-2 的块头视为消息的一部分(第一个0x03
),这没有意义。另外,我在这里找到了一个参考(搜索
C3
并......你明白了......): https ://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol