Tcp的close_wait和time_wait

close_wait:四次挥手中,服务器收到客户端finish请求发回ack之后,再等待一段时间,再发回finish。

原因:服务器有的数据没传完/子进程继承了父进程的socket套接字,这样套接字有2个引用计数,子进程close套接字只会使引用计数减1,但不会变0(类似c++11的shared_ptr),也就不会真正close。(解决办法:shutdown)

 

time_wait:四次挥手中,客户端发finish,服务端回ack,发finish,客户端最后发一个ack。关键是最后这个ack,如果客户端发了ack之后马上关闭,万一这个ack丢包了呢?服务端发的finish超时后(没收到ack阿),会再重新发finish给客户端,但这时客户端已经退出了,这就异常了。所以客户端发ack之后进入time_wait状态,等待2MSL,也就是报文段最大存活时间*2,这样可以保证如果ack丢包,服务端重发finish的时候,客户端还没有断开连接,还可以回复ack给服务端。

两张图,是计算机网络自顶向下书上的原图:

 

 

 

 

 

posted @ 2020-03-27 11:01  NeoZy  阅读(211)  评论(0编辑  收藏  举报