網(wǎng)站登錄賬號(hào)密碼保存在哪里推廣手段有哪些
一、前言
上一篇??WebSocket實(shí)戰(zhàn)之一?講了WebSocket一個(gè)極簡(jiǎn)例子和基礎(chǔ)的API的介紹,這一篇來(lái)分析一下WebSocket的協(xié)議,學(xué)習(xí)網(wǎng)絡(luò)協(xié)議最好的方式就是抓包分析一下什么就都明白了。
二、WebSocket協(xié)議
本想盜一張網(wǎng)絡(luò)圖,后來(lái)想想不太好,還是自己畫(huà)了一張。
1、WebSocket握手
WebSocket握手是用一個(gè)特殊的HTTP請(qǐng)求和響應(yīng)來(lái)完成,客戶端握手請(qǐng)求頭會(huì)攜帶Upgrade:websocket,表示請(qǐng)求將協(xié)議升級(jí)為WebSocket協(xié)議。
響應(yīng)碼 101 表示同意將協(xié)議進(jìn)行升級(jí),Sec-WebSocket-Accept是從請(qǐng)求的Sec-WebSocket-key繼承而來(lái),包含一個(gè)特殊的響應(yīng)值,必須和客戶端預(yù)期精確匹配才能握手成功。Sec-WebSocket-Accept=Base64(SHA1(Sec-WebSocket-key+KEY_SUFFIX))。
2、發(fā)送數(shù)據(jù)
WebSocket握手成功連接打開(kāi)后,客戶端和服務(wù)端就可以在任何時(shí)候相互發(fā)送數(shù)據(jù),在昨天簡(jiǎn)單例子中客戶端open事件加上發(fā)送信息,在瀏覽器可以看到發(fā)送的消息和接收到的消息。這就是和HTTP最本質(zhì)的區(qū)別,只要握手完成后無(wú)論哪一端想發(fā)送數(shù)據(jù)就發(fā)送,而不是像HTTP那樣服務(wù)端一定要等客戶端的請(qǐng)求然后做出響應(yīng)。
將前一節(jié)例子客戶端也改成每隔5秒發(fā)送一條數(shù)據(jù)。
在瀏覽器控制臺(tái)Message標(biāo)簽可以查看Send(向上箭頭)和Receive(向下箭頭)的數(shù)據(jù),全雙工相互發(fā)送。
3、關(guān)閉握手
終止連接的端點(diǎn)發(fā)送一個(gè)數(shù)字代碼以及關(guān)閉原因字符串,關(guān)閉握手能正常關(guān)閉連接,使應(yīng)用程序可以區(qū)分出是有意關(guān)閉還是意外終止連接。
三、抓包分析
IP:115.192.133.59 WebSocket客戶端
IP:172.16.79.224? ?WebSocket服務(wù)端(內(nèi)網(wǎng)IP)
為了便于查看數(shù)據(jù)包內(nèi)容,代碼稍微調(diào)整,將客戶端服務(wù)端持續(xù)發(fā)送數(shù)據(jù)去掉
服務(wù)端改為接連發(fā)送三條數(shù)據(jù)
客戶端改為不發(fā)送消息,而只在收到消息后關(guān)閉websocket
1、【1、2、3】開(kāi)始三個(gè)包就是普通的TCP三次握手。
2、【4】第4個(gè)包是請(qǐng)求頭攜帶了Upgrade:websocket的普通HTTP請(qǐng)求。
3、【5】服務(wù)端一個(gè)TCP響應(yīng)包,【6】服務(wù)端一個(gè)HTTP響應(yīng)包,101 Switching Protocols告訴客戶端協(xié)議進(jìn)行升級(jí)。
4、【7、8、9】第7、8、9個(gè)包,服務(wù)端向客戶端以WebSocket協(xié)議發(fā)送了三個(gè)包,WebSocket以幀格式發(fā)送消息內(nèi)容
-
Fin:1位,用來(lái)表明這是一個(gè)消息的最后的消息片斷,當(dāng)然第一個(gè)消息片斷也可能是最后的一個(gè)消息片斷.
-
RSV1, RSV2, RSV3: 分別都是1位,如果雙方之間沒(méi)有約定自定義協(xié)議,那么這幾位的值都必須為0,否則必須斷掉WebSocket連接.
-
Opcode:4位操作碼,定義有效負(fù)載數(shù)據(jù),如果收到了一個(gè)未知的操作碼,連接也必須斷掉,以下是定義的操作碼.
-
Payload length: 傳輸數(shù)據(jù)的長(zhǎng)度,以字節(jié)的形式表示.
-
Payload data: 負(fù)載數(shù)據(jù),這一幀里傳的數(shù)據(jù)是 【b】.
5、【10、11、12、13】客戶端向服務(wù)端發(fā)送4個(gè)TCP應(yīng)答包,應(yīng)該是對(duì)收到消息的一個(gè)應(yīng)答
6、【14】客戶端調(diào)用close方法關(guān)閉websocket連接,可以看到在關(guān)閉之前服務(wù)端包已經(jīng)發(fā)出來(lái)了。
7、【15】服務(wù)端對(duì)客戶端的close進(jìn)行了應(yīng)答,關(guān)閉了連接。
8、【16、17、18、19、20】 TCP的4次揮手,另外一個(gè)包沒(méi)搞清楚是做什么的。
四、總結(jié)
WebSocket是基于TCP的,與HTTP同樣也是應(yīng)用層協(xié)議,但WebSocket的首次握手是依賴于HTTP協(xié)議,握手成功協(xié)議升級(jí)為WebSocket,然后就是長(zhǎng)連接可以相互一直發(fā)送消息而不再是HTTP的那種請(qǐng)求/響應(yīng)機(jī)制,另外可以看到客戶端的端口在開(kāi)始隨機(jī)用了一個(gè)值是52914后,在關(guān)閉之前一直會(huì)用同一端口,這樣才能找得到,IP用來(lái)找機(jī)器,端口用來(lái)找應(yīng)用。
注:下一篇再介紹一下心跳機(jī)制以及斷開(kāi)重連機(jī)制。