snmp协议的功能和作用,rtmp与rtsp协议的区别

RTMP协议基础知识RTMP协议定义:

所有RTMP都称为实时消息协议,即实时传输协议; 这是一种基于TCP协议的APP应用协议;

应用场景:

他是adobe公司开发的用于在客户端和服务器之间实时传输音频和视频的协议。 现已广泛用于直播领域

协议格式介绍:

RTMP协议包括消息和chunk概念; 消息是要传输的数据,br的数据太大,无法通过另一个协议数据包传输。 这样的话,就需要将这个数据分多次传输给对方。 每次传输都叫chunk。 所以chunk和message是归属关系,chunk必须属于一个message; 一个消息包含至少一个chunk; 为了确保传输数据正确,在消息和chunk中都定义了标头。

用一个简单的例子来说,我们需要一堆沙子从沙坑运到工地,但这可能会有很多沙子。 开车搬不动。 我们可以分几次运送他。 在这个例子中,这种沙子是message,所有的车沙子都是chunk,运沙子的车就像互联网。 所以在实际运输中,一台沙子是最小的运输单元;

然后,为了防止这些沙子在运输过程中出错,在所有车辆运输的沙子中,我们会有冷静的蜜蜂标记信息,标记出这辆车的沙子自身的基本信息,同时也把这辆车的沙子所属的这堆沙子的信息放进去。 用于标记这种沙子的信息的标记是基本头,用于标记这种沙子的信息的标致是消息头

协议格式:

以上是正在传输RTMP协议的完整chunk的协议格式,从上面的协议格式可以看出,完整的chunk包由四个部分组成; 分别是基本头、MeaasgeHeader、扩展时间、春日数据; 接下来,我将分别介绍这四个部分

BasicHeader: BasicHeaser是可变长度的消息标头,包含两个字段: chunkType和csid。 chunkType占2位的长度,csid占剩下的位的长度。 下图: ChunkType:显示了此chunk软件包的类型。 由于此字段占用2位,因此可以为{0、1、2、3}之一。 每个值表示不同的含义,还确定消息头占用的字节长度。Csid:这是chunk stream id的缩写,表示当前此分组所属流的信道编码,并且通过取字段值来唯一确定流。 他的长度可能是6字节it,也可能是1字节或2字节; 注意,0、1和2是csid保留的可能值;

根据上述说明,由于csid的长度是可变长度,所以BasicHeader整体的长度也是可变的,如果最短则可以设为1字节,如果长则可以设为3字节;需要注意的是:

由于csid可变,可以采用6bit或1字节或2字节的值,因此为了便于分析时区分,rtmp协议规定如下:

1,当csid占用6比特时,保留在与chunktype相同的字节中的6比特的取值是csid的取值

2、当csid的可能值为1字节时,剩下的6bit个与chunktype相同的字节的可能值为0,并且csid的可能范围是64 [64 256

3、当chunktype相同的字节的剩馀6bit取值1时,指示基本头占3字节的csid能取的值的范围是256 * 3字节能取的值2字节能取的值64

4、在chunkType和剩下的6bit的值为2时,显示一些控制消息

MessageHeader:此标头信息包含要发送的实际数据的描述信息,完成的消息头包括TimeStamp、消息长度、消息类型id和消息流下图TimeStamp:表示该分组数据的时间戳,由于占用3字节数据长度,所以他能取的值的范围为[0~0xFFFFFF。 如果该字段的值超过最大值,则在消息标题后的扩展字段区域中可以获取时间值,即扩展时间字段

接收方什么时候获取扩展时间字段的值作为真正的时间? 如果TimeStamp字段无法存储时间值,发送方将该字段的所有3字节位都设置为1。 这样,当接收方检测到TimeStamp字段的所有位位置都为1时,接收方将检索扩展时间值作为真正的时间值。MessageLength:消息数据长度、

占用3Byte;表示当前chunk所属message的数据长度,而不是当前传输的这个chunk的数据的长度;如此来说,同一个message的不同的chunk数据包中的钙字段的取值是相同的;

MessageTypeID: 消息类型,占用1个字节,是用来区分当前这个message的数据的类型,针对于不同的取值,表示不同的涵义,后续将会专门介绍;

MessageStreamID: 消息流的id,占用4byte;其取值与BasicHeader中的csid的涵义相一至,需要注意的是,该字段采用小端存储,所以在赋值和取值的时候需要注意。

 上面的MessageHeader是一个完整的包头,总共占有11Byte;前面介绍BasicHeader的时候提到过,BasicHeader中的ChunkType字段的取值,会决定后面MessageHeader包头的长度,而ChunkType字段的可以取值为{0,1,2,3}四个中的任意一个。
  1、 当chunkType=0时,整个MessageHeader的各个字段都存在;共占有11Byte长度,如下图所示
  2、 当chunkType=1时,MessageHeader中包含TimeStamp、MessageLength、 MessageTypeID三个字段,共占有7Byte长度,如下图:

  3、 当chunkType=2时,MessageHeader中仅有TimeStamp字段,总共占有3Byte的长度,如下图所示:
  4、 当chunkType=3时,MessageHeader的长度为0,表示与前一个chunk的MessageHeader的值是一样的,当一个Message拆分为多个chunk传输的时候,一般会使用这种传输方式

ExternTime:

  该字段是一个扩展字段,不一定存在,只有当MessageHeader字段中的Timestamp字段不能够存储下时间戳的时候,才会存在该字段,该字段占有4Byte的长度

ChunkData:

  该字段为一个chunk包中携带的数据的长度,默认的一个chunk包的长度为128Byte,去除掉头部字节之后,就是ChunkData的数据长度,所以,ChunkData的数据长度为:128-BasicHeaderLength-MessageHeaderLength;

MeaageHeader中的MessageTypeID字段:

  上面有提到,MessageTypeID表示消息类型,每个消息都有一个类型,针对于不同的消息类型,有不同的涵义,我们可以根据MessageTypeID字段解析出来的消息类型进行相应的处理;

  在RTMP协议格式中规定,当消息为控制消息的时候,MessageHeader的MessageStreamID由必须设置为0,并且BasicHeader的csid字段必须设置为2;由此可以得出,BasicHeader的chunkType必须设置为0;

  所以当消息为控制消息的时候,整个chunk包的头是一个完成的报文头。总共会占有12Byte;

   1、MessageTypeID=1表示设置chunk的size,默认的四则是128字节,收发数据的双方可以使用该i消息进行相互的设置
   2、MessageTypeID=2表示中断消息,当一方正在等待对方发送的一个Message消息中的其他chunk消息,收到该消息之后,就没有必要在处理之后受到的该message中的其他chunk消息了
   3、MessageTypeID=3是应答消息
   4、MessageTypeID=5应答窗口消息,是对MessageTypeID=1的应答
   5、MessageTypeID=6是设置带宽流的消息,该消息使用MessageTypeID=3进行应答
   6、MessageTypeID取值为17AMF3)或者20AFM0)的时候,是客户端和服务端在进行某些执行命令的传输,而执行命令使用的是amf格式的数据进行传输的
   7、MessageTypeID取值为15AMF3)或者18AFM0)传递的是一些音视频的元数据或者用户自定义的命令,同样,这些数据使用的是amf格式的数据
   8、MessageTypeID取值为16AMF3)或者19AFM0),是共享数据的传输
   9、MessageTypeID=8为音频数据
   10、MessageTypeID=9为视频数据
   11、MessageTypeID=4用户控制消息,用以用户对流的控制,与协议控制消息是由区别的
   12、MessageTypeID=22为聚合消息,是多个rtmp子消息的集合。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注