自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

網(wǎng)絡(luò)協(xié)議:WebSocket協(xié)議的握手和數(shù)據(jù)幀

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
WebSocket是定義服務(wù)器和客戶端如何通過Web通信的一種網(wǎng)絡(luò)協(xié)議。協(xié)議是通信的議定規(guī)則。組成互聯(lián)網(wǎng)的協(xié)議組由IETF(互聯(lián)網(wǎng)工程任務(wù)組)發(fā)布。

WebSocket是定義服務(wù)器和客戶端如何通過Web通信的一種網(wǎng)絡(luò)協(xié)議。協(xié)議是通信的議定規(guī)則。組成互聯(lián)網(wǎng)的協(xié)議組由IETF(互聯(lián)網(wǎng)工程任務(wù)組)發(fā)布。IETF發(fā)布評(píng)議請(qǐng)求(Request for Comments,RFC),精確地規(guī)定了協(xié)議(包括RFC 6455):WebSocket協(xié)議。RFC 6455于2011年12月發(fā)布,包含了實(shí)現(xiàn)WebSocket客戶端和服務(wù)器時(shí)必須遵循的規(guī)則。

websocket基本上是一個(gè)很簡單的協(xié)議, 主要流程非常少, 實(shí)現(xiàn)起來也很簡單。

為簡單起見, 下面只分析握手和數(shù)據(jù)幀的報(bào)文.

一. 握手(handshake).

握手協(xié)議由客戶端發(fā)起, 服務(wù)器響應(yīng), 一來一回就完成了. 基本上是為了兼容現(xiàn)有的http基礎(chǔ)設(shè)施.

下面是一個(gè)客戶端發(fā)起的握手請(qǐng)求:

47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A GET./.HTTP/1.1..  
55 70 67 72 61 64 65 3A 20 77 65 62 73 6F 63 6B Upgrade:.websock 
65 74 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 et..Connection:. 
55 70 67 72 61 64 65 0D 0A 48 6F 73 74 3A 20 31 Upgrade..Host:.1 
39 32 2E 31 36 38 2E 38 2E 31 32 38 3A 31 33 30 92.168.8.128:130 
30 0D 0A 4F 72 69 67 69 6E 3A 20 6E 75 6C 6C 0D 0..Origin:.null. 
0A 50 72 61 67 6D 61 3A 20 6E 6F 2D 63 61 63 68 .Pragma:.no-cach 
65 0D 0A 43 61 63 68 65 2D 43 6F 6E 74 72 6F 6C e..Cache-Control 
3A 20 6E 6F 2D 63 61 63 68 65 0D 0A 53 65 63 2D :.no-cache..Sec- 
57 65 62 53 6F 63 6B 65 74 2D 4B 65 79 3A 20 64 WebSocket-Key:.d 
33 35 39 46 64 6F 36 6F 6D 79 71 66 78 79 59 46 359Fdo6omyqfxyYF 
37 59 61 63 77 3D 3D 0D 0A 53 65 63 2D 57 65 62 7Yacw==..Sec-Web 
53 6F 63 6B 65 74 2D 56 65 72 73 69 6F 6E 3A 20 Socket-Version:. 
31 33 0D 0A 53 65 63 2D 57 65 62 53 6F 63 6B 65 13..Sec-WebSocke 
74 2D 45 78 74 65 6E 73 69 6F 6E 73 3A 20 78 2D t-Extensions:.x- 
77 65 62 6B 69 74 2D 64 65 66 6C 61 74 65 2D 66 webkit-deflate-f 
72 61 6D 65 0D 0A 55 73 65 72 2D 41 67 65 6E 74 rame..User-Agent 
3A 20 4D 6F 7A 69 6C 6C 61 2F 35 2E 30 20 28 57 :.Mozilla/5.0.(W 
69 6E 64 6F 77 73 20 4E 54 20 36 2E 31 3B 20 57 indows.NT.6.1;.W 
4F 57 36 34 29 20 41 70 70 6C 65 57 65 62 4B 69 OW64).AppleWebKi 
74 2F 35 33 37 2E 33 36 20 28 4B 48 54 4D 4C 2C t/537.36.(KHTML, 
20 6C 69 6B 65 20 47 65 63 6B 6F 29 20 43 68 72 .like.Gecko).Chr 
6F 6D 65 2F 33 32 2E 30 2E 31 36 35 33 2E 30 20 ome/32.0.1653.0. 
53 61 66 61 72 69 2F 35 33 37 2E 33 36 0D 0A 0D Safari/537.36... 
0A  

