关于timewait状态
四次揮手
- 主動關閉連接的一方,調用close,協議層發送FIN包,在TCP報頭的FIN字段設置為1,意思是我要和你斷開鏈接,主動關閉連接的一方進入到了FIN_WATI_1狀態
- 被動關閉的一方收到了FIN包之后,協議層回復ACK包,在他的TCP報頭中將ACK設置為1,表示收到了對方的關閉連接請求,被動 的一方進入到了CLOSE_WAIT狀態;主動關閉的一方收到了被動關閉一方的響應,等待對方關閉,主動關閉的一方進入到了FIN_WAIT_2狀態;
這里解釋一下,為什么被動關閉的一方收到主動關閉一方的FIN包之后進入的狀態是CLOSE_WAIT狀態呢,因為此時是傳輸層,傳輸層要等待上層的close操作 - 被動關閉的一方在完成所有的數據傳輸之后,調用 close操作,此時發送FIN包,在TCP報頭中將FIN字段設置為1,表示我要和你斷開連接,等待對方的ACK,此時被動關閉的一方進入到了LAST_ACK狀態
- 主動弄關閉的一方,收到了對方的FIN包之后,回復了ACK包,主動關閉的一方進入到了TIME_WATI狀態,而被動關閉的一方進入到了CLOSED狀態
- 主動關閉的一方等待了2MSL時間,結束TIME_WATI狀態,進入了 CLOSED狀態
為什么會有TIME_WAIT狀態呢???
他的出現主要是為了解決網絡丟包和網絡不穩定所帶來的其他問題:
1. 防止前一個連接的延遲數據包或者是丟失重傳數據包被下一個連接使用,可能出現這樣一種情況,用戶在瀏覽器訪問一個網站的時候,他的IP和端口號假設是192.168.3.2:8080,當用戶再次在在瀏覽器中訪問這個網站的時候,使用的IP和端口號恰巧還是192.168.3.2:8080,這個時候延遲數據或者是丟失重傳的數據就會被新的 連接錯誤使用了
2. 防止最后傳輸的ACK包沒有被對方接受,如果被動關閉的一方給主動關閉的一方發送了FIN,此時被動關閉的一方進入到了LAST_ACK狀態,主動關閉連接的一方收到請求之后,回復ACK包,但是ACK丟失了,此時被動關閉的一方一直停留在LAST_ACK狀態,被動方就會重發FIN包
如果TIME_WATI狀態的很短,或者是沒有這個狀態,如果此時又新建立了一次連接,剛好這個連接是上次使用過的ip和port,這個時候就會收到錯誤連接的包,連接不成功
如何查看當前有timewait狀態有哪些
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 814
CLOSE_WAIT 1
FIN_WAIT1 1
ESTABLISHED 634
SYN_RECV 2
LAST_ACK 1
服務器timewait狀態問題
Linux能夠分配的文件描述符是有限的,服務器需要處理網絡的數量巨大的請求,如果存在大量的timewait狀態狀態,勢必會造成系統的資源浪費,甚至是服務宕機。因為服務器是需要客戶端建立連接的,通過ip+port的方式,可以理解為是端口號處于timewait狀態。服務器可以設置SO_REUSEADDR套接字選項來通知內核,如果端口忙,但TCP連接位于TIME_WAIT狀態時可以重用端口。
總結
以上是生活随笔為你收集整理的关于timewait状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苏烟多少钱一包啊?
- 下一篇: 高并发系统搭建:web负载均衡