1. 程式人生 > >HTTP和TCP之間的關係

HTTP和TCP之間的關係

在解釋兩者之間的關係之前,我們必須從巨集觀的角度瞭解網際網路的整個互動模型。因為當了解網際網路在大體上是如何運作時,我們才能瞭解HTTP和TCP存在的意義,包括他們所要解決的問題是。

 (此圖來自Udacity的網路協議教程)

網際網路的模型被分為4層,從上至下每一層都依賴其底層協議。換言之,Application(應用層) 的協議操作成功的前提是Transport(運輸層)的存在。沒有運輸層就沒有應用層。好比沒有任何道路的前提下就沒有汽車可以行駛。而這種層次上的抽象是讓開發者在設定某個層面的協議時不去考慮其他層面的問題。比如我要在運輸層設計協議時,我唯一要考慮的是如何將資料從一臺計算機傳到另外一臺,我需要著重的是其穩定性和效率。在解決運輸層的問題時我不需要考慮傳達的資料是什麼型別或內容,因為這樣的問題是應用層索要操心的。在上圖中可以看到HTTP和TCP是存在於不同層面的網路協議,所以他們之間必然存在著依賴關係。確切的說是HTTP所設定的所有規則都建立在一個假設之上,那就是運輸層的協議有在正常運作。

那HTTP和TCP分別代表了什麼呢?

HTTP的責任是去定義資料,在兩臺計算機相互傳遞資訊時,HTTP規定了每段資料以什麼形式表達才是能夠被另外一臺計算機理解。而TCP所要規定的是資料應該怎麼傳輸才能穩定且高效的傳遞與計算機之間。

HTTP的核心概念

除了HTTP存在於應用層之外,該協議還有5個特點。

1. HTTP的標準建立在將兩臺計算機視為不同的角色:客戶端和伺服器。客戶端會向伺服器傳送不同的請求(request),而伺服器會對應每個請求給出迴應(response)。

2. HTTP屬於無狀態協議(Stateless)。這表示每一個請求之間是沒有相關性的。在該協議的規則中伺服器是不會記錄任何客戶端操作,每一次請求都是獨立的。(記錄使用者瀏覽行為會通過其他技術實現)

3. 客戶端的請求被定義在幾個動詞意義範圍內。最長用到的是GET和POST,其他動詞還包括DELETE, HEAD等等。

4. 伺服器的迴應被定義在幾個狀態碼之間:5開頭表示伺服器錯誤,4開頭表示客戶端錯誤,3開頭表示需要做進一步處理,2開頭表示成功,1開頭表示在請求被接受處理的同時提供的額外資訊。

5. 不管是客戶端的請求資訊還是伺服器的迴應,雙方都擁有一塊頭部資訊(Header)。頭部資訊是自定義,其用途在於傳遞額外資訊(瀏覽器資訊、請求的內容型別、相應的語言)。

TCP的核心概念

在HTTP的規範內,兩臺計算機的互動被視為request和response的傳遞。而在實際的TCP操作中,資訊傳遞會比單純的傳遞request和response要複雜。通過TCP建立的通訊往往需要計算機之間多次的交換資訊才能完成一次request或response。

TCP的傳輸資料的核心是在於將資料分為若干段並將每段資料按順序標記。標記後的順序可以以不同的順序被另一方接收並整合回完整的資料。計算機對每一段資料的成功接收都會做出相應,確保所有資料的完整性。

TCP在傳遞資料時依賴於實現定義好的幾個標記(Flags)去向另一方表態傳達資料和連線的狀態:

* F : FIN - 結束; 結束會話
* S : SYN - 同步; 表示開始會話請求
* R : RST - 復位;中斷一個連線
* P : PUSH - 推送; 資料包立即傳送
* A : ACK - 應答
* U : URG - 緊急
* E : ECE - 顯式擁塞提醒迴應
* W : CWR - 擁塞視窗減少

也是基於這些標誌TCP可以實現三次(three ways handshake)和四次握手 (four ways tear down)。三次握手是初步建立連線的機制,而四次握手則是斷開連結。兩者之間大致操作是一樣的,A發出建立連結(SYN)或者斷開連結(FIN)的請求,B認可(ACK)其請求然後發出同樣的請求給A並等待A的認可。在雙方認可後,連結正式成立或者斷開。

這裡有兩個問題:

1. 為什麼A發出請求並且得到認可後B還有重複同樣的動作?

在建立連線的過程中SYN標記代表的是一個隨機序列號,因為當檔案被切斷的時候並不是從0或者1開始標記每段的順序,所以雙方都需要通過傳遞SYN來告知檔案片段的第一個序列是多少號。

2. 為什麼同樣的機制,建立連結和斷開連結需要握手的次數不同?

三次和四次握手的區別在於,在建立連線時,B的ACK和SYN會一起傳送回A,而在斷開連結時因為B傳送ACK之後還要做其他處理後才能返回FIN,,因此將兩步拆開。