計算機網絡協議第八章,TCP協議基礎

      TCP協議同IP協議一樣,作爲網絡協議的核心,本章將對TCP協議進行介紹,第一部分主要是闡述TCP協議設計的考慮,能夠掌握TCP設計的目的和模型,第二部分通過分析TCP首部,通過闡述進一步分析TCP協議具體手段。

TCP協議背景

引言

      上一章對TCP/IP協議的背景和誕生做了介紹,這裏強調幾點。TCP/IP常被同時提及,因爲它們的前身就是NCP,這兩個協議同時誕生,是要早於UDP協議。目前傳輸層協議中TCP有舉足輕重的地位,大量的應用層協議基於TCP。而UDP是在IP層上封裝端口號,實質上沒有過的的設計,而後來出現的SCTP協議作爲傳輸層協議,有顯著的特點。


TCP的頂層設計

     作爲應用層軟件工程師,TCP協議比IP協議多了端口號是最直觀的印象,TCP的端口號確實是用來區分物理機器上的不同進程。這可能是我最早對TCP協議的印象了吧。這部分我們拋開對TCP首部的定義,專門談TCP的設計的原因。

     談TCP協議不得不談到IP協議,它們是密不可分的,可以說是緊耦合。之所以要設計TCP協議,我認爲其主要的原因是要解決IP協議對應用層使用的麻煩。IP協議作爲低層次的協議,主要服務的對象是物理機器,而應用層直接使用IP協議又會帶來很多麻煩。比如IP協議的包亂序問題,丟包問題等等。因此TCP協議的設計初衷就是解決這些問題,它提供了可靠的傳輸服務。它作爲網絡層和應用層直接的橋樑,使得應用層不在需要擔心網絡丟包、亂序等等問題,更加專注於業務的開發。

     TCP協議不僅是一個可靠的傳輸服務,而且是一個字節流傳輸服務,之所以要設計爲字節流服務的原因在於TCP要高效的利用網絡帶寬,TCP協議的字節流和UDP的數據報服務是相對應的,數據報協議是以消息爲單位的,應用層調用sendto函數發送多少字節的數據,這些數據最終都作爲一個IP數據報發送,可能帶來網絡帶寬的浪費,還記得以太網的最小幀爲60字節把,如果UDP只傳輸1個字節的應用層數據,那麼還不到以太網最小幀數據大小,因此會padding,再舉個例子如果數據大於MTU,那麼IP層會分片,最後一片如果用不滿MTU也是一種浪費。

     TCP協議還是一個有狀態的服務,試想下UDP協議是無狀態,這兩者有很大的差別,之所以TCP協議要設計爲有狀態的服務也是爲了提高可靠傳輸服務,試想下如果TCP設計爲無狀態的服務,那麼應用程序無需進行連接就可以直接進行通信,那麼如果兩個應用層程序使用同一源地址向同一個目的地址發送報文,那麼目的地址收到報文後應該如何處理呢。

     通過上一節講解,我們可以歸納爲以下幾點。

TCP設計的目的

1)作爲網絡層和應用層橋樑,爲應用層解決直接使用網絡層的麻煩
2)充分利用網絡的帶寬,提高吞吐量

TCP設計的模型

1)提供可靠的傳輸服務
2)提供字節流傳輸服務
3)有狀態的服務

TCP協議詳解

     通過上面的描述,對TCP協議做了最精要的分析,瞭解TCP設計目的和模型,本節主要通過闡述介紹TCP協議的主要功能,當然這些功能都是圍繞着TCP協議目的而來的。

TCP首部字段講解


16位源端口、目的端口:用於區分進程的標識。
32位序號:用來標識TCP發送端發送的字節流。

32位確認序號:是接受端對收到的字節流確認的標識。

4位首部長度:單位是DWORD(4字節),最大長度60字節。類似IP協議的首部長度。
6個Bit標識:
URG: 標記是否是一個緊急指針。
ACK: 標識是否是TCP的確認報文。
PSH: 標識否立即推給應用層,目前SOCKET接口不支持設置該標記,完全由內核協議棧控制。
RST: TCP連接重置標記,連接被異常終止。
SYN: TCP發起建立連接的標記。
FIN:TCP發起終止連接的標記。
16位窗口大小:TCP滑動窗口的大小,單位字節。
16位校驗和:校驗TCP整個報文,類似UDP的校驗和。
16爲緊急指針:只有URG標識爲1時有效,值是一個正的偏移量,和序號相加爲字節流最後一個字節的標識。
選項:可選,包括MSS、Window Scale、SACK、時間戳等等。

TCP主要功能

    TCP的功能和細節之多,從定義它的RFC793以及系列的RFC可以看出,幾乎難以都羅列出來,因此我一分類的方式進行列舉,後續系列問題會對其中的分類進行更加詳細的分析。

1)TCP的狀態機

    TCP是一個有狀態的服務,它內部需要維護其狀態機,並且設計一個保活定時器。

2)滑動窗口

    TCP是一個全雙工的通訊管道,發送數據時需要考慮接受方的滑動窗口大小,避免對方無法接受數據,並且設計了一個堅持定時器。

3)重傳機制

    TCP依靠Ack分節響應對方發送的數據,如果沒有收到Ack響應可能意味着報文丟包,需要出發重傳機制,而且TCP的重傳機制不斷在進化和改變。並且設計了一個重傳定時器。

4)擁塞控制

    爲了最大化利用網絡的帶寬,又避免擁塞,TCP設計了一套擁塞控制機制。滑動窗口可以認爲是接受方控制的收到,而擁塞控制是發送方主動控制的手段。這裏講下我理解的歷史背景,早期在內存,CPU比較昂貴的條件下,滑動窗口表示接受方可接受數據的大小,還是一個比較小的數值,而今這個滑動窗口被定義爲較大值,因爲內存提升了很多倍,因此擁塞控制可能是更有效的控制手段,當然滑動窗口依然有效。


小結    

    TCP狀態機實現了一個有狀態的服務;利用Sequence Number和接受緩存區解決了包亂序問題;利用Ack Number和超時重傳機制解決丟包重傳問題;通過滑動窗口避免發送方無效發送數據;利用MTU發現機制更好的利用網絡帶寬,避免IP分片;利用擁塞控制最大化利用帶寬和避免擁塞導致更多的丟包;利用慢啓動和線性增加的方式初步試探網絡帶寬的峯值;利用線性增加/指數避讓的方式使丟包後立刻降低發送頻率,避免擁塞。

    而本章想以一個小篇幅來介紹TCP,希望讀者能夠了解TCP設計的主要問題,而避免過多的信息干擾對TCP協議的理解。而後續幾章會對TCP某一個功能進行詳細講解,希望能夠將TCP這個協議闡述清楚。
     

參考

《TCP/IP詳解-協議》卷一     W.Richard Stevens

修訂

初稿                                       2015-2-7               Simon




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