歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux 網絡編程——TCP 和 UDP 數據報文式詳解

TCP 報文格式

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。

TCP 報文段的報頭有 10 個必需的字段和 1 個可選字段。報頭至少為 20 字節。報頭後面的數據是可選項。

1)源端口(16位)

標識發送報文的計算機端口或進程。一個 TCP 報文段必須包括源端口號,使目的主機知道應該向何處發送確認報文。

2)目的端口(16位)

標識接收報文的目的主機的端口或進程。

3) 序號(也叫序列號)(32位)

用於標識每個報文段,使目的主機可確認已收到指定報文段中的數據。當源主機用於多個報文段發送一個報文時,即使這些報文到達目的主機的順序不一樣,序列號也可以使目的主機按順序排列它們。

在 SYN 標志未置位時,該字段指示了用戶數據區中第一個字節的序號;在 SYN 標志置位時,該字段指示的是初始發送的序列號。

在建立連接時發送的第一個報文段中,雙方都提供一個初始序列號。TCP 標准推薦使用以 4ms 間隔遞增 1 的計數器值作為這個初始序列號的值。使用計數器可以防止連接關閉再重新連接時出現相同的序列號。

對於那些包含數據的報文段,報文段中第一個數據字節的數量就是初始序列號,其後數據字節按順序編號。如果源主機使用同樣的連接發送另一個報文段,那麼這個報文段的序列號等於前一個報文段的序列號與前一個報文段中數據字節的數量之和。例如,假設源主機發送 3 個報文段,每個報文段有 100 字節的數據,且第一個報文段的序列號是 1000,那麼第二個報文段的序列號就是 1100(1000 + 100),第三個報文段的序列號就是 1200(1100 + 100)。

如果序列號增大至最大值將復位為 0。

4)確認號(32位)

目的主機返回確認號,使源主機知道某個或幾個報文段已被接收。如果 ACK 控制位被設置為 1,則該字段有效。確認號等於順序接收到的最後一個報文段的序號加 1,這也是目的主機希望下次接收的報文段的序號值。返回確認號後,計算機認為已接收到小於該確認號的所有數據。

例如,序列號等於前一個報文段的序列號與前一個報文段中數據字節的數量之和。例如,假設源主機發送 3 個報文段,每個報文段有 100 字節的數據,且第一個報文段的序列號是 1000,那麼接收到第一個報文段後,目的主機返回含確認號1100 的報頭。接收到第二個報文段(其序號為 1100 )後,目的主機返回確認號 1200。接收到第三個報文段後,目的主機返回確認號 1300 。

目的主機不一定在每次接收到報文段後都返回確認號。在上面的例子中,目的主機可能等到所有 3 個報文段都收到後,再返回一個含確認號 1300 的報文段,表示已接收到全部 1200 字節的數據。但是如果目的主機再發回確認號之前等待時間過長,源主機會認為數據沒有到達目的主機,並自動重發。

上面的例子中,如果目的主機接收到了報文段號為 1000 的第一個報文段以及報文段號為 1200 的最後一個報文段,則可返回確認號 1100,但是再返回確認號 1300 之前,應該等待報文段號為 1100 的中間報文段。

5) 數據偏移(首部長度)(4位)

TCP 報文段的數據起始處距離 TCP 報文段的起始處有多遠,即首部長度。由於 TCP 報頭的長度隨 TCP 選項字段內容的不同而變化,因此報頭中包含一個指定報頭字段的字段。該字段以 32 比特為單位,所以報頭長度一定是 32 比特的整數倍,有時需要在報頭末尾補 0 。如果報頭沒有 TCP 選項字段,則報頭長度值為 5 ,表示報頭一個有 160 比特,即 20 字節。

6)保留位(6位)

由跟在數據偏移字段後的 6 位構成, 全部為 0 。

7)控制位(6位)

緊急 URG:此位置 1,表明緊急指針字段有效,它告訴系統此報文段中有緊急數據,應盡快傳送。

確認 ACK:僅當 ACK = 1 時確認號字段才有效,TCP 規定,在連接建立後所有傳達的報文段都必須把 ACK 置 1。

推送 PSH:當兩個應用進程進行交互式的通信時,有時在一端的應用進程希望在鍵入一個命令後立即就能夠收到對方的響應。在這種情況下,TCP 就可以使用推送(push)操作,這時,發送方 TCP 把 PSH 置 1 ,並立即創建一個報文段發送出去,接收方收到 PSH = 1 的報文段,就盡快地(即“推送”向前)交付給接收應用進程,而不再等到整個緩存都填滿後再向上交付。

復位 RST:用於復位相應的 TCP 連接

同步 SYN:僅在三次握手建立 TCP 連接時有效。當 SYN = 1 而 ACK = 0 時,表明這是一個連接請求報文段,對方若同意建立連接,則應在相應的報文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示這是一個連接請求或連接接受報文。

終止 FIN:用來釋放一個連接。當 FIN = 1 時,表明此報文段的發送方的數據已經發送完畢,並要求釋放運輸連接。

8)窗口(16位)

此字段用來進行流量控制,這個值是本機期望一次接收的字節數,即發送數據的窗口大小。告訴對方在不等待確認的情況下,可以發來多大的數據。這裡表示的最大長度是2^16 - 1 = 65535,如需要使用更大的窗口大小,需要使用選項中的窗口擴大因子選項。

指發送本報文段的一方的接收窗口(而不是自己的發送窗口)。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-04/116150p2.htm

Copyright © Linux教程網 All Rights Reserved