16位源端端口號 | 16位目的端端口號 | |||
---|---|---|---|---|
32位序號 | ||||
32位確認碼 | ||||
4位頭部長度 | 6位保留 | 6位標誌 | 16位窗口大小 | |
16位校驗和 | 16位緊急指針 | |||
選 項(最多40字節) |
a. 16位源端端口值和目的端端口號,數據來源的程序的端口號。由於傳輸層是端對端的協議,因此從TCP頭部能夠看出,只有源端端口號和目的端端口號。在TCP中,客戶端通常使用系統動態分配的端口號,每一個系統的動態端口號區間並不相同。服務器通常使用知名端口,如web服務器使用80端口。web
b. 32位序號,TCP中用惟一的序號標識每個字節流。初始值由雙方的系統給出一個隨機值ISN,以後的每個字節加一。在三次握手中,雖然syn同步數據報數據長度爲0,可是它佔一個單獨序號,這是特殊的。 緩存
c. 32位確認碼,用以確認以及回覆對方TCP數據段是否到達。它的值是它要確認的數據段的序號加1,每一個TCP報文不但帶着本身的序號,還帶着對以前數據的確認號。這是TCP數據報可靠的緣由之一,應答確認機制。服務器
d. 4位頭部長度,和IP4位頭部長度類似,因此頭部最長爲60字節(15 * 4)。網絡
e. 6位標誌位:tcp
(1) URG標誌:表示緊急指針是否有效。(2) ACK標誌:表示確認碼是否有效。咱們稱攜帶確認碼的報文段爲確認報文段。指針
(3) PSH標誌:提示接收端應用程序應該當即從接收緩存區取走數據,以便以後的數據能夠存放。(若是應用程序沒有取走數據,數據會一直呆在TCP接收緩存區)。ip
(4) RST標誌:標誌要求對方從新創建鏈接。攜帶RST標誌的報文段稱爲復位報文段。同步
(5) SYN標誌:表示請求創建一個鏈接。攜帶SYN標誌的報文段爲同步報文段。web服務器
(6) FIN標誌:表示通知對方本端要斷開鏈接了。攜帶FIN的報文段爲結束報文段。table
f. 16位窗口大小,是TCP進行流量控制的手段。這裏的窗口指的是接收通告窗口,就是告訴對方本身的接收緩存區還能接受多少數據。對方就能夠控制發送數據的速度。
g. 16位校驗和,由發送端填充。接收端用來檢驗TCP報文段在傳輸過程當中是否有錯誤。這個校驗和包括檢驗數據部分,這是TCP可靠的一個重要緣由。IP在用校驗和檢驗的時候只檢查頭部信息。
h. 16緊急指針,用以發送端向接收端發送緊急數據。是一個正的偏移值,當前序號加上這個偏移值,就是下一個數據段的序號。
i. TCP頭部選項:
kind(1字節) | length(1字節) | info | |
---|---|---|---|
kind = 0 | |||
kind = 1 | |||
kind = 2 | length = 4 | 最大segment長度(2字節) | |
kind = 3 | length = 3 | 移位數(1字節) | |
kind = 4 | length = 2 | ||
kind = 5 | length = N*8 + 2 | N個邊沿塊 | |
kind = 8 |
kind = 0 : 選項表結束選項。kind = 1 : 空操做選項,沒有特殊含義。通常用來將TCP選項的總長度添加爲4字節的倍數。
kind = 2 : 最大報文段長度選項。在創建鏈接的時候,鏈接雙方都會發送最大的報文段長度來協商。TCP模塊一般會把MSS(max segment size)設置爲MTU-40(減去TCP頭部長度20字節和IP頭部長度20字節,不考慮選項長度),這樣發送的最大的報文段長度就不會超過MTU,避免IP分片。對以太網而言,MSS是1500-40,也就是1460字節。
kind = 3 : 窗口擴大因子選項。在創建連接的時候,通訊雙方會根據此選項來協商窗口擴大因子的大小。在TCP頭部中窗口大小是用16位來表示的,因此最大是65535。可是在實際的傳輸過程當中窗口的大小遠不止這麼大,由於須要網絡有更大的吞吐量,因此須要用到窗口擴大因子。擴大方式是每次把初始窗口值向左移擴大因子值個位。通常擴大銀子選項是0~14,咱們能夠修改/proc/sys/net/ipv4/tcp_window_scaling的內核變量來啓用或者停用窗口擴大因子選項。和最大報文段選項同樣,只能出如今同步報文段,不然將被忽略。
kind = 4 : 選擇性確認選項。在TCP通訊時,若是某個報文段丟失,那麼TCP會從新發送這個報文段以及以後的全部報文段,這樣就會有一個問題就是,以前發送的晚到的報文段會被再次發送,這樣就會有重複數據發送,會大大下降TCP的傳輸效率。選擇性確認選項(SACK)就是用來改善這種狀況的,它可使TCP只發送丟失的報文段,沒必要重複發送。SACK也用在鏈接初始化的時候,表示是否支持SACK。咱們能夠經過修改/proc/sys/net/ipv4/tcp_sack內核變量來啓用或者關閉選擇性確認選項。
kind = 5 : SACK的工做選項。每兩個塊表示一個連續的數據段區間,左邊沿表示連續數據段的第一個數據序號,右邊沿表示最後一個數據段序號的下一個序號。而後SACK就能夠根據區間來確認哪些數據沒有收到,以便從新發送丟失的數據段。由於一個區間就要佔用8字節,因此一個TCP數據段最多有四個這樣的區塊
kind = 8 : 時間戳選項。用來較爲精準的計算通訊雙方之間的迴路時間(RTT),爲TCP的流量控制提供重要信息。咱們能夠經過proc/sys/net/ipv4/tcp_timestamps內核變量來啓用或者關閉時間戳選項。
## TCP鏈接超時 ##
使用一個客戶端去連接一個服務器,而後使用iptable命令過濾並丟棄全部服務器端的鏈接請求報文,來模擬網絡異常,讓其重連。而後使用tcpdump抓包觀察TCP的超時重連。
一共有六個同步報文段,第一個是第一次請求,以後的五個應該都是超時重連發送的請求。他們的時間間隔分別是1s,2s,4s,8s,16s。所以,TCP一共進行了五次重連。這個次數是由proc/sys/net/ipv4/tcp_syn_retries中定義的。 在五次重連都是失敗的時候,TCP會放棄連接並通知應用程序。