netty實現websocket(一)----HTTP與WebSocket

1 HTTP協議及其弊端

1.1 HTTP介紹
HTTP協議屬於應用層協議,目前有HTTP1.0與HTTP1.1。HTTP協議的主要特點如下:
1)支持客戶/服務器模式。
2)簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
3)靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4)無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
5)無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

具體介紹參考博文:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

HTTP1.0與HTTP1.1之間的區別:

HTTP 1.0規定瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器完成請求處理後立即斷開TCP連接,服務器不跟蹤每個客戶也不記錄過去的請求;
HTTP 1.1支持持久連接,在一個TCP連接(參考博文:http://www.cnblogs.com/renyuan/archive/2013/01/19/2867720.html)上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲。一個包含有許多圖像的網頁文件的多個請求和應答可以在一個連接中傳輸,但每個單獨的網頁文件的請求和應答仍然需要使用各自的連接。HTTP 1.1還允許客戶端不用等待上一次請求結果返回,就可以發出下一次請求,但服務器端必須按照接收到客戶端請求的先後順序依次回送響應結果,以保證客戶端能夠區分出每次請求的響應內容,這樣也顯著地減少了整個下載過程所需要的時間。
這裏寫圖片描述
具體介紹可以參考博文:http://blog.csdn.net/elifefly/article/details/3964766

1.2 HTTP協議的弊端

1)HTTP協議是半雙工的協議,半雙工協議指數據可以在客戶端和服務器端兩個方向上傳輸,但是不能同時傳輸,這意味着同一時刻只有一個方向上的數據傳輸;
2)HTTP消息冗長而繁瑣,HTTP消息包含消息頭、消息體、換行符等,通常情況下采用文本方式傳輸,相比其他二進制的通信協議,冗長而繁瑣;
3)針對於服務器推送的黑客攻擊,如長時間的輪詢:瀏覽器不斷向服務器發出請求,然而HTTP request的Header是非常冗長的,裏面包含的可用數據比例可能非常低,這會佔用很多的帶寬資源和服務器資源。

2 Websocket

2.1 websocket介紹
websocket是HTML5開始提供的一中瀏覽器與服務器進行全雙工通信的網絡協議。在websocket API中,瀏覽器與服務器只需要做一個握手的動作,然後,瀏覽器和服務器就形成了一條快速通道,兩者就可以直接互相傳送數據。websocket基於TCP雙向全雙工進行消息傳遞,在同一時刻,既可以發送消息,也可以接受消息。其主要特點如下:

1)單一的TCP連接,採用全雙工模式通信;
2)無頭部信息、cookie和身份驗證
3)無安全開銷
4)服務器可以主動傳遞消息給客戶端,不在需要客戶端輪詢

2.2 websocket連接的建立
WebSocket在建立握手連接時,數據是通過http協議傳輸的;但是在建立連接之後,真正的數據傳輸階段是不需要http協議參與的。(ps:Websocket與HTTP、TCP的關係可以參考博文:http://blog.csdn.net/linwei_1029/article/details/47836249)

首先我們來看個典型的Websocket握手:
這裏寫圖片描述
這段HTTP請求和普通的HTTP有一點差別,那就多了這兩個玩意,這表明這是一個升級版本的HTTP—websocket
這裏寫圖片描述

Sec-WebSocket-Key 是一個Base64 encode的值,這個是瀏覽器隨機生成的。服務器端會根據這些數據來構造一個SHA-1的信息摘要,將其值放入“Sec-WebSocket-Accept”中返回給客戶端。如下爲服務器返回的東西,表示已經接受到成功建立Websocket啦!
這裏寫圖片描述
2.3 websocket連接的關閉
爲關閉websocket連接,客戶端和服務器端需要通過一個安全的方法關閉底層TCP連接以及TLS會話。如果合適,丟棄任何可能已經接收的字節,必要時(比如受到攻擊)可以通過任何可用的手段關閉連接。

底層的TCP連接,在正常情況下,應該首先由服務器關閉。在異常情況下,客戶端可以發起TCP Close。當服務器被指使關閉websocket連接時,它應該立即發起一個TCP Close;客戶端應該等待服務器的TCP Close。

參考博文:http://jinnianshilongnian.iteye.com/blog/1909962

其他參考博文:
【1】http://zengrong.net/post/2199.htm
【2】http://www.zhihu.com/question/20215561

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章