天天看點

[流媒體]執行個體解析MMS流媒體協定,下載下傳LiveMediaVideo[1][修正版,增加了帶寬測試包]

<b>[</b><b>流媒體</b><b>]</b><b>按照</b><b>mms</b><b>協定和</b><b>ms media server</b><b>互動</b><b></b>

<b></b>

<b>下載下傳實時交通錄像的包分析</b><b></b>

編寫者

日期

關鍵詞

鄭昀@ultrapower

2005-10-17

mms streaming protocol ethereal 協定分析 流媒體

       隻有sdp2.0(streaming download project)可以正常下載下傳并播放它。

為了改造mimms,我分析了sdp和流媒體伺服器的來往包,看看我和他的實作到底存在哪些差異。如果你也開發流媒體下載下傳應用,希望這個分析對你了解 “microsoft windows media services”協定有幫助。

 對了,編碼格式是“little endian”,也就是0f 00 00 00的實際值是0x0f。

下面是每一個資料包。我們對每一個“標頭”和“包體”的每一個位元組都做了盡可能詳細的分析。

 第一回合之第一個包:to server;len=104:

0030                           <b>01 00 00 00 ce fa 0b b0</b> 58 00  ...a..........x.

0040   00 00 4d 4d 53 20 0b 00 00 00 00 00 00 00 00 00  ..mms ..........

0050   00 00 00 00 00 00 09 00 00 00 01 00 03 00 f0 f0   ................

0060   f0 f0 0b 00 04 00 1c 00 03 00 4e 00 53 00 50 00   ..........n.s.p.

0070   6c 00 61 00 79 00 65 00 72 00 2f 00 37 00 2e 00   l.a.y.e.r./.7...

0080   31 00 2e 00 30 00 2e 00 31 00 39 00 35 00 36 00  1...0...1.9.5.6.

0090   3b 00 20 00 00 00 00 00 00 00 00 00 00 00        ;. ...........

“<b>標頭</b>”解釋:

l         “<b>01 00 00 00</b>”是用戶端向伺服器端發包的固定開頭。以後你會看到每一個包都是如此開頭的。4位元組。

l         “<b>ce fa 0b b0</b>”,這也是固定不變的。通常被人稱為“boob face”。他可能是一個版本号或者序列号。以後你會看到用戶端和伺服器端發出的每一個包都是如此開頭的。4位元組。

l         “58 00 00 00”,表明在“協定類型(也就是接下來的4d 4d 53 20)”後面的所有資料的長度。4位元組。

l         “4d 4d 53 20”,表明協定類型,就是“mms&lt;space&gt;”的ascii碼。4位元組。

l         “0b 00 00 00”,length until end of packet in 8 byte boundary lengths,including own data field。4位元組。

l         “00 00 00 00”,<b>sequence number</b><b>。</b>4位元組。

l         <b>“</b>00 00 00 00 00 00 00 00<b>”,</b>8位元組。double precision time stamp (see notes) used for network timing。

l         <b>“</b>09 00 00 00<b>”,</b>length until end of packet in 8 byte boundary lengths. including own data field。4位元組。

l         <b>“</b>01 00 03 00<b>”,</b> 指的是“comm 2 bytes | dir 2 bytes”。01 00是command數值。03 00是direction數值,這裡的0x03指明用戶端發往伺服器。4位元組。

<b> </b>

<b>按照我的了解,上面的可以算作標頭,每個用戶端發出的資料包差不多都有類似的頭。</b>

<b>在“</b>comm 2 bytes | dir 2 bytes<b>”之後,就是這個包的body</b><b>了。</b>

<b>“包體”解釋:</b>

l         “f0 f0 f0 f0”,mms協定标志1。

l         “0b 00 04 00”,不知道。

l         “1c 00 03 00”,不知道。

l         “4e 00 53 00 50 00 6c 00 61 00 79 00 65 00 72 00 2f 00 37 00 2e 00 31 00 2e 00 30 00 2e 00 31 00 39 00 35 00 36 00 3b 00 20 00”,其實就是“nsplayer/7.1.0.1956;&lt;space&gt;”的ascii碼。這是向伺服器說明用戶端的播放器的版本名。值得注意的是,這個版本名字必須以“nsplayer”開頭,否則mms伺服器将不管你的請求是什麼,強制傳回給用戶端一個15秒的電影檔案“<b>upgrade your player</b>”,用來展示如何更新你的播放器。“nsplayer”後面跟随的版本号無所謂是什麼,比如mimms的是“9.0.0.2800”。

