天天看點

奇怪的知識又增加了5——TCP

奇怪的知識又增加了5——TCP

  1. 這篇 TCP 、UDP 絕了!
  2. 你還在為 TCP 重傳、滑動視窗、流量控制、擁塞控制發愁嗎?看完圖解就不愁了…
  3. TIME_WAIT

     TIME_WAIT是主動關閉的一方産生的,一般是client。

     TCP連接配接中,主動關閉的一方在關閉後的一段時間内保持一個TIME_WAIT的狀态。

     狀态維持時間一般是2MSL(Maximum Segment Lifetime,最大分段壽命),作用有兩點:

       (1)保證連接配接正常終止

       (2)保證網絡中未接收的資料包正常過期

摘抄1

暫以 A、B 來代指 TCP 連接配接的兩端,A 為主動關閉的一端。

1、四次揮手中,A 發 FIN, B 響應 ACK,B 再發 FIN,A 響應 ACK 實作連接配接的關閉。而如果 A 響應的 ACK 包丢失,B 會以為 A 沒有收到自己的關閉請求,然後會重試向 A 再發 FIN 包。

如果沒有 TIME_WAIT 狀态,A 不再儲存這個連接配接的資訊,收到一個不存在的連接配接的包,A 會響應 RST 包,導緻 B 端異常響應。

此時, TIME_WAIT 是為了保證全雙工的 TCP 連接配接正常終止。

2、TCP 下的 IP 層協定是無法保證包傳輸的先後順序的。如果雙方揮手之後,一個網絡四元組(src/dst ip/port)被回收,而此時網絡中還有一個遲到的資料包沒有被 B 接收,A 應用程式又立刻使用了同樣的四元組再建立了一個新的連接配接後,這個遲到的資料包才到達 B,那麼這個資料包就會讓 B 以為是 A 剛發過來的。

此時, TIME_WAIT 的存在是為了保證網絡中迷失的資料包正常過期。

摘抄2:時長的确定

由原因來推實作,TIME_WAIT 狀态的保持時長也就可以了解了。确定 TIME_WAIT 的時長主要考慮上文的第二種情況,保證關閉連接配接後這個連接配接在網絡中的所有資料包都過期。

說到過期時間,不得不提另一個概念: 最大分段壽命(MSL, Maximum Segment Lifetime),它表示一個 TCP 分段可以存在于網際網路系統中的最大時間,由 TCP 的實作,超出這個壽命的分片都會被丢棄。

TIME_WAIT 狀态由主動關閉的 A 來保持,那麼我們來考慮對于 A 來說,可能接到上一個連接配接的資料包的最大時長:A 剛發出的資料包,能保持 MSL 時長的壽命,它到了 B 端後,B 端由于關閉連接配接了,會響應 RST 包,這個 RST 包最長也會在 MSL 時長後到達 A,那麼 A 端隻要保持 TIME_WAIT 到達 2MS 就能保證網絡中這個連接配接的包都會消失。

MSL 的時長被 RFC 定義為 2分鐘,但在不同的 unix 實作上,這個值不并确定,我們常用的 centOS 上,它被定義為 30s,我們可以通過 /proc/sys/net/ipv4/tcp_fin_timeout 這個檔案檢視和修改這個值。

  1. CLOSE_WAIT

     CLOSE_WAIT是被動關閉的一方産生的,一般是server。

     接收到關閉連接配接時,在發出ACK的同時,告知上層,并等待上層處理完後的通知,在此期間保持CLOSE_WAIT狀态,在接收到上層通知後,發送FIN,并進入LAST_ACK狀态。

     若大量出現CLOSE_WAIT,可能是程式響應慢、上層沒有close連接配接等原因。

繼續閱讀