欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

wireshark+rtmp协议分析

程序员文章站 2022-03-18 11:29:42
...

参考博客http://www.rosoo.net/a/201405/16980.html

                http://www.cnblogs.com/russinovich/p/9240944.html

  • 使用wireshark抓包工具

  1. 如何使用wireshark中常见的过滤选项包括协议类型、端口号、stream eq、ip地址
  2. 遇到本地回路不能抓包的问题可以参考https://blog.csdn.net/iriszx999/article/details/70154885博客,也可以通过npcap来抓包,首先要禁用掉wincap,重新启动wireshark就会出现loopback的过滤选项
  3. 通过wireshark,要学会如何重网络包中获取视频帧的数据,这里主要针对rtmp协议。
     
  •  抓取网络包

  1. 打开wireshark抓包工具,设置tcp监听
  2. 打开vlc选择网络串流播放,输入rtmp播放地址,开始播放
  3. 将wireshark监听的网络包保存为本地文件
  •  分析网络包

  1. 抓取的网络包中包括又rtmp协议类型,通过设置rtmpt 过滤,可以得到video以及audio的包数据
  2.  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也用来发送音频或视频数据 

     

  3. 分析后11或者7个字节对应的参数信息,时间戳为接下来的后三个字节如例子中00 34 df  表示为13535单位为毫秒,时间戳主要分为两种:绝对和相对之分。 后三个字节为rtmp包的大小,如果超过了rtmp的最大长度128字节,那么下一个同类型的rtmp包头只占一个字节,一般为0xC?开头。streamid为4个字节如上为streamid=0x01;也可通过streamid=(channelid-4)/5+1表示。

  4. 包体: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.

     

  5. 搜索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。

                                                                                       wireshark+rtmp协议分析

 

相关标签: rtmp wireshark