談談TCP的四次揮手

2022-07-30 19:30:14 字數 930 閱讀 6111

「揮手」是為了終止連線,tcp四次揮手的流程圖如下:

(在socket程式設計中,可以由客戶端或服務端進行close操作來進行)

下面的圖是由客戶端主動關閉連線

msl是什麼?最長報文段壽命

if793 定義了msl是2分鐘

linux 的msl 是30s

問題:為什麼time-wait會有這個狀態呢?為什麼不直接fin-wait-2之後馬上就closed呢?

-----》1、確保有足夠的時間讓對方收到ack包(如果被動端沒有收到ack的話,就會觸發重發fin包,一來一去正好2個msl)

2、避免新舊連線混淆(有足夠的時間,讓這個連線不會和後面的連線混淆在一去,因為有些路由器會快取ip資料報,如果連線被重用了,那麼這些延遲收到的包,就有可能會跟新連線混在一去)

為什麼需要四次揮手才能斷開連線呢?

因為tcp是全雙工,傳送方和接受方都需要fin報文和ack報文。換句話說,傳送方和接受方各只需2次揮手就可以斷開連線。只不過有一方的被動的,所以看起來就是4次揮手

問題;伺服器出現大量close_wait狀態的原因?

1、對方關閉socket連線,我方忙於讀或寫,沒有及時關閉連線 (這種情況,檢查**,特別是釋放資源的**)

2、檢查配置,特別是處理請求的執行緒配置(特別是配置執行緒池的執行緒數不合理)

我們怎樣在伺服器上查到處於close-wait狀態的下連線數呢?通過什麼命令可以統計出來呢?這個處於close-wait狀態的數量太多的話,會導致什麼問題呢?

-------》命令   netstat - n | awk '/^tcp/end'

tcp 四次揮手 TCP四次揮手

tcp斷開連線的過程 客戶端傳送fin報文,表明客戶端將不在傳送資料。具體過程 把fin標誌位改為1,序號seq u,之前傳送的資料加1,這裡規定即使不攜帶資料序號也要 1。該過程中客戶端通過close系統呼叫從established狀態進入fin wait 1狀態。第二次揮手 服務端收到客戶端發來...

TCP四次揮手

純給自己看的 發起關閉的一方是客戶端,被動關閉的一方是伺服器。1 客戶端a傳送乙個fin 1,用來關閉客戶a到伺服器b的資料傳送。圖上畫的對,還有乙個seq n 2 伺服器b收到這個fin,它發回乙個ack 1,確認序號ack為收到的序號加1。3 伺服器b關閉與客戶端a的連線,傳送乙個fin 1給客...

TCP四次揮手

四次揮手 1.客戶端程序發出連線釋放報文,並且停止傳送資料。釋放資料報文首部,fin 1,其序列號為seq u 等於前面已經傳送過來的資料的最後乙個位元組的序號加1 此時,客戶端進入fin wait 1 終止等待1 狀態。tcp規定,fin報文段即使不攜帶資料,也要消耗乙個序號。2.伺服器收到連線釋...