1. 程式人生 > >TCP,UDP的報頭詳解

TCP,UDP的報頭詳解

本部落格借鑑謝希仁第六版《計算機網路》的第九章

TCP報頭 

(1)源埠和目的埠

各佔2個位元組,分別寫入源埠號和目的埠號,TCP的分用功能是通過埠實現的。

(2)序號

佔4個位元組。序號範圍是[0,2^32-1],共2^32(即4282967296)個序號,序號增加到2^32-1後,下一個序號就回到0,也就是說序號使用mod 2^32運算。TCP是面向位元組流的。在一個TCP連線中傳輸的位元組流中的每一個位元組都是按順序編號。整個要傳送的位元組流的起始序號必須在連線建立時設定。首部中的序號欄位值則指的是本報文段所傳送的資料的第一個位元組的序號。例如,一報文段的序號欄位值是301,而攜帶的資料共有100位元組。這就說明:本報文段的資料的第一個位元組的序號是301,最後一個位元組的序號是400.顯然,下一個報文段(如果還有的話)的資料序號應當從401開始,即下一個報文段的序號欄位值應為401.這個欄位的名稱也叫做“報文段序號”。

(3)確認號

佔4個位元組,是期望收到對方下一個報文段的第一個資料位元組的序號。例如,B正確收到了A傳送過來的一個報文段,其序號欄位值是501,而資料長度是200位元組(序號501-700),這表明B正確收到了A傳送的到序號700為止的資料。因此,B期望收到A的下一個資料序號是701,於是B在傳送給A的確認報文段中確認號置為701。請注意,現在的確認號不是500,也不是700,而是701.

總之,應當記住:若確認號=N,則表明:到序號N-1為止的所有資料都已正確收到。

由於序號欄位有32位長,可對4GB(即4千兆位元組)的資料進行編號。在一般情況下,可保證當序號重複使用時。舊序號的資料早已通過網路到達終點了。

(5)資料偏移

佔4位,它指出TCP報文段的資料起始處距離TCP報文段的起始位置有多遠。這個欄位實際上是指出TCP報文段的首部長度。由於首部中還有長度不確定的選項欄位,因此資料偏移欄位是必要的。但請注意,“資料偏移”的單位長度是32位字(即以4位元組長的字位計算單位)。由於4位二進位制數能夠表達的最大十進位制數為15,因此資料偏移的最大值是60位元組,這也是TCP首部的最大長度(即選項長度不能超過40位元組)

(6)保留

佔6位,保留為今後使用,但目前應置為0。下面有6個控制位說明報文段的性質,它們的意義見下面的(7)-(12)。

(7)緊急URG(URGent)

當URG=1時,表明緊急指標欄位有效。它告訴系統此報文段中有緊急資料,應儘快傳送(相當於高優先順序的資料),而不是按原來的排隊順序來傳送。例如,已經發送了很長的一個程式要在遠地的主機上執行。但是後來發現了一些問題,需要取消該程式的執行。因此使用者從鍵盤發出中斷命令(Control+c)。如果不使用緊急資料,那麼這兩個字元才被交付到接受方的應用程序。這樣做就浪費了許多時間。

當URG置為1時,傳送應用程序就告訴傳送方的TCP有緊急資料要傳送。於是傳送方TCP就把緊急資料插入到本報文段資料的最前面,而在緊急資料後面的資料仍是普通資料,這是要與首部中緊急指標欄位配合使用。

(8)確認ACK(ACKnowledgment)   僅當ACK=1是確認號欄位才有效。當ACK=0時,確認號無效。TCP規定,在連線建立後所有傳送的報文段都必須把ACK置為1

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

雖然應用程式可以選擇推送操作,但推送操作還很少使用。

(10)復位RST(ReSeT)   當RST=1時,表明TCP連線中出現較為嚴重的差錯(如由於主機崩潰或其他原因),必須釋放連線,然後再重新建立運輸連線。RST置為1還用來拒絕一個非法的報文段或拒絕開啟一個連線。RST也可以稱為重建位或重置位。

(11)同步SYN(SYNchronization)    在連線建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連線報文請求段。對方若是同意建立連線,則應在響應的報文段中使用SYN=1和ACK=1。因此,SYN置為1就表示這是一個連線請求或連線接收報文。

(12)終止FIN(FINis,意思是“完”、“終”)   用來釋放一個連線。當FIN=1時,表明此報文段的傳送方的資料已傳送完畢,並要求釋放運輸連線。

(13)視窗

佔2個位元組。視窗值是[0,2^16-1]之間的整數。視窗指的是傳送本報文段的一方的接收視窗(而不是自己的傳送視窗)。視窗值告訴對方:從本報文段首部中的確定號算起,接收方目前允許對方傳送的資料量。之所以要有這個限制,是因為接收方的資料快取空間是有限的。總之,視窗值作為接收方讓傳送方設定為其傳送視窗的依據。

例如,設確認號是701,視窗欄位是1000。這就表明,從701號算起,傳送次報文段的一方還有接收1000個位元組資料(位元組序號是701-1700)的接收快取空間。

總之,應當記住,視窗欄位明確指出了現在允許對方傳送的資料量。視窗值是經常在動態變化著。

(14)校驗和

佔2個位元組。校驗和欄位檢驗的範圍包括首部和資料這兩個部分。和UDP使用者資料報一樣,在計算校驗和時,要在TCP報文段的前面加上12位元組的偽首部。偽首部的格式與UDP使用者資料報的偽首部一樣。但應把偽首部第4個欄位中的17改為6(TCP的協議號是6),把第5欄位中的UDP長度改為TCP長度。接收方收到此報文段後,仍要加上這個偽首部來計算校驗和。若使用IPv6,則相應的偽首部也要改變。

(15)緊急指標

佔2個位元組。緊急指標僅在URG=1時才有意義,它指出本報文段中的緊急資料的位元組數(緊急資料結束後就是普通資料)。因此緊急指標指出來緊急指標的末尾在報文段中的位置。當所有緊急資料都處理完時,TCP就告訴應用程式恢復到正常操作。值得注意的是,即使視窗為零時也可傳送緊急資料。

(16)選項

長度可變,最長可達49位元組。當沒有選項時,TCP的首部長度是20位元組。

UDP報頭

使用者資料報UDP有兩個欄位:資料欄位和首部欄位。首部欄位很簡單,只有8個位元組,有四個欄位組成,每個欄位的長度都是兩個位元組。各欄位意義如下:

(1)源埠      源埠號。在需要對方回信時選用。不需要時可全用0。

(2)目的埠       目的埠號。這在終點交付報文時必須要使用到。

(3)長度      UDP使用者資料報的長度,其最小值是8(僅有首部)。

(4)校驗和     校驗UDP使用者資料報在傳輸中是否有錯,有錯就丟棄。