最近《計算機網路》這本書看到了傳輸層的 tcp 協議,因為tcp 的全部功能都體現在它的首部中,因此覺得有必要將這些知識梳理一下。
首先tcp 是面向位元組流的。這個流指的是流入到程序或從程序流出的位元組序列。面向位元組流的含義是:應用程式與 tcp 的互動是一次乙個資料塊(大小不等),但是 tcp 把應用程式交下來資料僅僅看成是一連串的無結構位元組流。而 tcp 不知道所傳送位元組流的含義。
一、tcp首部報文段格式
乙個 tcp 報文段分為首部和資料兩部分,只有弄清楚 tcp 首部中各字段的作用才能更好地掌握 tcp 的工作原理。
source port and destination port
(源埠與目的埠):各佔 2 個位元組,分別寫入源埠號與目的埠號。
sequence number
(序列號):佔 4 個位元組,範圍是[0, 232 - 1],序號增加到 232 - 1 後,下乙個序號就又回到 0。在 tcp 連線中傳送的位元組流中的每乙個位元組都要按順序編號,起始序號在連線建立時就完成設定。因此序列號可以用來解決網路包亂序(reordering)問題。
例如,乙個報文段的序號是 301,而攜帶的資料共有 100 個位元組。這就表明:本報文段的資料的第乙個位元組的序號是 301,最後乙個位元組的序號是 400。顯然下乙個報文段的資料序號要從 401 開始。
acknowledgement number
例如:b 收到了 a 傳送過來的乙個報文段,序號字段值為 501,而長度是 200 位元組(序號 501 - 700),這表明 b 正確地收到了 a 傳送的 200 個位元組的資料。於是 b 在傳送給 a 的確認報文段中把確認號設定為 701。若確認號等於 n,表明:到序號 n - 1 為止的所有資料都已經正確接收到。
offset
(資料偏移):佔 4 位,指出 tcp 報文段的資料起始處距離 tcp 報文段的起始處有多遠。這個字段實際上是指出 tcp 報文段的首部長度。
reserved
(保留):保留為今後使用,目前應置為 0。
tcp flags
:資料報的屬性,用於控制 tcp 的狀態機。下面介紹其中的一些屬性
window
(視窗):佔 2 個位元組,視窗值是乙個 [0, 216 - 1] 之間的整數。視窗指的是傳送本報文段的一方的接收視窗(而不是自己的傳送視窗)。視窗值用於告訴對方:從本報文段首部中的確認號算起,接受方目前允許對方傳送的資料量(以位元組為單位)。之所以要有這個限制,是因為接受方的資料空間是有限的。
例如:傳送了乙個報文段,其確認號是 701,視窗字段值為 1000。這就告訴對方:「從 701 序號開始算起,我(傳送此報文段的一方)的接收快取空間還可以接收 1000 個位元組資料,位元組序號是 701 - 1700,你在給我傳送資料時,必須要考慮到這一點」。視窗字段值明確的指出了現在允許對方傳送的資料量,視窗值通常是在不斷的動態變化著。
checksum
(校驗和):佔 2 個位元組,校驗和字段檢驗的範圍包括首部和資料兩部分。
urgent pointer
(緊急指標):佔 2 個位元組,緊急指標僅在urg = 1
時才有意義,它指出本報文段中的緊急資料的位元組數。因此,緊急指標指出了緊急資料的末尾在報文段中的位置。
tcp options
(選項):長度可變,最長可達 40 位元組。當沒有使用「選項時」,tcp 的首部長度是 20 位元組。
二、總結
上面有幾個頭部資訊非常重要:
參考資料:
《計算機網路》 謝希仁 著
tcp 的那些事兒 by 陳皓:
TCP報文段的首部格式
源埠 目的埠 序號確認號 資料偏移 保留urg ackpsh rstsyn fin視窗 校驗和緊急指標 選項 長度可變 填充tcp報文段首部的前20個位元組是固定,後面有4n位元組是根據需要而增加的選項,因此tcp首部最小長度20位元組。1.源埠和目的埠 各佔2個位元組,分別寫入源埠號和目的埠號。埠...
TCP報文段首部格式詳解
源埠 目標埠 計算機上的程序要和其他程序通訊是要通過計算機埠的,而乙個計算機埠某個時刻只能被乙個程序占用,所以通過指定源埠和目標埠,就可以知道是哪兩個程序需要通訊。源埠 目標埠是用16位表示的,可推算計算機的埠個數為2 16個。序列號 表示本報文段所傳送資料的第乙個位元組的編號。在tcp連線中所傳送...
tcp報文傳送工具 tcp報文段首部結構分析
tcp雖然是面向位元組流的,但tcp傳送的資料單元卻是報文段。tcp報文段如apr報文 ip資料報一樣,也是由首部與資料區域組成,tcp首部內容很豐富,各個欄位都有特定的含義,一般來說tcp首部只有20個位元組,tcp報文段首部的前20個位元組是固定的,後面有4n位元組是根據需要而增加的選項字段 n...