HTTP協議原理及java實現:數據的基本傳輸模式

zu說到基於TCP協議的上層協議,絕對繞不開的是HTTP協議,在其設計之初,設計者絕對想不到該協議具備的靈活性能夠讓其成爲最廣泛使用的TCP上層協議,在我看來HTTP協議幾乎能夠取代任何基於TCP的上層協議,如今基於互聯網的絕大多數移動應用,他們使用的都是HTTP協議,甚至蘋果專用的流媒體傳輸協議HLS,使用的也是HTTP協議,同時現在非常流行的所謂小程序,它們也要基於HTTP協議實現客戶端與服務器端的通訊,因此掌握TCP/IP協議就必須要掌握HTTP協議。

HTTP協議的目的非常簡單,就是讓客戶端快速簡潔的從服務器請求超文本文件,隨着協議的不斷進化,它的靈活性能引入更多複雜功能,在深入介紹其原理之前,我們先看看協議規範下,客戶端如何與服務器溝通。HTTP協議的運行基於簡單的請求-迴應模式,首先客戶端根據HTTP協議規定構造特定結構的HTTP文本,將客戶端要請求的數據信息放置在文本中發送給服務器;服務器收到請求後,結合HTTP協議規範解讀客戶端發送來的信息,然後將客戶端請求的數據返回,HTTP基本交互模式如下:

屏幕快照 2020-04-08 下午5.34.13.png

在HTTP1.0中,客戶端與服務器屬於“一夜情”模式,雙方建立的連接在一次信息交互後立馬斷開,如果雙方需要多次數據交互,那麼就需要進行多次tcp連接,這是1.0版本讓人詬病之處,HTTP協議在運行時經常使用到中介,於是客戶端先把請求發送給中介,中介先對請求數據做預處理,如果客戶端想要的數據已經存儲在中介,那麼中介就會立即將數據返回,於是客戶端與服務器就沒有交互。如果中介沒有客戶端想要的數據,他就會將請求轉發給服務器,服務器應答請求後會將數據返回給中介,中介將數據緩存,然後將數據回發給客戶端,基本流程如下:

屏幕快照 2020-04-08 下午5.49.04.png

從這裏可以看到,中介相對於客戶端,它扮演了服務器的角色,相對於服務器,它又扮演了客戶端的角色。同時可以有多箇中介存在於客戶端與服務器之間正如上圖所示。中介對數據的緩存對HTTP協議的效率提升非常有幫助,例如在我們瀏覽網頁時,網頁數據很可能被中介服務器緩存,如果我們下次想再次瀏覽相同網頁,那麼中介就可以直接將緩存的頁面返還給瀏覽器,於是網頁打開的速度會大大加快。例如在上圖中,如果最左端的客戶端請求的文件在第一個中介服務器就有緩存,那麼數據就不要傳輸到最右端的服務器,最左邊的緩存可以直接將數據返回給客戶端,於是客戶端的處理效率能大大提升。

在HTTP1.0模式中,客戶端與服務器完成一次數據交互後就斷開TCP連接。這種模式雖然簡單但會帶來效率問題。例如瀏覽器像服務器請求頁面後,頁面顯示時會包含很多圖片,此時瀏覽器又得與服務器經過多次TCP連接來下載頁面所需圖片,由於TCP連接非常耗時因此這種方式會大大降低頁面的加載和渲染效率。HTTP1.1對該問題進行了改良,它讓客戶端與服務器保持持久連接,於是客戶端和服務器就可以通過一次連接傳輸多種數據。HTTP1.1帶來的持久連接還有一個好處就是能讓客戶端實現請求的管道化傳輸,如果客戶端要向服務器請求數據A,B,C,那麼它不用像HTTP1.0時代,先請求A,然後請求B最後再請求C,它可以一次把三個文件的請求發送給服務器,服務器也能一次將數據推送給客戶端,從而減輕了服務器負載。

當然持久連接也有代價,那就是增加了複雜性。由於服務器一次將所有數據推送給客戶端,於是客戶端就得負責處理一次到來的大堆數據,特別是服務器很可能把多個文件以數據流的方式推送給客戶端,因此後者必須小心切分數據流將多個數據文件瓦解開來。在HTTP1.1版本中,服務器會在80端口等待客戶端的連接。客戶端主動發起TCP握手,實現兩者的TCP連接,成功連接後客戶端必須通知服務器它想使用哪個版本的HTTP協議。如果使用HTTP1.0,那麼服務器會在推送一次數據後主動斷開連接,如果客戶端使用HTTP1.1,但它又希望服務器在推送一次數據後主動斷開連接,那麼它在請求數據裏就要添加字段“Connection:close",這樣服務器就會在推送一次數據後斷開連接。

在持久連接情況下,客戶端必須要記錄它從服務器獲得了哪些數據。因爲連接可能會因爲各種原因中斷。如果客戶端在接收數據時連接突然中斷,那麼客戶端需要知道哪些數據已經獲取,哪些數據還沒得到,那麼它下次主動發起連接時就只需要請求那些還沒有獲得的數據。從下一節開始我們分析HTTP的數據包格式,爲代碼實現HTTP協議做準備。

更詳細的講解和代碼調試演示過程,請點擊鏈接

更多技術信息,包括操作系統,編譯器,面試算法,機器學習,人工智能,請關照我的公衆號:
這裏寫圖片描述

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