深入TCP(一) TCP報文段首部分析

2021-08-04 02:11:37 字數 4172 閱讀 8723

tcp是網路中的重點中的重點,網路也叫做ip/tcp協議,因此也能看出tcp的重要性。因此我便想按照三部分來敘述tcp的相關知識。

一、tcp報文格式

tcp協議主要分為兩部分

(1)分段頭:tcp為了實現端到端可靠傳輸所加上的控制資訊

(2)資料:指由高層即應用層而來的資料。

二、tcp報文格式分析

2.1首部字段

源和目的埠:佔16位元。用於多路復用/多路分解來自或送至上層應用的資料,埠用來標識同一臺計算機的不同程序。

序列號和確認號:佔32位元,這兩個欄位是tcp可靠傳輸服務的關鍵部分,序列號是該報文段首位元組的位元組流編號(tcp把資料看成是有序的位元組流,tcp隱式地對資料流的每個位元組進行編號)。這樣理解可能更直觀,當報文被分解成多個報文段時,序列號就是報文段首位元組在整個報文的偏移量。確定號指定下乙個期待的位元組。tcp是全雙工的,假設從主機a接收到主機b的資料,則主機a填充進報文段的確認號是主機a期望從主機b收到的下乙個位元組序號。還沒理清這兩者的關係?見深入tcp(3)---三次握手四次揮手:

報頭長度(4位):以32位字長為單位。因為選項是不定長的,這就需要標識整個首部欄位的長度(單位是32位字),即5+選項個數。4位,單位是32位字,所以首部最長是15*4=60位元組,即選項最長是40位元組(10個選項)。

保留:佔6位元,為將來的應用而保留,目前置為"0"。

編碼位(syn、fin、ack、urg、psh、rst)

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資料段都有序列號,從而保證了這兩種資料段以正確順序被處理。

視窗大小:佔32位元。用於流控制(確保連線的任何一方都不會過快地傳送過量的分組而淹沒另一方),視窗大小指定了從被確認的位元組算起可以傳送多少個位元組。

校驗和:佔32位元。提供了額外可靠性,在計算檢驗和的時候,tcp的checksum域設為0,如果資料域的位元組數為奇數,則資料域填補乙個額外的0位元組。校驗和演算法:將所有的16位字按1的補碼形式累加起來,取累加結果的補碼。因此,當接收方執行同樣計算時(包括checksum域),結果應該是0。

緊急指標:佔16位元,

參考標誌欄位的urg位。

選項:選項部分是為了適合複雜網路環境和更好地服務於應用層設計的。tcp選項最長是40位元組。詳情見2.2。

資料:無任何資料的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隔離(下面的例項將看到這一點)。

urg:緊急標誌位。

當urg=1時,表明報文段中含有緊急資料,需要優先處理,之後在處理普通資料。緊急指標是乙個正的偏移量,和序號欄位中的值相加表示緊急資料最後乙個位元組的序號。

psh:催促標誌位。

當psh=1時,tcp會立即建立乙個報文並傳送,接收端收到psh=1的報文後,立即將接收緩衝區內資料向上交付給應用程式,而不是等待緩衝區滿了之後再交付。

psh標誌是為了提示接收端的應用程式應該立即從tcp的接收緩衝區中拿走資料,為接收後續的資料騰出空間。

urg與psh的區別:

兩者都可理解為處理緊急資料的標誌位,只是處理方法不同。urg的緊急資料僅在報文內,而psh的緊急資料還在接收緩衝區內。

傳送方urg有效的時候,傳送的資料不用進入緩衝區而直接交付給上一層;

傳送方psh有效的時候,接收方收到後,傳送的資料要進入緩衝區但不用等緩衝區滿就交給上一層

TCP首部報文段格式

最近 計算機網路 這本書看到了傳輸層的 tcp 協議,因為tcp 的全部功能都體現在它的首部中,因此覺得有必要將這些知識梳理一下。首先tcp 是面向位元組流的。這個流指的是流入到程序或從程序流出的位元組序列。面向位元組流的含義是 應用程式與 tcp 的互動是一次乙個資料塊 大小不等 但是 tcp 把...

TCP報文段的首部格式

源埠 目的埠 序號確認號 資料偏移 保留urg ackpsh rstsyn fin視窗 校驗和緊急指標 選項 長度可變 填充tcp報文段首部的前20個位元組是固定,後面有4n位元組是根據需要而增加的選項,因此tcp首部最小長度20位元組。1.源埠和目的埠 各佔2個位元組,分別寫入源埠號和目的埠號。埠...

TCP報文段首部格式詳解

源埠 目標埠 計算機上的程序要和其他程序通訊是要通過計算機埠的,而乙個計算機埠某個時刻只能被乙個程序占用,所以通過指定源埠和目標埠,就可以知道是哪兩個程序需要通訊。源埠 目標埠是用16位表示的,可推算計算機的埠個數為2 16個。序列號 表示本報文段所傳送資料的第乙個位元組的編號。在tcp連線中所傳送...