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给服务端。
两张图,是计算机网络自顶向下书上的原图:
进击的小🐴农