偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

WebSocket是定義服務(wù)器和客戶(hù)端如何通過(guò)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客戶(hù)端和服務(wù)器時(shí)必須遵循的規(guī)則。

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

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

一. 握手(handshake).

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

下面是一個(gè)客戶(hù)端發(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頭沒(méi)什么區(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)過(guò)sha1摘要

算法處理, 最后再經(jīng)過(guò)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ù)幀從長(zhǎng)度上可以分為三種. 幀中的靜荷數(shù)據(jù)(payload data)長(zhǎng)度小于0x7E的為小幀, 靜荷數(shù)據(jù)長(zhǎng)度 >=0x7E又<=0x10000的為中幀,

再長(zhǎng)的叫大幀.

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

例子:

a). 一個(gè)從客戶(hù)端發(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ī)定從客戶(hù)端發(fā)往服務(wù)器端的數(shù)據(jù)幀

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

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

6A F7 C6 30

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

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

  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 /* 越過(guò)掩碼. */; 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ā)給客戶(hù)端的小幀.

  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.[{....  

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

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

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

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

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

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

0x10000的幀也不能用大幀來(lái)表示.

責(zé)任編輯:藍(lán)雨淚 來(lái)源: 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é)議

2023-12-29 20:25:51

2022-03-18 10:43:12

WebSocketHTML5TCP 連接

2022-10-08 00:00:00

websocket協(xié)議HTTP

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-06-16 09:22:59

2018-12-24 06:56:12

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

2010-06-17 18:00:40

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

2014-09-26 09:24:32

HTTP

2022-01-06 10:23:49

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

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)