面试题目整理 关于服务器TIME_WAIT和CLOSE_WAIT

关于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的连接,如果没有收到,超过一段时间,自动释放。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值