《圖解TCP/IP》 6.7 TCP的首部格式
TCP中沒有表示包長度和數據長度的字段。可由IP層獲知TCP的包長由TCP的包長可知數據的長度。
源端口號:表示發送端端口號,字段長16位。
目標端口號:表示接收端端口號,字段長度16位。
序列號:字段長32位。序列號是指發送數據的位置。每發送一次數據,就累加一次該數據字節數的大小。序列號不會從0或1開始,而是在建立連接時由計算機生成的隨機數作為其初始值,通過SYN包傳給接收端主機。然后再將每轉發過去的字節數累加到初始值上表示數據的位置。此外,在建立連接和斷開連接的時發送的SYN包和FIN包雖然並不攜帶數據,但是也會作為一個字節增加對應的序列號。
確認應答號:確認應答號字段長度為32位。是指下一次應該收到的數據的序列號。實際上,它是指已收到確認應答號減一為止的數據。發送端接收到這個確認應答號以后可以認為在這個序列號以前的數據都已經被正常接收。
數據偏移:該字段表示TCP所傳輸的數據部分應該從TCP包的哪個位開始,當然也可以把它看做TCP首部的長度。該字段長4位,單位為4字節(32位)。
保留:該字段主要是為了以后擴展時使用,其長度為4位,一般設置為0,但即使收到的包在該字段不為0,此包也不會被丟棄。
控制位:字段長為8位,每一個從左到至右分別為CWR,ECE,URG,ACK,PSH、RST、SYN、FIN。這些控制標志也叫作控制位。當它們對應位上的值為1時,具體含義如
CWR(Congestion Window Reduced):CWR標志與后面的ECE標志用於IP首部的ECN字段。ECE標志為1時,則通知對方將擁塞窗口變小。
ECE(ECN-Echo):ECE標志表示ECN-Echo。置為1會通知通信對方,從對方到這邊的網絡有擁塞。在收到數據包的IP首部中ECN為1時將TCP首部中的ECE設置為1。
URG(Urgent Flag):該為為1時,表示包中有需要緊急處理的數據。對於需要緊急處理的數據,會在后面的緊急指針中再進行解釋。
ACK(Acknowledge Flag):該位為1時,確認應答的字段變為有效。TCP規則除了最初建立時的SYN包之外該為必須設置為1。
PSH(Push Flag):該位為1時,表示需要將受到的數據立即傳輸給上層的應用。PSH為0時,則不需要立即上層而是先進行緩存。
RST(Reset Flag):該位為1時表示TCP連接中出現異常必須強制斷開連接。例如,一個沒有被使用的端口即使發來連接請求,也無法通行。此時就可以返回一個RST設置為1的包。此外,程序宕掉或切斷電源等原因導致主機重啟的情況下,由於所有的連接信息將全部被初始化,所以原有的TCP通行也將不能繼續進行。這種情況下,如果通信對方發送一個設置為1的RST包,就會使用心強制斷開連接。
SYN(Synchronize Flag):用於建立連接。SYN為1表示希望建立連接,並在其序列號的字段進行序列號初始值的設定。
FIN(Finish Flag):該位為1時,表示今后不會再有數據發送,希望斷開連接。當通信結束希望斷開連接時,通信雙方的主機之間就可以相互交換FIN位置為1的TCP段。每個主機又對對方的FIN包進行確認應答以后就可以斷開連接。不過,主機收到FIN設置為1的TCP端以后不必馬上回復一個FIN包,而是可以等到緩沖區中所有數據都已成功發送而被自動刪除之后再發。
窗口大小:該字段為16位,用於通知從相同TCP首部的確認應答號所指位置開始能夠接收的數據大小(8位字節)。TCP不允許發送超過此處所示大小的數據。不過,如果窗口為0,則表示可以發送窗口探測,以了解最新的窗口大小。但這個數據必須是1個字節。
校驗和:TCP的校驗和與UDP相似,卻別在於TCP的校驗和無法關閉。TCP和UDP一樣在計算校驗和的時候使用TCP偽首部。這個偽首部如圖:
為了讓其全長為16位的整數倍,需要在數據部分的最后填充0。首先將TCP校驗和字段設置為0.然后以16位為單位進行1的補碼和計算,再將它們的總和的1的補碼和放入校驗和字段。接收端在收到TCP數據段以后,從IP首部獲取IP地址信息構造TCP偽首部,再進行校驗和計算。由於校驗和字段里保存着除本字段以外其他部分的和的補碼值,因此如果計算校驗和字段在內的所有數據的16位和以后,得出的結果是“16位全部為1 ”,說明收到的數據是正確的。
緊急指針:該字段長為16位。只有在URG控制位為1時有效。該字段的數值表示本報文中國緊急數據的指針。正確來講,從數據部分的首位到緊急指針所指示的位置為止為緊急數據。因此也可以說緊急指針指出了緊急數據的末尾在報文段中的位置。如何處理緊急數據屬於應用的問題。一般在暫時中斷通信,或中斷通信的情況下使用。例如在Web瀏覽器中點擊停止按鈕,或者使用TELNET輸入Ctrl+C時都會有URG為1的包。此外,緊急指針也用左表示數據流分段的標志。
選項:選項字段用於提高TCP的傳輸性能。因為根據數據偏移(首部長度)進行控制,所以其長度最大為40字節。另外,選項字段盡量調整其為32位的整數倍。具有代表性的選項部分:
類型2的MSS選項用於在建立連接時決定最大段長度的情況。這選項用於大部分操作系統。
類型3的窗口擴大,是一個用來改善TCP吞吐量的選項。TCP首部中窗口字段只有16位。因此在TCP包的往返時間(RTT)內,只能發送最大64K字節的數據。如果采用了該選項,窗口的最大值可以擴展到1G字節。因此,即使在一個RTT較長的網絡環境中,也能達到較高的吞吐量。