2011-12-18 28 views
1

我想實現最新的websocket規範。但是,我無法通過成功握手後的揭密步驟。websocket客戶端數據包unframe/unmask

我收到以下web套接字幀:

<<129,254,1,120,37,93,40,60,25,63,71,88,92,125,80,81,73, 
51,91,1,2,53,92,72,85,103,7,19,79,60,74,94,64,47,6,83, 
87,58,7,76,87,50,92,83,70,50,68,19,77,41,92,76,71,52, 
70,88,2,125,90,85,65,96,15,14,20,107,31,14,28,100,27,9, 
17,122,8,72,74,96,15,86,68,37,68,18,76,48,15,28,93,48, 
68,6,73,60,70,91,24,122,77,82,2,125,80,81,85,45,18,74, 
64,47,91,85,74,51,21,27,20,115,24,27,5,37,69,80,75,46, 
18,68,72,45,88,1,2,40,90,82,31,37,69,76,85,103,80,94, 
74,46,64,27,5,60,75,87,24,122,25,27,5,47,71,73,81,56, 
21,27,93,48,88,76,31,57,77,74,11,55,73,68,73,115,65,81, 
31,104,26,14,23,122,8,75,68,52,92,1,2,110,24,27,5,53, 
71,80,65,96,15,13,2,125,75,83,75,41,77,82,81,96,15,72, 
64,37,92,19,93,48,68,7,5,62,64,93,87,46,77,72,24,40,92, 
90,8,101,15,28,83,56,90,1,2,108,6,13,21,122,8,82,64,42, 
67,89,92,96,15,93,19,56,28,8,65,101,31,94,16,105,28,10, 
20,56,30,14,65,56,27,93,71,106,16,11,17,63,25,4,17,57, 
73,89,17,59,29,88,29,106,24,27,5,46,65,72,64,54,77,69, 
24,122,66,93,93,49,5,12,8,109,15,28,76,59,90,93,72,56, 
76,1,2,41,90,73,64,122,8,89,85,50,75,84,24,122,25,15, 
23,105,25,5,19,106,26,14,20,111,25,27,5,53,77,85,66,53, 
92,1,2,110,26,13,2,125,95,85,65,41,64,1,2,108,27,10,19, 
122,7,2>> 

作爲每這裏定義的基成幀協議(http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section- 5.2)我有:

fin:1, rsv:0, opcode:1, mask:1, length:126 

屏蔽應用+有效載荷數據出來是:

<<87,58,7,76,87,50,92,83,70,50,68,19,77,41,92,76,71,52,70,88,2,125,90,85,65,96, 
15,14,20,107,31,14,28,100,27,9,17,122,8,72,74,96,15,86,68,37,68,18,76,48,15, 
28,93,48,68,6,73,60,70,91,24,122,77,82,2,125,80,81,85,45,18,74,64,47,91,85, 
74,51,21,27,20,115,24,27,5,37,69,80,75,46,18,68,72,45,88,1,2,40,90,82,31,37, 
69,76,85,103,80,94,74,46,64,27,5,60,75,87,24,122,25,27,5,47,71,73,81,56,21, 
27,93,48,88,76,31,57,77,74,11,55,73,68,73,115,65,81,31,104,26,14,23,122,8,75, 
68,52,92,1,2,110,24,27,5,53,71,80,65,96,15,13,2,125,75,83,75,41,77,82,81,96, 
15,72,64,37,92,19,93,48,68,7,5,62,64,93,87,46,77,72,24,40,92,90,8,101,15,28, 
83,56,90,1,2,108,6,13,21,122,8,82,64,42,67,89,92,96,15,93,19,56,28,8,65,101, 
31,94,16,105,28,10,20,56,30,14,65,56,27,93,71,106,16,11,17,63,25,4,17,57,73, 
89,17,59,29,88,29,106,24,27,5,46,65,72,64,54,77,69,24,122,66,93,93,49,5,12,8, 
109,15,28,76,59,90,93,72,56,76,1,2,41,90,73,64,122,8,89,85,50,75,84,24,122, 
25,15,23,105,25,5,19,106,26,14,20,111,25,27,5,53,77,85,66,53,92,1,2,110,26, 
13,2,125,95,85,65,41,64,1,2,108,27,10,19,122,7,2>> 

儘管32位掩碼荷蘭國際集團關鍵是:

<<37,93,40,60,25,63,71,88,92,125,80,81,73,51,91,1,2,53,92,72,85,103,7,19,79,60, 
74,94,64,47,6,83>> 

http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2

j     = i MOD 4 
transformed-octet-i = original-octet-i XOR masking-key-octet-j 

不過,我似乎並沒有讓我從客戶端,這基本上是一個XML包發送原始字節的。任何方向,更正,建議非常感謝。

+0

確實,但是我沒有看到基本組幀協議的任何改變。它與上面鏈接中的定義相同。 – 2011-12-18 12:43:56

+0

查看github上的misultin項目。它有你需要的所有websocket解析代碼。原始代碼使用基於過程的方法,並且重用該代碼有點困難(https://github.com/ostinelli/misultin/blob/master/src/misultin_websocket.erl)。如果你需要一個功能類似foldl的解析代碼而不是基於進程,請看看我的分歧(https://github.com/gleber/misultin/branches/functionalize-ws-code)。 – gleber 2011-12-19 09:31:09

回答

1

我認爲你誤讀了協議規範的數據組幀部分。

您對第一個字節(129)的解釋是正確的 - fin + opcode 1 - 文本消息的最後(和第一)片段。
下一個字節(254)意味着消息的主體被屏蔽,並且接下來的2個字節提供了它的長度(126或127的長度意味着更長的消息,其長度不能用7位表示,126表示以下2個字節保存長度; 127表示其後4個字節)。
以下2個字節 - 1,120--表示消息長度爲376字節。
以下4個字節 - 37,93,40,60 - 是你的面具。
其餘的數據是你的消息,你寫的應該進行改造,使消息

& ltbody的xmlns = 'HTTP://jabber.org/protocol/httpbind' RID = '2167299354' 爲='jaxl。 im'xml:lang ='en'xmpp:version ='1.0'xmlns:xmpp ='urn:xmpp:xbosh'ack ='1'route ='xmpp:dev.jaxl.im:5222'wait = '30' hold ='1'content ='text/xml; charset = utf-8'ver ='1.1 0'newkey ='a6e44d87b54461e62de3ab7874b184dae4f5d870'sitekey ='jaxl-0-0'iframed ='true'epoch ='1324196722121'height ='321'width ='1366'/>

+0

還沒有嘗試過,但我相信這是抓住。可能我確實理解它是正確的,但沒有正確實現它(主要是由於在我的erlang代碼中不正確處理bit/binary)。謝謝你的正確指針,是的,這確實是我揭露之後尋找的包:)將從這裏剔除其餘的,謝謝 – 2011-12-20 01:10:16