天天看點

流重組講解四部曲(三)- TCP協定格式熟悉1、TCP封包格式2、TCP選項3、TCP滑動視窗

1、TCP封包格式

流重組講解四部曲(三)- TCP協定格式熟悉1、TCP封包格式2、TCP選項3、TCP滑動視窗

圖 1.1

  圖1.1所示的為TCP封包格式,它的标準長度是20位元組,除非出現選項。确認号、視窗大小以及ECE位和ACK位用于與該封包段的發送方關聯的相反方向上的資料流。

  序列号字段辨別了TCP發送端到TCP接收端的資料流的一個位元組,該位元組代表着包含該序列号的封包段的資料中的第一個位元組。

  确認号字段包含的值是該确認号的發送方期待接收的下一個序列号。即最後被成功接收的資料位元組的序列号加1。這個字段隻有在ACK位字段被啟用的情況下才有效,這個ACK位字段通常用于除了初始和末尾封包段之外的所有封包段。

  資料偏移(頭部長度)字段占用4個比特位,以8位元組為機關,最多能表示的TCP頭部和選項總長度為60個位元組,用來辨別資料的起始位置。

  URG—緊急(緊急指針字段有效—很少被使用);

  ACK—确認(确認号字段有效—連接配接建立以後一般都是啟用狀态);

  PSH—推送(接收方應盡快給應用程式傳送這個資料—沒被可靠地實作或用到);

  RST—重置連接配接(連接配接取消,經常是因為錯誤);

  SYN—用于初始化一個連接配接的同步序列号;

  FIN—該封包段的發送方已經結束向對方發送資料;

  SYN位字段會消耗一個序列号,消耗一個序列号也意味着使用重傳進行可靠傳輸。是以,SYN和應用程式位元組(還有FIN)是被可靠傳輸的,不消耗序列号的ACK則不是。

  TCP的流量控制由每個端點使用視窗字段來通告一個視窗大小來完成。這個視窗大小是位元組數,從ACK号指定的,也是接收方想要接收的那個位元組開始。16位字段限制了視窗大小到65535位元組,進而限制了TCP的吞吐量。在TCP選項中可以看到視窗縮放選項可允許對這個值進行縮放,給高速和大延遲網絡提供了更大的視窗和改進性能。

  TCP校驗和字段覆寫了TCP的頭部和資料以及頭部中的一些字段。這個字段是強制的,由發送方進行計算和儲存,然後由接收方驗證,TCP校驗和的計算算法與IP、ICMP和UDP校驗和一樣。

  緊急指針字段隻有在URG位字段被設定時才有效。這個“指針”是一個必須要加到封包段的序列号字段上的正偏移,以産生緊急資料的最後一個位元組的序列号。TCP緊急機制是一種讓發送方給另一端提供特殊标志資料的方法。

2、TCP選項

流重組講解四部曲(三)- TCP協定格式熟悉1、TCP封包格式2、TCP選項3、TCP滑動視窗

圖 2.1

  圖2.1所示的為TCP選項數值,每一個選項的頭一個位元組為“種類”,指明了該選項的類型。種類值為0或1的選項僅占用一個位元組。最常見的選項字段就是MSS,連接配接的每個端點一般在它發送的SYN封包段上指定該選項。與MSS一樣,視窗縮放因子選項也隻能出現于SYN封包段中,是以當連接配接建立以後比例因子是與方向綁定的,每個方向的比例因子可各不相同,如果主動打開連接配接的一方發送了一個非0的比例因子但卻沒有接收到來自對方的視窗縮放選項,它會将自己發送與接收的比例因子數值都設定為0。

流重組講解四部曲(三)- TCP協定格式熟悉1、TCP封包格式2、TCP選項3、TCP滑動視窗

圖 2.2

  以圖2.2為例,為視窗縮放因子選項,該選項占用三個位元組:種類1位元組、長度1位元組、縮放比例1位元組,縮放因子最大值為14,能提供視窗的最大值為:65535 * 2^14,該數值約為1GB。是以,TCP使用一個32位的值來維護這個“真實”的視窗大小。

  選擇确認選項允許TCP單獨确認非連續片段;SACK選項隻是針對失序的封包段,存在于ACK封包段中,包含一系列的非連續的沒有确認的資料的seq range,可以幫助發送方進行有效的重傳。

  時間戳選項要求發送方在每一個封包段中添加2個4位元組的時間戳數值。當使用時間戳選項時,發送方将一個32位的數值填充到時間戳數值字段作為時間戳選項的第一部分;而接收方則将收到的時間戳數值原封不動地填充至第二部分的時間戳回顯重試字段。時間戳是一個單調增加的數值,使用該選項可以有效防止回繞序列号。

3、TCP滑動視窗

  TCP是一種帶累積正向确認的滑動視窗協定。

  每個TCP頭部的視窗大小字段表明接收端可用緩存空間的大小,以位元組為機關。封包段發送方在相反方向上可接受的最大序列号值為TCP頭部中ACK号和視窗大小字段之和。

  TCP連接配接的每一端都可收發資料。每個TCP活動連接配接的兩端都維護一個發送視窗結構和接收視窗結構。

流重組講解四部曲(三)- TCP協定格式熟悉1、TCP封包格式2、TCP選項3、TCP滑動視窗

圖 3.1

  圖3.1為TCP發送視窗結構,由接收端通告的視窗稱為提供視窗,提供視窗的大小是由接收端傳回的ACK中的視窗大小字段控制。每個TCP封包段都包含ACK号和視窗通告資訊,TCP發送端可以據此調節視窗結構。

  視窗左邊界不能左移,因為它控制的是已确認的ACK号,具有累積性,不能傳回。當得到的ACK号增大而視窗大小保持不變時(通常如此),我們就說視窗向前“滑動”。若随着ACK号增大而視窗卻減小,則左右邊界距離減小。當左右邊界相等時,稱之為零視窗。此時發送端不能再發送新資料。

流重組講解四部曲(三)- TCP協定格式熟悉1、TCP封包格式2、TCP選項3、TCP滑動視窗

圖 3.2

  圖3.2為TCP接收視窗結構,與發送視窗一樣,該視窗結構也包含一個左邊界和右邊界,但視窗内的位元組(圖中的4—9位元組)并沒有區分。接收視窗結構可以幫助了解下次應接收的資料序列号,若接收到的資料序列号在視窗内,則可以存儲,否則丢棄。

接收視窗左邊界:rcv->ack_seq  //接收方的确認号 即:接收方期待接收的發送方序列号!

接收視窗右邊界:rcv->ack_seq + rcv->window * rcv->wscale  //确認号+視窗大小*視窗縮放比例

對接收端來說,到達序列号小于左邊界,被認為是重複資料而丢棄;超過右邊界的則超過處理範圍,也被丢棄。

  注意到由于TCP的累積ACK結構,隻有當到達資料序列号等于左邊界時,視窗才能向前滑動。

繼續閱讀