网络:传输层 TCP报文格式解析
一、TCP報文格式
1、為了提供可靠的數據傳輸,TCP報文首部字段有較多的字段,TCP報文格式如下圖:
圖2 TCP報文格式
16位源和目標端口(16位):用于多路復用/多路分解來自或送至上層應用的數據,可以這樣理解,端口用來標識同一臺計算機的不同進程。
16位源端口號(Source?Port):16位的源端口字段包含初始化通信的端口號。源端口和IP地址的作用是標識報文的返回地址。
16位目的端口(Destination?Port):16位的目的端口字段定義傳輸的目的。這個端口指明接收方計算機上的應用程序接口。
32位序列號和32位確認號
這兩個字段是TCP可靠傳輸服務的關鍵部分,序列號是該報文段首字節的字節流編號(TCP把數據看成是有序的字節流,TCP隱式地對數據流的每個字節進行編號)。這樣理解可能更直觀,當報文被分解成多個報文段時,序列號就是報文段首字節在整個報文的偏移量。確定號指定下一個期待的字節。
32位序列號(Sequence?Number):該字段用來標識TCP源端設備向目的端設備發送的字節流,它表示在這個報文段中的第幾個數據字節。序列號是一個32位的數。
32位確認號(Acknowledge?Number):TCP使用32位的確認號字段標識期望收到的下一個段的第一個字節,并聲明此前的所有數據已經正確無誤地收到,因此,確認號應該是上次已成功收到的數據字節序列號加1。收到確認號的源計算機會知道特定的段已經被收到。確認號的字段只在ACK標志被設置時才有效。
首部長度(4位)
因為選項是不定長的,這就需要標識整個首部字段的長度(單位是32位字),即5+選項個數。4位,單位是32位字,所以首部最長是15*4=60字節,即選項最長是40字節(10個選項)。
保留(6位):
6位值域,必須全0,為定義新的用途而保留。
6位標志
URG
指示報文段里存在著被發送方的上層實體標記為”緊急”數據,當URG=1時,其后的緊急指針指示緊急數據在當前數據段中的位置(相對于當前序列號的字節偏移量),TCP接收方必須通知上層實體。
ACK
當ACK=0時,表示該數據段不包含確認信息,當ACK=1時,表示該報文段包括一個對已被成功接收報文段的確認。
PSH
當PSH=1時,接收方在收到數據后立即將數據交給上層,而不是直到整個緩沖區滿。
RST
用于重置一個已經混亂的連接(如主崩潰),也可用于拒絕一個無效的數據段或者拒絕一個連接請求。一般而言,如果你得到的數據段被設置了RST位,那說明你這一端有問題了。
SYN
用于建立連接過程,在連接請求中,SYN=1和ACK=0表示該數據段沒有使用捎帶的確認域,而連接應答捎帶一個確認,即SYN=1和ACK=1。
注:捎帶是指對客戶機到服務器數據的確認被裝載在一個承載服務器到客戶機的數據報文段中。
FIN
用于釋放一個連接,表示發送方已經沒有數據要傳輸了。此時,接收方可能繼續接收數據,好在SYN和FIN數據段都有序列號,從而保證了這兩種數據段以正確順序被處理。
16位窗口大小
用于流控制(確保連接的任何一方都不會過快地發送過量的分組而淹沒另一方),窗口大小指定了從被確認的字節算起可以發送多少個字節。
16位校驗和
占2個字節,校驗的范圍包括首部和數據兩個部分,計算校驗和時需要在報文段前加上12字節的偽首部。
16位緊急指針
參考標志字段的URG位。
選項
選項部分是為了適合復雜網絡環境和更好地服務于應用層設計的。TCP選項最長是40字節(見下文)。
數據
無任何數據的TCP段也是合法的,通常用于確認和控制信息。
2 、選項字段[2]
TCP選項部分很好出現在已經建立連接的會話中,只要出現在TCP連接建立階段,即三次握手。TCP選項部分實際運用有以下幾種:
(1)最大報文傳輸段(MMS, Maximum Segment Size)
用于發送發與接收方協商最大報文段長度(僅僅是凈荷數據,不包括TCP首部字段)。TCP在三次握手中,每一方都會通告期望收到的MSS(MSS只出現在SYN數據包中),如果一方不接受另一方的MSS值,則使用默認的536字節凈荷數據,即主機能夠接受20+536字節的TCP報文段。
(2)窗口擴大選項(Window scaling)
TCP報文的窗口大小字段占16位,即最大值是65535,但隨著時延和帶寬比較大的通信產生(如衛星通信),需要更大的窗口滿足性能和吞吐率,這就是窗口擴大選項存在的意義。例子見參考資料[2]。
Windows scaling占3個字節,最后一個字節是移位值(Shift count),即首部的窗口位數16向左移動,如移位值為14,則新的窗口最大值增大到65535*(2^14)。
窗口擴大選項是在TCP建立之初進行協商,如果已實現了窗口擴大,當不再需要擴大窗口時,發送移位值=0就可以恢復到原窗口大小,即65535。
(3)選擇確認選項(SACK, Selective Acknowledgements)
考慮這樣情況,主機A發送報文段12345,主機B收到135且報文無差錯,SACK用來確保只重傳缺少的報文段,而不是重傳所有報文段。
SACK選項需要2個功能字節,一個用來指明使用SACK選項(SACK Permission),另一指明這個選項占多少字節。
那怎么形容丟失的報文段2,說明2的左右邊界分別是1、3。TCP的數據報文是有字塊邊界的,而這種邊界是由序列號表示的。
最多能指明多少個字節塊的邊界信息呢?答案是4個。這是因為選項字段最大是40字節,去除2個功能字節,序列號是32位即4字節,并且需要左右邊界,所以(40-2)/8 = 4。
(4)時間戳選項(timestamps)
時間戳選項用來計算往返時間RTT,發送方在發送報文段時把當前時鐘的時間值放入時間戳字段,接收方將該時間戳字段的值復制到確認報文中,當接收方收到確認報文,對比確認報文的時間戳(等于發送方發送報文段的時間戳)和現在的時鐘,即可算出RTT。
時間戳選項還可用于防止回繞序號PAWS。序列號只有32位,每2^32個序列號就會回繞(想想環形隊列),采用時間戳選項很容易區分相同序列號的報文段。
(5)NOP(NO-Operation)
TCP的頭部必須是4字節的倍數,而大多數選項不是4字節倍數,不足的用NOP填充。除此之外,NOP也用于分割不同的選項數據,如窗口擴大選項和SACK之間使用NOP隔離(下面的實例將看到這一點)。
3、URG(緊急標志)和PSH(推標志)
URG:
指示報文段里存在著被發送方的上層實體標記為”緊急”數據,當URG=1時,
系統此報文段中有緊急數據,應盡快傳送,而不要按原來的排隊順序來傳送,
其后的緊急指針指示緊急數據在當前數據段中的位置(相對于當前序列號的字節偏移量,數據從第一個字節到指針所指的字節就是緊急數據),緊急數據不進入
接收緩沖區直接交給上層進程,TCP接收方必須通知上層實體。
PSH:
發送方TCP把PSH置1,并立即創建一個報文端發送出去。接收方TCP收到PSH=1的報文段,接收方在收到數據后立即將數據交給上層,而不是直到整個緩沖區滿。
總結
以上是生活随笔為你收集整理的网络:传输层 TCP报文格式解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: freemarker 数组转字符串_fr
- 下一篇: keil4如何设置自动缩进_在Keil中