MMS格式解析
简介:
MMS是微软的私有流媒体协议。
它的最初目的是通过网络传输多媒体广播、视频、音轨、现场直播和一系列的实时或实况材料。
MMS建立在UDP或TCP传输/网络层上,是属于应用层的。
使用TCP的MMS上URL是MMS://或者MMST://,如果是UDP的MMS使用MMSU://。
在低带宽的情况下推荐使用UDP连接。在有防火墙的情况下使用HTTP。在下载MMS的时候TCP是不二的选择。
服务器上的媒体文件是以ASF或WMA形式存在。直播通过流媒体服务器组装成数据包。
如果是TV/视频的话,一个包可能会由多个流组成,但是语音广播就只有一个流。
MMS协议包有两种:命令包和数据包。
MMS命令包头
以下是小端格式。左边=LSB,右边=MSB。0f 00 00 00 就相当于0f。
字段 | 长度(bytes) | 描述 |
---|---|---|
可能是版本号 | 4B | 01 00 00 [00]:从client发出的格式是固定的。[00]域从服务器发出的时候是可以发生变化的 |
命令ID值,或许是版本或者序列号 | 4B | 固定CE FA 0B B0 |
命令数据包长度 | 4B | 计算到全部数据末尾,从协议类型域之后开始计算 |
协议类型 | 4B | 固定值为MMS :4D 4D 53 20 |
直到包尾的长度 | 4B | 包含自身数据域 |
序列号 | 4B | 命令是由客户端发向服务器的,序列号的计数从0开始。命令的响应拥有同样的序列号。也就是说序列号就是ECHO。客户端总是发起命令 |
双精度时间戳 | 8B | 用于网络时序 |
到包尾的长度 | 4B | 包括自身 |
Comm | 2B | 命令值:含义参考MMS命令列表 |
Dir | 2B | 方向域,0x03 = 向服务器,0x02 = 向客户端。 |
命令包通常都包括上述内容,最小字节是40。命令包头是作为命令发送的最小包。
注意:包长域包括到包末尾所有的padding。
命令包长度跟在其后,先是‘prefix 1’然后是‘prefix 2’,接下来直到命令包结束都是‘command specific data’。
命令指定数据可以是字符串文本‘Unicode 16bit’,或者是raw 8位数据。
在prefix 数据解说之后可以看到命令特定数据段含义。
01 至Server
Prefix 1 f0 f0 f0 f0 - 标志(见标志段)
Prefix 2 0b 00 04 00
Then 1c 00 03 00
功能:发送初始链接信息,包含播放器的版本号、客户端GUID(随机产生)和要连接的服务器地址。
注意:客户端GUID是随机生成的,具体内容见'locally generated GUIDs'.
01 至Client
Prefix 1 00 00 00 00 - 错误码
Prefix 2 f0 f0 f0 f0 - 标志(详见标志段)
结构体定义如下:
服务器返回诸如服务器软件版本等信息。
0b 00 04 00 ??
1c 00 03 00 ??
00 00 00 00 00 00 f0 3f 双精值为1内容不详
01 00 00 00 ??
01 00 00 00 ??
00 80 00 00 ??
00 00 a0 00 ??时有为80 96 98 00 = 10000000
Ww ww ww ww 服务器版本字符串长度
Xx xx xx xx 工具版本字符串长度
Yy yy yy yy 播放器下载链接长度
Zz zz zz zz 加密方式字符串长度
02 至Server
Prefix 1 f1 f0 f0 f0 - 标志(见标志段)
Prefix 2 ff ff ff ff
Then 00 00 00 00
Then 00 00 a0 00 - 未知
Then 02 00 00 00 – 映射包头ID类型(Header PacketIDType )
发送传输协议、客户端地址和客户端套接字端口号到服务器。
02 至Client
Prefix 1 00 00 00 00 - 错误码
Prefix 2 f1 f0 f0 f0 - 标志
Then nn nn nn nn - 4 bytes 数据长度
长度计数单位是4字节,也包括了Length域,所以4Bytes就是1。
Then Unicode字符串数据
03 至Client
Prefix 1 00 00 00 00 - 错误码
Prefix 2 00 00 00 00
由服务器返回,指明协议选择的错误。同时也表示从服务器发向客户端的关闭套接字连接的请求。在这个命令之后连接中断。
05 至Server
Prefix 1 01 00 00 00 -命令级别
Prefix 2 ff ff ff ff
Then 8 zeros (未知)或许是双精值
Then Unicode数据
这条命令请求位于服务器上的文件路径和文件名。这不包含IP或DNS信息,只有媒体的路径和文件名。
05 至Client
Prefix 1 00 00 00 00 - 错误码
Prefix 2 04 00 00 00 - 响应Media PacketIDType值
Then 下述结构体
现在发送媒体数据,包括媒体的播放时间。
01 00 00 00 未知但是可以改为0或1
00 00 00 00 可能是偏移时间,例如00 00 00 40 为2秒
00 00 00 00 ??
00 00 00 00 ??
00 00 00 00 ??
Xx xx xx xx 单精浮点值,显示文件时间减去缓冲区时间,仅在seek模式有效,其他情况下总为1。
06 至Client
Prefix 1 00 00 00 00 - 错误码
Prefix 2 01 00 00 00
Then 结构体如下
功能:答复文件名和路径请求。包括文件数据的包数,包长度和文件播放时间。06命令的数据类似于ASF文件的头信息。一旦媒体在服务器上定位,媒体流的细节和包便被返回。下面是prefix后的结构体信息:
01 00 00 00 结果标志
00 00 00 00
00 00 00 00
00 00 xx yy 广播标志
Tt tt tt tt tt tt tt tt 双精度文件时间点
Ll ll ll ll 回放文件的长度(秒为单位),实时则为0
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
Pp pp pp pp 媒体包长度,单位byte
Nn nn nn nn 媒体总包数,实时为0x00或0xffffffff
00 00 00 00
Ss ss ss ss 最高流比率值
Hh hh hh hh 头大小,单位bytes
Zeros 数据结构末尾的40个bytes零数据
07 至Server
Prefix 1 01 00 00 00 - 命令级别
Prefix 2 ff ff 01 00 - 或76 04 00 00 #
Then 结构题描述如下
功能:从包xx 开始文件播放。这条命令也用以恢复下载或请求丢包。在Seek模式下用来发送播放点。
8 bytes 双精格式,Seek秒数。
4 bytes FF
4 bytes 包序列号
ff ff ff ff 从开始播放
注意:v9版本中不可用,任何值都是从头开始播放
3 bytes 最大的流时间限制
1 byte 允许流限制标志
4 bytes Media PacketIDtype
4 bytes 可选数据# 如ff ff ff 7f
4 bytes 可选数据# 如00 00 00 00
4 bytes 可选数据# 如ff ff ff 7f
4 bytes 可选数据# 如00 00 00 00
09 至Server
Prefix 1 01 00 00 00 - 命令级别
Prefix 2 ff ff 01 00
停止播放,媒体播放器发送这条命令,流停止,保持套接字连接。
0A 至Client
Prefix 1 00 00 00 00 - 错误码
Prefix 2 04 00 00 00 - 响应PacketIDType
Data 00 00 00 00 00 00 00 00 - 双精值
此命令在快进/后退中使用。
0D 至Server
Prefix 1 01 00 00 00 - 命令级别
Prefix 2 01 00 00 00
协议中止。常用在关闭套接字连接时。
11 至Client
Prefix 1 00 00 00 00 - 错误码
Prefix 2 02 00 00 00 - 显示头的PacketIDType
Then 00 00 00 00 - ??
Then 00 00 00 00 或1c 00 03 00 用法未知。
在播放器请求时发送头或UDP包。