nginx rtmp 包在wireshark中的体现

来源:互联网 发布:启明星bsc软件 编辑:程序博客网 时间:2024/06/01 08:38

nginx rtmp 包在wireshark中的体现

问题:今天在分析nginx发送rtmp包的时候,想通过wireshark抓包查看具体的信息。wireshark只能分析一整个video帧,不能分开解析rtmp包

如图:这里写图片描述

图中第二个rtmp video包应该是I帧(第一个是sps),但是wireshark这里只合并成了一个包的信息,实际上:I帧应该分成N个rtmp包发送的。

下面找到每个包的起点:
nginx 默认设置的chunk_size 为4096,Tcp的分片大小为1460
那么I帧的发包理论上应该是:
这里写图片描述

但是nginx发送的时候,同一个帧的数据将会通过ngx_rtmp_append_shared_bufs 函数将帧的buf放到一个ngx_chain_t 的列表中如:4104+4097+4097+1528 四个包然后相继发送出去。但是由于tcp发包的限制每次只能发送1460个字节,所以曾现的现象就是4个rtmp包混合在一起。

拿#1包包分析:
在tcp发送上会分成4096+7+1 = 1460+1460+1184 三个包发送。
所以第二个rtmp包的起点就应该是: 第三个tcp包的data 数据 1185偏移开始
如图:
这里写图片描述

这需要减去tcp的header的长度。

总结: nginx rtmp 发送音视频都是一帧一帧的发, 如果一帧过大就通过拆包的形式放在chain中发送。wireshark 只会解析一整帧的rtmp数据包,而不会解析拆分的rtmp包(因为他们都混在一起了),只有接受方通过receive 每次接受的(size = min(memlen,chunk_size)),来接受整个帧的数据(header->memlen)。

原创粉丝点击