l         “00 00 00 00 00 00 00 00 00 00”,補零的部分。

       實際上,上面第一個包體應該是類似于這樣的格式:

       <b>nsplayer/</b><b>版本号;&lt;space&gt;{128</b><b>位的用戶端guid};&lt;space&gt;host:&lt;space&gt;</b><b>伺服器的ip</b><b>位址</b>

       舉一個實際的例子:

nsplayer/9.0.0.2800; {f5cec3a0-3e2c-11da-b2a2-00055d1a21bd}; host: 220.194.63.17

       但是,抓sdp2.0得到的包有點不一樣。

鄭昀編寫,随時更新。

 第一回合之第2個包:to client;len=144:

0030                           01 00 00 00 ce fa 0b b0 80 00  ..p.............

0040   00 00 4d 4d 53 20 10 00 00 00 00 00 00 00 73 00  ..mms ........s.

0050   70 00 3a 00 2f 00 0e 00 00 00 01 00 04 00 00 00   p.:./...........

0060   00 00 f0 f0 f0 f0 0b 00 04 00 1c 00 03 00 00 00   ................

0070   00 00 00 00 f0 3f 01 00 00 00 01 00 00 00 00 80   .....?..........

0080   00 00 80 96 98 00 0d 00 00 00 00 00 00 00 00 00  ................

0090   00 00 05 00 00 00 39 00 2e 00 30 00 31 00 2e 00  ......9...0.1...

00a0   30 00 31 00 2e 00 33 00 38 00 31 00 34 00 00 00  0.1...3.8.1.4...

00b0   4e 00 54 00 4c 00 4d 00 00 00 00 00 00 00 00 00  n.t.l.m.........

00c0   00 00 00 00 00 00                                ......

l         “01 00 00 00 ce fa 0b b0”是伺服器端向用戶端發包的“boob face”固定開頭。以後你會看到每一個包都是如此開頭的。8位元組。

l         “80 00 00 00”,表明在“協定類型(也就是接下來的4d 4d 53 20)”後面的所有資料的長度。4位元組。

l         “10 00 00 00”,length until end of packet in 8 byte boundary lengths,including own data field。4位元組。

l         <b>“</b>73 00 70 00 3a 00 2f 00<b>”,</b>8位元組。double precision time stamp (see notes) used for network timing。

l         <b>“</b>0e 00 00 00<b>”,</b>length until end of packet in 8 byte boundary lengths. including own data field。4位元組。

l         <b>“</b>01 00 04 00<b>”,</b> 指的是“comm 2 bytes | dir 2 bytes”。01 00是command數值。04 00是direction數值,這裡的0x04指明伺服器發往用戶端。4位元組。

l         “f0 f0 f0 f0”,mms協定标志1。4位元組。

l         “0b 00 04 00”,不知道。4位元組。

l         “1c 00 03 00”,不知道。4位元組。

l         “00 00 00 00 00 00 f0 3f”,固定數值,不知道含義。8位元組。

l         “01 00 00 00 01 00 00 00 00 80 00 00”,固定數值,不知道含義。12位元組。

l         “80 96 98 00”,有時候也會是“00 00 a0 00”, 8位元組。

l         “39 00 <b>2e 00</b> 30 00 31 00 <b>2e 00</b> 30 00 31 00 <b>2e 00</b> 33 00 38 00 31 00 34 00”,其實就是“9.01.01.3814”的ascii碼。這是向用戶端說明伺服器端的版本号,“9.01.01.3814”看來是很新的media server版本。

l         “4e 00 54 00 4c 00 4d 00”,是“ntlm”的ascii碼。代表伺服器的加密類型,諸如basic, digest或者ntlm。

這個包中,在伺服器版本号之後,加密類型之前,也可能有以下兩種資料:

l         工具版本号,如5.1.0.0;

這兩個資料不一定會有,但是伺服器版本号必須要有。

 第二回合之第1個包:to server;len=48:

0030                         01 00 00 00 ce fa 0b b0 20 00  .o.6.......... .

0040   00 00 4d 4d 53 20 04 00 00 00 01 00 00 00 00 00  ..mms ..........

0050   00 00 00 00 00 00 02 00 00 00 18 00 03 00 f1 f0  ................

0060   f0 f0 0b 00 04 00                                ......

l         略

l         <b>“</b>18 00 03 00<b>”,</b> 指的是“comm 2 bytes | dir 2 bytes”。18 00是command數值。03 00是direction數值,這裡的0x03指明用戶端發往伺服器。4位元組。是不是奇怪,怎麼突然跳到了指令18。看來并不是按照指令順序發送指令的。這個指令代表:“what timing tests to do, if any”。

