計算機網路-5-5-TCP報文格式
TCP報文段的首部格式
TCP雖然是面向位元組流的,但TCP傳送的資料單元卻是報文段。一個TCP報文段分為首部和資料兩部分,而TCP的全部功能都體現在它在首部中各欄位的作用。下面討論TCP報文段的首部格式。
TCP報文首部前20位元組是固定的(如圖5-14),後面有4n位元組是根據需要而增加的選項。(TCP協議首部的最小長度為20位元組)
首部固定部分各欄位的意義如下:
-
源埠和目的埠 (各佔2位元組):分別寫入源埠號和目的埠號。TCP的分用功能也是通過埠來實現的。
-
序號(4位元組):序號的範圍是[\(0\),\(2^{32}-1\)],共2^32個序號,在一個TCP連線中傳送的位元組流的每一個位元組按照順序編號
-
確認號(4位元組):是期望收到對方的下一個報文段的第一個資料位元組的序號,例如:B正確的接收到了A傳送過來的一個報文段,其序列號欄位為501,而資料長度是200位元組(序號為501-700),這表明B正確的接收到了A傳送的到序號700為止的資料。因此,B希望收到A下一個資料序號為701的資料,於是B在傳送給A的確認報文中把確認號設定為701。總之就是要記住:確認號=N:到序號N-1為止的所有資料都已正常的收到了
-
資料偏移(4位):它指出的TCP報文段的資料部分的其實部分距離TCP報文段的起始位置,其實就是指出了TCP報文段首部的長度,(TCP報文首部最大的長度為60位元組)。
-
保留位(6位):保留為今後使用,目前是0。
-
下面是6個控制位(6位)
-
緊急URG(URGent):當URG=1,表示緊急指標欄位有效,它告訴系統此報文段中有緊急資料,應該儘快送達(相當於高優先順序的資料),不要按照原來的排隊順序來傳送,傳送方TCP就要把這個緊急報文段插入到本報文段資料的最前面而緊急資料後面的資料仍然是普通資料。這裡一般要配合首部中緊急指標欄位(urgent pointer)使用。
-
確認ACK(ACKnowledment)僅當ACK=1時候確認號欄位才有效,當ACK=0時候,確認號無效。TCP規定,在連線建立後,所有傳送的報文段都必須把ACK設定為1
-
推送PSH(PuSH)當兩個應用程序進行互動式通訊的時候,有時在一端的應用程序希望在鍵入一個命令後能夠立即接受到對方的響應。在這種情況下,TCP就可以使用推送操作。當傳送方把PSH設定為1,並立即建立一個報文段傳送出去,接收方TCP收到PSH=1的報文的時候,會把這個報文儘快的交付給應用程序。而並不是放到快取中。(推送操作很少使用)
-
復位RST(ReSet):當RST=1時候,表明TCP連線中出現了嚴重的差錯(例如由於主機崩潰或者其他原因),必須要釋放連線,然後重新建立運輸連線,RST=1還用來拒絕一個非法的報文段或者拒絕開啟一個連結。RST也稱之為重建位或者重置位。
-
同步SYN(SYNchronization):在建立一個用來同步序號,當SYN=1而ACK=0,表明這是一個連線請求報文段,對方若同意建立連線,則應該在相應的報文段中使得SYN=1和ACK=1。
-
終止FIN(FINis):用來釋放一個連線,當FIN=1時,表示此報文段的傳送方傳送的資料已經發送完畢,並要求釋放運輸層連線。
-
-
視窗(2位元組):視窗值為[\(0\),\(2^{16}-1\)],視窗指的是傳送本報文的一方的接收視窗。視窗值告訴對方:從本報文段的確認號開始,接收方目前只能接受對方的資料報文傳送量。設定這個視窗值的原因是接收方的資料接收快取是有限的。例如:傳送了一個報文段,其確認號為701,視窗欄位是1000。這就是告訴對方:“從701號算起,我(即傳送此報文段的一方)的接收快取空間還可以接受1000位元組的資料(位元組序號為701~1700),你在給我傳送資料的時候,必須考慮到這一點。”總之:視窗欄位明確指出了現在允許對方發動的資料量。視窗值經常在動態發生變化。
-
檢驗和(2位元組):檢驗和欄位檢驗的範圍包括首部和資料兩部分。和UDP一樣,在計算檢驗和時,要在TCP報文段的前面加上12位元組的偽首部,偽首部的格式和UDP偽首部的格式一樣。但應該要把偽首部的第四個欄位值改為6(TCP的協議號為6),第5欄位中UDP長度改為TCP長度。
-
緊急指標(2位元組):緊急指標僅僅在URG=1的時候才有意義,它指出本報文段的緊急資料的位元組數(緊急資料結束後就是普通資料),視窗期為0也是可以傳送緊急資料。
-
選項(可變,最長為40位元組)