TCP四次揮手時的TIME_WAIT狀態
這幾天面試遇到一個問題是關於TCP四次揮手的時候,先發起方為什麼會有一個TIME_WAIT狀態,它的作用是什麼?
然後整理了一些資料和自己的一些總結,方便日後查閱。
先上圖
注:
MSL(最大報文段生存時間),網路中的TCP的報文段經過此時間會消失,舊tcp連線的報文段消失了就不會影響新連線
TCP和UDP是傳輸層的協議,TCP的傳輸單位是報文段,UDP是使用者資料報
“請求”一詞是事務上的概念,HTTP協議是一種事務協議,如果說傳送一個HTTP請求,這種說法沒問題,但TCP是一種通訊方式,所以不要說TCP請求一詞。
(1)
為什麼連線的時候是三次握手,關閉的時候卻是四次握手?
TCP是全雙工的,每個方向都要進行單獨關閉。當一方完成資料傳送任務後,傳送一個FIN報文來終止這一方向的連線,這意味著不再發送資料,但是還可以接收資料,除非對方也傳送了FIN報文。假設client端是主動發起方,當server端收到Client端的FIN報文後,知道它不再發送資料過來了。但server端自己還有資料沒發完,不想立即關閉連線,所以只能先回復一個ACK報文,告訴client端,"你發的FIN報文我收到了"。server端等所有的資料都發送完了,然後發一個FIN+ACK報文給client端,client端收到後傳送一個ACK報文給server端,server端收到了,然後才真正關閉了連線,故需要四步握手。
(2)
TIME_WAIT狀態的時間可能為30秒、2分鐘不等,Linux是60秒。
在核心原始碼 /usr/src/linux/include/net/tcp.h 中有 一行
#define TCP_TIMEWAIT_LEN (60*HZ)
檢視tcp各種狀態,例如TIME_OUT,SYN_SEND等狀態的連線數
netstat -nt | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'