TCP三次握手與四次揮手
預設埠號:80
LINUX中TIME_WAIT的預設時間是30s
TCP三次握手
三次握手過程:每行代表發起握手到另一方剛剛收到資料包時的狀態
客戶端 服務端 客戶端狀態 服務端狀態 握手前 CLOSE LISTEN 客戶端傳送帶有SYN標誌的資料包到服務端 一次握手 SYN_SEND LISTEN 二次握手 服務端傳送帶有SYN/ACK標誌的資料包到客戶端 SYN_SEND SYN_RCVD 客戶端傳送帶有ACK標誌的資料包到服務端 三次握手 ESTABLISHED SYN_RCVD 握手結束 ESTABLISHED ESTABLISHED
為什麼是三次握手,兩次不行嗎?
三次握手主要是為了建立可靠的通訊通道,是客戶端和服務端同時具有傳送和接收資料的能力.
兩次握手只能保證單向連線是暢通的.(為了實現可靠資料傳輸,TCP協議的通訊雙方,都必須維護一個序列號,已標誌傳送出去的資料包中,哪些是已經被對方接收了的.三次握手的過程即是通訊雙方互相告知序列號起始值,並確認對方已經收到了序列號起始值的畢竟步驟;如果只是兩次握手,至多隻有連線發起放的起始序列號能夠被確認,另一方選擇的序列號則得不到確認)
三次握手能防止已經失效的連線請求又傳到服務端,建立多餘的連線,浪費系統資源.(假設客戶端第一次握手時傳送的請求報文SYN_1超時,攜帶Seqnum=90,客戶端再次發起第一次握手請求報文SYN_2,攜帶Seqnum=100,若此時SYN_1先於SYN_2到達客戶端.若為兩次握手,此時服務端傳送SYN_ACK_1到客戶端,攜帶Seqnum=91,建立連線.SYN_2到達客戶端,再建立一個連線,因此會造成資源浪費.若使用三次握手,客戶端接收到SYN_ACK_1後發現其攜帶的Seqnum不對,便將其廢棄,知道SYN_ACK_2到達,發現其符合條件,傳送ACK到服務端,建立連線)
TCP四次揮手
四次揮手過程:
客戶端 服務端 客戶端狀態 服務端狀態 揮手前 ESTABLISTED ESTABLISTED 客戶端傳送帶有FIN標誌的資料包到服務端 一次揮手 FIN-WAIT-1 ESTABLISTED 二次揮手 服務端收到這個FIN,它發回一個ACK,確認序號為收到的序號+1 FIN-WAIT-1 CLOSED-WAIT 三次揮手 服務端傳送一個FIN資料包到客戶端,關閉與客戶端的連線 FIN-WAIT-2 LAST_ACK 客戶端收到這個FIN,發揮ACK報文確認,並將確認序號設定為收到的序號+1 四次揮手 TIME-WAIT LAST_ACK 經過2MSL 揮手完成 CLOSE CLOSE CLOSED-WAIT:表示等待關閉
TIME-WAIT:為了解決網路的丟包和網路不穩定所帶來的其他問題,確保連線方能在時間範圍內,關閉自己的連線.
揮手前,客戶端和服務端的狀態都是ESTABLISHED(連線建立)
第一次揮手,客戶端傳送帶有FIN標誌的資料包給服務端,客戶端狀態變為FIN-WAIT-1.
第二次揮手,服務端收到客戶端的資料包後,傳送ACK確認幀給客戶端,服務端狀態變為CLOSED-WAIT.
第三次揮手,客戶端收到服務端的ACK確認幀後,狀態變為FIN-WAIT-2.此時服務端可能有些資料還未處理完,待服務端處理完資料會發送帶有FIN的資料包到客戶端,此時服務端狀態變更為LAST-ACK.
第四次揮手,客戶端收到服務端FIN報文後,迴應一個ACK確認報文,此時客戶端狀態變更為TIME-WAIT.服務端收到ACK確認報文後狀態變更為CLOSE,至此服務端完成連線的關閉.客戶端等待2MSL時間後,自動進入CLOSE狀態,至此客戶端關閉連線.
參考文章