《圖解TCP/IP》 6.7 TCP的首部格式瀏覽器
TCP中沒有表示包長度和數據長度的字段。可由IP層獲知TCP的包長由TCP的包長可知數據的長度。緩存
源端口號:表示發送端端口號,字段長16位。網絡
目標端口號:表示接收端端口號,字段長度16位。性能
序列號:字段長32位。序列號是指發送數據的位置。每發送一次數據,就累加一次該數據字節數的大小。序列號不會從0或1開始,而是在創建鏈接時由計算機生成的隨機數做爲其初始值,經過SYN包傳給接收端主機。而後再將每轉發過去的字節數累加到初始值上表示數據的位置。此外,在創建鏈接和斷開鏈接的時發送的SYN包和FIN包雖然並不攜帶數據,可是也會做爲一個字節增長對應的序列號。spa
確認應答號:確認應答號字段長度爲32位。是指下一次應該收到的數據的序列號。實際上,它是指已收到確認應答號減一爲止的數據。發送端接收到這個確認應答號之後能夠認爲在這個序列號之前的數據都已經被正常接收。操作系統
數據偏移:該字段表示TCP所傳輸的數據部分應該從TCP包的哪一個位開始,固然也能夠把它看作TCP首部的長度。該字段長4位,單位爲4字節(32位)。指針
保留:該字段主要是爲了之後擴展時使用,其長度爲4位,通常設置爲0,但即便收到的包在該字段不爲0,此包也不會被丟棄。blog
控制位:字段長爲8位,每個從左到至右分別爲CWR,ECE,URG,ACK,PSH、RST、SYN、FIN。這些控制標誌也叫做控制位。當它們對應位上的值爲1時,具體含義如io
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較長的網絡環境中,也能達到較高的吞吐量。