TCP協議的部分解析
說明:
1).本文以TCP的發展歷程解析容易引起混淆,誤會的方方面面
2).本文不會貼大量的源碼,大多數是以文字形式描述,我相信文字看起來是要比代碼更輕松的
3).針對對象:對TCP已經有了全面了解的人。因為本文不會解析TCP頭裡面的每一個字段或者3次握手的細節,也不會解釋慢啟動和快速重傳的定義
4).除了《TCP/IP詳解》(卷一,卷二)以及《Unix網絡編程》以及Linux源代碼之外,絡更好的資源是RFC
5).本文給出一個提綱,如果想了解細節,請直接查閱RFC
6).翻來覆去,終於找到了這篇備忘,本文基於這篇備忘文檔修改。
1.網絡協議設計
ISO提出了OSI分層網絡模型,這種分層模型是理論上的,TCP/IP最終實現了一個分層的協議模型,每一個層次對應一組網絡協議完成一組特定的功能,該組網絡協議被其下的層次復用和解復用。這就是分層模型的本質,最終所有的邏輯被編碼到線纜或者電磁波。
分層模型是很好理解的,然而對於每一層的協議設計卻不是那麼容易。TCP/IP的漂亮之處在於:協議越往上層越復雜。我們把網絡定義為互相連接在一起的設備,網絡的本質作用還是“端到端”的通信,然而希望互相通信的設備並不一定要“直接”連接在一起,因此必然需要一些中間的設備負責轉發數據,因此就把連接這些中間設備的線纜上跑的協議定義為鏈路層協議,實際上所謂鏈路其實就是始發與一個設備,通過一根線,終止於另一個設備。我們把一條鏈路稱為“一跳”。因此一個端到端的網絡包含了“很多跳”。
2.TCP和IP協議
終止於IP協議,我們已經可以完成一個端到端的通信,為何還需要TCP協議?這是一個問題,理解了這個問題,我們就能理解TCP協議為何成了現在這個樣子,為何如此“復雜”,為何又如此簡單。
正如其名字所展示的那樣,TCP的作用是傳輸控制,也就是控制端到端的傳輸,那為何這種控制不在IP協議中實現的。答案很簡單,那就是這會增加IP協議的復雜性,而IP協議需要的就是簡單。這是什麼原因造成的呢?
首先我們認識一下為何IP協議是沙漏的細腰部分。它的下層是繁多的鏈路層協議,這些鏈路提供了相互截然不同且相差很遠的語義,為了互聯這些異構的網絡,我們需要一個網絡層協議起碼要提供一些適配的功能,另外它必然不能提供太多的“保證性服務”,因為上層的保證性依賴下層的約束性更強的保證性,你永遠無法在一個100M吞吐量的鏈路之上實現的IP協議保證1000M的吞吐量...
IP協議設計為分組轉發協議,每一跳都要經過一個中間節點,路由的設計是TCP/IP網絡的另一大創舉,這樣,IP協議就無需方向性,路由信息和協議本身不再強關聯,它們僅僅通過IP地址來關聯,因此,IP協議更加簡單。
路由器作為中間節點也不能太復雜,這涉及到成本問題,因此路由器只負責選路以及轉發數據包。
因此傳輸控制協議必然需要在端點實現。在我們詳談TCP協議之前,首先要看一下它不能做什麼,由於IP協議不提供保證,TCP也不能提供依賴於IP下層鏈路的這種保證,比如帶寬,比如時延,這些都是鏈路層決定的,既然IP協議無法修補,TCP也不能,然而它卻能修正始於IP層的一些“不可保證性質”,這些性質包括IP層的不可靠,IP層的不按順序,IP層的無方向/無連接。