wireshark抓包分析rtmp协议时,总是有Unknown(0x0)这样的包出现。

unknown.png

搜索了一下这类问题多数是说要在抓包开始后建立连接,或者是rtmp流有问题。

但我抓取的rtmp连接建立是在抓包开始之后,应该不存在会出现解包失败的问题,且这个rtmp连接数据包应该也没有问题,因为播放器播放一切正常。这个问题困扰了我一阵,最后决定到源码中一探究竟。

找到源码 wireshark/epan/dissectors/packet-rtmpt.c, 首先搜了一下unknown部分代码,只是一些解析报错,并没有明显的出错原因。

查看解析rtmp部分的代码,发现在解析rtmp messagelen时,就是下面代码中的body_len, 有个最大值rtmpt_max_packet_size限制.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
if (header_type < 2)
    body_len = tf ? pntoh24(tf->saved.d+basic_hlen+3) : tvb_get_ntoh24(tvb, offset+basic_hlen+3);
else if (ti)
    body_len = ti->len;
else
    body_len = chunk_size;

if (body_len > (gint)rtmpt_max_packet_size) {
    return;
}

查看这个值定义,初始化为32768.

1
static guint rtmpt_max_packet_size = 32768;

这个值的设置在下面这个函数中,是wireshark设置偏好的选项。

1
2
3
4
prefs_register_uint_preference(rtmpt_module, "max_packet_size",
								"Maximum packet size",
								"The largest acceptable packet size for reassembly",
								10, &rtmpt_max_packet_size);

这样一看,也就恍然大悟了,wireshark中默认设置了rtmp messagelen最大值为32768,只要message长度超过这个值,就会造成解析出错。

找到wireshark设置preference的地方修改一下这个值

preference

改完之后再次解析同一个rtmp包,结果一切正常了