0D 0A 0D 0A, 也就是用"\r\n\r\n"收尾, 這和http頭沒什么區(qū)別. 轉(zhuǎn)換成字符串就是:

GET / HTTP/1.1  
Upgrade: websocket 
Connection: Upgrade 
Host: 192.168.8.128:1300 
Origin: null 
Pragma: no-cache 
Cache-Control: no-cache 
Sec-WebSocket-Key: d359Fdo6omyqfxyYF7Yacw== 
Sec-WebSocket-Version: 13 
Sec-WebSocket-Extensions: x-webkit-deflate-frame 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1653.0 Safari/537.36 

其中有一對(duì)重要的kv, 就是Sec-WebSocket-Key: d359Fdo6omyqfxyYF7Yacw==, 看上去是一個(gè)base64編碼后的結(jié)果, 服務(wù)器需要對(duì)這個(gè)sec-key作一些處理, 并返回握手響應(yīng), 這個(gè)處理是:

  1. byte[] sha = sha1(("d359Fdo6omyqfxyYF7Yacw==" + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").getBytes());  
  2. System.out.println(new String(Base64.getEncoder().encode(sha)));  

也就是原封不動(dòng)的拿著這個(gè)sec-key和另一個(gè)神奇的字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"相連, 再經(jīng)過sha1摘要

算法處理, 最后再經(jīng)過base64編碼輸出即可, 上面的輸出結(jié)果應(yīng)該是: pLO2KC7b5t0TZl1E6A3sqJ6EzU4=

服務(wù)器在收到握手請(qǐng)求后, 如果愿意提供服務(wù), 則返回一個(gè)握手響應(yīng), 如下:

  1. HTTP/1.1 101 Switching Protocols  
  2. Connection: Upgrade  
  3. Upgrade: WebSocket  
  4. Sec-WebSocket-Accept: pLO2KC7b5t0TZl1E6A3sqJ6EzU4=  

遵循h(huán)ttp的規(guī)則, 字節(jié)流上一樣是要以"\r\n\r\n"收尾.

二. 數(shù)據(jù)幀

rfc6455上叫做非控制幀, 除了非控制幀之外, 就是控制幀. 包括connection close, ping, pong等幀, 這里只講非控制幀, 也就是數(shù)據(jù)幀.

數(shù)據(jù)幀從長度上可以分為三種. 幀中的靜荷數(shù)據(jù)(payload data)長度小于0x7E的為小幀, 靜荷數(shù)據(jù)長度 >=0x7E又<=0x10000的為中幀,

再長的叫大幀.

數(shù)據(jù)幀從類型上暫時(shí)可以分為兩種, 文本幀和二進(jìn)制幀.

例子:

a). 一個(gè)從客戶端發(fā)向服務(wù)端的小幀.

  1. 82 B0 6A F7 C6 30 0A D9 C6 34 D4 18 78 C1 6E F5 ..j..0...4..x.n.  
  2. C6 30 6C D5 CC 10 23 87 AF 48 3C A2 9C 64 01 C4 .0l...#..H<..d..  
  3. AE 59 04 C5 B1 5B 35 85 A3 41 18 B0 F5 5C 13 8E .Y...[5..A...\..  
  4. 92 42 02 84 85 53                               .B...S  

82

二進(jìn)制為: 1000 0010, 最高位(FIN)為1, 表示這是最后一幀, 第一個(gè)幀也可能是最后一幀. 身后還有三位為預(yù)留. 低位四0010為操作碼.

也就是0x02, 表示這是一個(gè)二進(jìn)制幀, 0x01為文本幀.

B0

二進(jìn)制為: 1011 0000, 最高位(MASK)為1, 表示當(dāng)前幀的靜荷數(shù)據(jù)部分使用了掩碼, 事實(shí)上, rfc6455規(guī)定從客戶端發(fā)往服務(wù)器端的數(shù)據(jù)幀

必需使用掩碼, 反過來, 從服務(wù)器發(fā)回來的, 則必需不使用掩碼. 低7位為靜荷數(shù)據(jù)長度字段, 這里是011 0000, 也就是0x30, 從上面的報(bào)文上

看, 這個(gè)0x30沒有包含后面的掩碼.

6A F7 C6 30

掩碼, 掩碼總是四個(gè)字節(jié).

0A D9 C6...一直到最后為經(jīng)過掩碼加工后的靜荷數(shù)據(jù). 要回到數(shù)據(jù)本來的面目, 使用下面的算法:

  1. byte by[] = new byte[]{0x82, 0xB0, 0x6A, 0xF7, 0xC6, 0x30, 0x0A....};  
  2. byte mask[] = new byte[] { 0x6A, (byte) 0xF7, (byte) 0xC6, 0x30 };  
  3. for (int i = 6 /* 越過掩碼. */; i < by.length; i++)  
  4.     by[i] = (byte) (by[i] ^ mask[(i - 6) % 4]);  

得到的結(jié)果應(yīng)該是:

  1. 82 B0 6A F7 C6 30 60 2E 00 04 BE EF BE F1 04 02 ..j..0`.........  
  2. 00 00 06 22 0A 20 49 70 69 78 56 55 5A 54 6B 33 ..."..IpixVUZTk3  
  3. 68 69 6E 32 77 6B 5F 72 65 71 72 47 33 6C 79 79 hin2wk_reqrG3lyy  
  4. 54 72 68 73 43 63                               TrhsCc  

b). 一個(gè)從服務(wù)器發(fā)給客戶端的小幀.

  1. 82 29 61 27 01 04 BE EF BE F1 05 02 00 00 06 1B .)a'............  
  2. 0A 08 55 3B 02 19 39 35 E2 44 12 0F 21 EC BC 47 ..U;..95.D..!..G  
  3. 02 F3 EC 70 ED 5B 7B 07 C7 F4 D0                ...p.[{....  

更簡單了, 還是82, 最后一幀, 二進(jìn)制幀, 29, 0010 1001, 無掩碼, 也就是身后全長為0x29.

c). 未使用掩碼的中幀.

81 7E 01 00 66 77 88 ..., 幀長為 0x0100, 也就是256個(gè)字節(jié).

d). 未使用掩碼的大幀.

82 7F 00 00 00 00 11 22 33 44 66 77 88 ..., 幀長為0x0000000011223344, 直接跳過4字節(jié), 而使用8字節(jié)來表示長度, 非常暴力.

這里需要注意的是, websocket要求使用最小幀原則, 也就是靜荷數(shù)據(jù)長度小于0x7E幀, 不能使用中幀或大幀的來表示. 長度小于

0x10000的幀也不能用大幀來表示.

責(zé)任編輯:藍(lán)雨淚 來源: CSDN博客
相關(guān)推薦

2025-02-08 10:11:25

2020-09-25 17:54:48

算法AI數(shù)據(jù)

2019-03-28 13:34:22

IP TCP握手

2018-12-03 05:54:48

Wireshark網(wǎng)絡(luò)協(xié)議TCP

2010-06-08 16:35:24

LIN總線協(xié)議

2022-10-08 00:00:00

websocket協(xié)議HTTP

2022-03-18 10:43:12

WebSocketHTML5TCP 連接

2023-12-29 20:25:51

2014-06-13 13:47:31

UDP

2023-12-07 19:19:11

2010-06-17 17:51:12

資源預(yù)留協(xié)議

2011-08-24 09:56:13

網(wǎng)絡(luò)協(xié)議BOOTP協(xié)議TFTP協(xié)議

2011-08-24 10:31:01

網(wǎng)絡(luò)協(xié)議SLIPPPP

2014-09-26 09:24:32

HTTP

2022-01-06 10:23:49

HTTPS協(xié)議數(shù)據(jù)

2014-06-16 09:22:59

2010-06-17 18:00:40

網(wǎng)絡(luò)通訊協(xié)議

2018-12-24 06:56:12

物聯(lián)網(wǎng)網(wǎng)絡(luò)協(xié)議MiWi

2010-09-02 23:52:15

VoIP網(wǎng)絡(luò)協(xié)議

2011-08-24 09:46:33

NetBIOS協(xié)議NetBEUI協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)