初識TCP

1. TCP協議的概念

TCP是TCP/協議簇中最重要也是最複雜協議,它位於OSI七層協議模型的網絡層,它提供了一種全雙工的、面向連接的、可靠的字節流服務。TCP協議是兩臺主機進程進行通信的基石,TCP使用連接(connection)作爲最基本的抽象,同時將TCP連接的端點稱爲插口或者套接字(socket)。

  • 全雙工:通信兩端在任意時刻可以互相發送數據,既可以是客戶端也可以是服務端。
  • 面向連接:通信前需要先三次握手建立連接,通信後四次揮手釋放連接。
  • 可靠的:通過序號解決報文亂序/丟失、超時重傳、擁塞控制、滑動窗口、檢驗和。
  • 字節流:沒有固定的報文邊界。

1.1 socket

socket
socket

如上圖所示,客戶端ip+port和服務端ip+port的四元組,組成一個socket可以唯一標識一個連接,所以理論上來說服務器的一個端口就能連接成千上萬的連接。

2. TCP首部格式

TCP的首部包含了20字節的固定部分和長度可變的選項部分,如下圖所示:

TCP首部
TCP首部
  • 端口號:每個TCP段都包含各佔兩個字節的源端和目的端的端口號,用於尋找發端和收端應用進程。這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個TCP連接。

  • 序號:TCP協議在數據傳輸的過程中是基於字節流的並且在傳輸給傳輸層的時候會將字節流進行分段,序號用來表示這個報文段的第一個字節(報文段的第一個字節號就是序號)。這個序號是由特定的算法生成的隨着時間逐漸遞增的數字,最大值是2^32-1。這樣設計序號主要有三個原因:

    1. 標識兩個主機間前後傳輸報文段的關係。
    2. 防止由於網絡延遲有的分組被重發後,而導致某一方連接做出錯誤的解釋。
    3. 防止黑客TCP劫持。
  • 確認號:是期望收到下個報文段數據的第一個字節號。

  • 指出首部長度共有多少4個字節,TCP首部長度可以在20-60個字節之間。

  • 標誌位:

    • URG:緊急bit,當URG=1時,代表該報文段有緊急數據應該儘快傳輸(優先級高)。
    • ACK:當ACK=1時代表確認號有效,否則無效。
    • PUS:當PUS=1時代表該報文段應當儘快傳輸給接收應用進程,而不用等待緩存填滿。
    • RST:當RST=1時代表TCP連接出現了嚴重差錯,必須釋放連接然後重新建立。
    • SYN:當SYN=1時代表這是一個請求連接或者連接接受報文。
    • FIN:當FIN=1時代表報文段的發送端已經發送完數據,並要求釋放連接。
  • 窗口:窗口字段用來控制發送方的的發送數據量,接收方根據設置的緩存確定自己接收窗口的大小,然後通知對方以確定對方發送窗口的上限。

  • 校驗和:檢驗部分包括TCP首部和報文段部分,要加上12字節的僞首部。

  • 緊急指針:指出本報文段中緊急數據的最後一個字節的序號,並且URG標誌位置爲1。

  • 選項:TCP只規定了一種選項,即最大報文段長度MSS(max segment size),MSS會通知發送方我所能接收的報文段的數據字段的最大長度是MSS個字節。

3.題外話

在這裏推薦下林沛滿先生的兩本書《WireShark網絡分析就這麼簡單》和《WireShark網絡分析的藝術》,林先生用幽默風趣的語言講述了複雜的網絡知識,書中都是林先生的實戰經驗,可以讓我們收穫到很多實戰技巧。而且林先生也在書中分享他在工作中的方法論,讀了之後讓我收益匪淺,我把其中的一段話分享給了女朋友,也在這裏分享給大家,希望大家能有所收穫。

有些道理聽上去很簡單,然而當你着手準備面試材料的時候,可能會發現沒什麼拿得出手的。這又是什麼原因呢?不是因爲你平時碌碌無爲,而更可能是因爲沒有總結的習慣,時間一長都忘了。這就是堅持寫技術博客的價值之一,能用自己的語言表達出來纔算真正理解並且記住了。寫作能強迫思考,對於真正有技術含量的東西,你會在寫作過程中加深理解,從此就忘不掉了;而技術含量不高的東西,你寫個開頭自然會停筆,從此忘掉也無所謂。不僅技術上如此,其他學科也一樣,年輕的時候閱讀國學經典,每篇都讓人覺得頓悟了人生。但如果試着把感受寫成文章,就會發現所謂的頓悟只是一碗心靈雞湯。 ——摘自《WireShark網絡分析就這麼簡單》

關注作者公衆號:

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