TCP首部报文段格式
最近《計算機網絡》這本書看到了傳輸層的 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(確認號):占 4 個字節,表示期望收到對方下一個報文段的第一個數據字節的序號。可以用來解決不丟包的問題。
例如: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 的狀態機。下面介紹其中的一些屬性
- URG(緊急):當 URG=1 時,表明緊急指針字段有效,代表該報文段中有緊急數據,應盡快傳送(相當于高優先級的數據)。于是發送方就把緊急數據插在本報文段數據的最前面,通常與 Urgent Pointer 一起配合使用。
- ACK(確認):只有當 ACK=1 時確認號字段才有效,代表這個封包為確認封包。當 ACK=0 時,確認號無效。TCP 規定,在連接建立后所有傳送的報文段都必須把這個字段的值置為 1。
- RST(復位):當RST=1時,表明TCP連接中出現嚴重差錯(如由于主機崩潰或其他原因),必須釋放連接,然后再重新建立運輸連接。
Window(窗口):占 2 個字節,窗口值是一個 [0, 216 - 1] 之間的整數。窗口指的是發送本報文段的一方的接收窗口(而不是自己的發送窗口)。窗口值用于告訴對方:從本報文段首部中的確認號算起,接受方目前允許對方發送的數據量(以字節為單位)。之所以要有這個限制,是因為接受方的數據空間是有限的。
例如:發送了一個報文段,其確認號是 701,窗口字段值為 1000。這就告訴對方:“從 701 序號開始算起,我(發送此報文段的一方)的接收緩存空間還可以接收 1000 個字節數據,字節序號是 701 - 1700,你在給我發送數據時,必須要考慮到這一點”。窗口字段值明確的指出了現在允許對方發送的數據量,窗口值通常是在不斷的動態變化著。
Checksum(校驗和):占 2 個字節,校驗和字段檢驗的范圍包括首部和數據兩部分。
Urgent Pointer(緊急指針):占 2 個字節,緊急指針僅在 URG = 1時才有意義,它指出本報文段中的緊急數據的字節數。因此,緊急指針指出了緊急數據的末尾在報文段中的位置。
TCP Options(選項):長度可變,最長可達 40 字節。當沒有使用“選項時”,TCP 的首部長度是 20 字節。
二、總結
上面有幾個頭部信息非常重要:
- Sequence Number 是包的序號,用來解決網絡包亂序(reordering)問題
- Acknowledgement Number 就是 ACK——用于確認收到,用來解決不丟包的問題
- Window 又叫 Advertised-Window,也就是著名的滑動窗口(Sliding Window),用于解決流控的問題
參考資料:
《計算機網絡》 謝希仁 著
TCP 的那些事兒 By 陳皓:https://coolshell.cn/articles/11564.html
總結
以上是生活随笔為你收集整理的TCP首部报文段格式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哈啰车可以骑到金凤区嘛?
- 下一篇: Python入门:操作文件