关于TCP 三次握手和四次挥手下面这个图已经很清晰了(盗图)
我之前用asio碰到过 大量连接 CLOSE_WAIT 状态
现在想想是没调用 socket_.shutdown(tcp::socket::shutdown::shutdown_both,ec);就直接析构了socket_
具体原因是客户端请求关闭连接的时候 服务器在收到 FIN M 之后 没发送 ack M+1 和 FIN N
正确的关闭连接是:
boost::system::error_code ec;
socket_.cancel(ec);
socket_.shutdown(tcp::socket::shutdown_both,ec);
socket_.close(ec);
而 TIME_WAIT状态出现在服务器接受了大量连接 主动关闭连接的时候(一般是web服务器)
这时候就要考虑是不是被攻击了
这里有篇文章讲解的比较详细
http://www.cnblogs.com/sunxucool/p/3449068.html
最近查看为什么会有三次握手和四次挥手的问题 找到一个很详细的解释
那么现在来回答为何连接建立是三次,而释放是四次呢。TCP连接其实是一个双向的连接,例如说,A与B两台电脑建立TCP连接时,实际A到B和B到A时看做两条通道的。在TCP连接建立的过程中,A向B发送连接请求,B需要发挥连接确认之后,这个时候其实连接已经建立了,但是为何还有A需要再次向B发送一个确认报文呢,因为网络不稳定,之前可能网络中会有很多失效的连接请求报文,如果没有确A再次确认的过程,那么如果有些失效报文又被重新受到,那么会影响当前的连接,因此是三次。这个时候,连接建立了,A与B可以相互通信。
连接释放的时候,实际上是其中一方,如A提出了释放请求,B收到后进行了报文确认,那么A到B的连接就释放了,这个时候,B还是可以向A发送数据,而且A会直接接收,到了B数据发送完了,B再向A发送请求释放的请求,B进入超时等待阶段,如果A及时发送连接中断确认,那么B就释放了B到A的连接,如果没有收到,超过一段时间,自动释放。