<b>在“</b>18 00 03 00<b>”之後,就是這個包的body</b><b>了。</b>

l         “f1 f0 f0 f0”,表明“the tcp timing method is required”。4位元組。

l         “0b 00 04 00”,不知道,4位元組。

 第二回合之第2個包:to client;len=512:

0030                          01 00 00 00 ce fa 0b b0 f0 01  .g..............

0040   00 00 4d 4d 53 20 3e 00 00 00 01 00 00 00 73 00  ..mms &gt;.......s.

0050   70 00 3a 00 2f 00 3c 00 00 00 15 00 04 00 00 00  p.:./.&lt;.........

0060   00 00 f1 f0 f0 f0 08 00 00 00 01 00 00 00 00 00  ................

0070   01 00 d4 b9 42 f1 00 00 00 00 01 00 00 00 00 00  ....b...........

0080   00 00 00 00 00 00 2d eb 9b 2d d2 fa e6 1c 09 12  ......-..-......

0090   b7 df ab 5e 07 71 a7 a0 a2 77 fe d1 ea db 9d 07  ...^.q...w......

00a0   ce 15 9c 80 bc d4 ae af 29 56 0e 44 77 b9 a8 c3  ........)v.dw...

00b0   c1 1c 4d 4f 80 00 6c fd 06 6e b1 a8 0b 2e e1 25  ..mo..l..n.....%

00c0   21 15 2a fc e0 8e be 0f ae c4 8d c0 fb a7 df 5b  !.*............[

00d0   ca 77 58 7b 88 14 14 de 7d 68 13 d7 f9 ea 1b a8  .wx{....}h......

00e0   26 ea 3f 17 09 8f c9 26 01 0b 83 39 70 d3 e7 d0  &amp;.?....&amp;...9p...

00f0   6e e8 d5 75 76 e8 09 00 c1 91 2c 04 18 e1 6b a3  n..uv.....,...k.

0100   77 f3 1e 38 a0 39 fe 4a 7b e0 96 62 3d fa 33 e6  w..8.9.j{..b=.3.

0110   69 b3 89 90 06 71 eb 50 50 88 03 fb 2d b8 89 78  i....q.pp...-..x

0120   0b 7e 3f be fe 5f 7a da 88 de 9e 66 3e a6 a2 84  .~?.._z....f&gt;...

0130   5f b9 6b 9a 5c 9b f2 eb ef 64 16 73 3b 6a ac a7  _.k.\....d.s;j..

0140   14 6f d2 20 17 5e 75 18 24 cd 49 22 69 c2 c9 b4  .o. .^u.$.i"i...

0150   50 25 76 32 ec 24 18 c9 9c bd 89 09 84 4a 28 c5  p%v2.$.......j(.

0160   d7 20 57 97 c7 ab 69 ee 89 7c e9 4c f3 ae 57 9d  . w...i..|.l..w.

0170   c1 22 bf 45 83 38 f0 eb 81 94 f8 ff ad 3f d7 fe  .".e.8.......?..

<b>這個回應指令18</b><b>的包屬于指令15</b><b>,可能有好幾個,一般是兩個512</b><b>的包和一個1056</b><b>的包,一般發送的假資料總位元組數為1840</b><b>位元組。他是用來測試網絡帶寬,以及資料發送速率的。</b>

<b>這些包中的資料可能是随機資料,而且可能不做壓縮。這樣可以測出在一個非壓縮的連接配接上所能達到的帶寬。</b>

l         <b>“</b>15 00 04 00<b>”,</b> 指的是“comm 2 bytes | dir 2 bytes”。15 00是command數值。04 00是direction數值,這裡的0x04指明伺服器發往用戶端。4位元組。

<b>在“</b>15 00 04 00<b>”之後,就是這個包的body</b><b>了。</b>

l         “00 00 00 00”,錯誤号。

l         “f1 f0 f0 f0”,标志,後面跟随的都是本次結構資料了。

l         “08 00 00 00”,表明本結構共8個字段,包括自己。

l         “01 00 00 00”;

l         “00 00 01 00”;

l         “d4 b9 42 f1”,配置設定你一個用戶端id。每登入一個用戶端,這個id自增加一,以友善伺服器的udp回複包知道向哪一個client發送。

l         “00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00”,接下來就是随機資料了。

l         随機資料。。。。

繼續閱讀