[socket] 斷開連線時,time_wait狀態的解釋和驗證:
阿新 • • 發佈:2019-02-11
time_wait狀態的解釋和驗證:
在TCP同步雙工斷開連線中,假設沒有time-wait這個狀態,那麼在最後一個FIN N傳送時,主動關閉方接到後,返回ack N+1.那麼這個時候如果N+1這個包在沒有正確達到,那麼對方會一直處於LAST ACK的狀態,而傳送方因為沒tim_wait這個狀態,已經認為是正確傳送了就退出了,造成接收方一直等待。 加入time_wait後,time_wait本身這個值也代表這個一個包在網路上能生存的時間,接收方就可以簡單認為在這個時間內沒收到N+1的包就可以認為
這次斷開是失敗的,那麼要重新發送FIN N的序列號。而這個時候time_wait端也要將狀態改為接
收這個FIN的狀態,以進行下一次傳送
對重複連線的socket連線:設想下,假設沒這個time_wait,你剛退出這個套接字,四次斷開還未
完成,你或許在CLOSE_WAIT就退出了,然後又馬上連線,發出你的ACK。這個後果是很嚴重的,而
對方可能認為你還處於剛才的四次斷開狀態呢。。
第一無法驗證。對第二個驗證如下:在客戶端bind一個sockaddr_in,指定埠。在斷開時,馬上再次連線,發現連線不起來
[[email protected] client]$ ./client.exe 127.0.0.1 9000
fds
fds
fds
fds
fds
fds
[[email protected] client]$ ./client.exe 127.0.0.1 9000
[[email protected] client]$ ./client.exe 127.0.0.1 9000
[[email protected] client]$ ./client.exe 127.0.0.1 9000
這個時候埠處於
- 127.0.0.1:9005127.0.0.1:9000 TIME_WAIT