wireshark+rtmp协议分析
参考博客http://www.rosoo.net/a/201405/16980.html
http://www.cnblogs.com/russinovich/p/9240944.html
-
使用wireshark抓包工具
- 如何使用wireshark中常见的过滤选项包括协议类型、端口号、stream eq、ip地址
- 遇到本地回路不能抓包的问题可以参考https://blog.csdn.net/iriszx999/article/details/70154885博客,也可以通过npcap来抓包,首先要禁用掉wincap,重新启动wireshark就会出现loopback的过滤选项
- 通过wireshark,要学会如何重网络包中获取视频帧的数据,这里主要针对rtmp协议。
-
抓取网络包
- 打开wireshark抓包工具,设置tcp监听
- 打开vlc选择网络串流播放,输入rtmp播放地址,开始播放
- 将wireshark监听的网络包保存为本地文件
-
分析网络包
- 抓取的网络包中包括又rtmp协议类型,通过设置rtmpt 过滤,可以得到video以及audio的包数据
-
RTMP协议封包由一个包头和一个包体组成,包头可以是4种长度的任意一种:12, 8, 4, 1 byte(s).完整的RTMP包头应该是12bytes,包含了时间戳,AMFSize,AMFType,StreamID信息, 8字节的包头只纪录了时间戳,AMFSize,AMFType,其他字节的包头纪录信息依次类推 。包体最大长度默认为128字节,通过chunkSize可改变包体最大长度,通常当一段AFM数据超过128字节后,超过128的部分就放到了其他的RTMP封包中,包头为一个字节.
完整的12字节RTMP包头每个字节的含义: 如下不同的包头数据 05 00 34 df 00 00 55 08 01 00 00 00为12个字节,45 00 00 16 00 00 54 08 ,第一个字节(最高两位可知包头长度)与0xC0分别得到为0x00和0x40;查表可知分别对应的是12个字节和8个字节。后6位为保留位,用来确定channelid (02~07范围),通常45表示位服务器保留FMS2发送音视频数据;02 Ping 和ByteRead通道 03 Invoke通道 我们的connect() publish()和自字写的NetConnection.Call() 数据都是在这个通道的 04 Audio和Vidio通道 05 06 07 服务器保留,经观察FMS2用这些Channel也用来发送音频或视频数据
-
分析后11或者7个字节对应的参数信息,时间戳为接下来的后三个字节如例子中00 34 df 表示为13535单位为毫秒,时间戳主要分为两种:绝对和相对之分。 后三个字节为rtmp包的大小,如果超过了rtmp的最大长度128字节,那么下一个同类型的rtmp包头只占一个字节,一般为0xC?开头。streamid为4个字节如上为streamid=0x01;也可通过streamid=(channelid-4)/5+1表示。
-
包体:VideoTagHeader的头1个字节,也就是接跟着StreamID的1个字节包含着视频帧类型及视频CodecID最基本信息.一般为17或者27,那么streamid后的字节表达含义可以查表得出
Field Type Comment Frame Type UB [4] Type of video frame. The following values are defined: 1 = key frame (for AVC, a seekable frame) 2 = inter frame (for AVC, a non-seekable frame) 3 = disposable inter frame (H.263 only) 4 = generated key frame (reserved for server use only) 5 = video info/command frame CodecID UB [4] Codec Identifier. The following values are defined: 2 = Sorenson H.263 3 = Screen video 4 = On2 VP6 5 = On2 VP6 with alpha channel 6 = Screen video version 2 7 = AVC AVCPacketType IF CodecID == 7 UI8 The following values are defined: 0 = AVC sequence header 1 = AVC NALU 2 = AVC end of sequence (lower level NALU sequence ender is not required or supported) CompositionTime IF CodecID == 7 SI24 IF AVCPacketType == 1 Composition time offset ELSE 0 See ISO 14496-12, 8.15.3 for an explanation of composition times. The offset in an FLV file is always in milliseconds.
-
搜索wireshark中17 00 00 00 00可以获取视频对应的AVC sequence header相关信息,17表示avc格式且为key-frame,那么后面4个零分别表达的意思为:00表示UI8 无符号整形,表示此为avc sequence header部分,00 00 00 表示cts (pts-dts差值)SI24(三个字节)为0,这也就是为什么可以通过17 00 00 00 00 来搜索avc sequence header部分的原因。下图表示的avc sequence header部分的表示,分别为sps和pps。