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