TIME_WAIT状态

TIME_WAIT状态是TCP在四次挥手终止连接时,主动关闭连接的一方(客户端或者服务端)在收到对端发送的FIN之后,进入的一种状态。该状态的时间为2个MSL,MSL是指数据包在网络中最大的存活时间,超过这个时间数据包就会消失。

为什么要有TIME_WAIT这个状态?

1. 保证TCP全双工连接能可靠关闭
假设主动关闭的一方(这里假设为客户端)发送的最后一条ACK丢失,由于超时重传机制,服务端需要重发FIN,如果客户端没有维持一个TIME_WAIT状态,而是直接关闭了,那么该FIN就找不到对应的连接,服务端就会收到一个RST而不是ACK,服务端会认为连接出现错误,而实际上这是正常的关闭连接,不是出现错误。所以,当服务端发送FIN到客户端时,客户端必须存在一个TIME_WAIT的状态来保持连接状态。
2.为了使旧的数据包在网络中过期而消失
假设没有TIME_WAIT这个状态,连接直接关闭,这时有一个新的TCP连接和之前的连接具有相同的四元组(源IP地址、目的IP地址、源端口号和目的端口号),会存在一种情况:上次已关闭的连接所发送的数据(残留在网络中的数据)会被当前新连接当做正常的数据传输而接收,导致数据传输混乱。所以在TIME_WAIT状态后,旧的数据包会因为超过最大生存时间而消失。这样就保证了TCP连接的可靠传输。

如何解决TIME_WAIT状态引起的bind失败问题?

一个服务器需要处理大量客户端的连接。假如有一些客户端不够活跃,但又保持着连接,这时候需要服务器注定来关闭连接,因此会产生大量的TIME_WAIT状态下的连接。因为请求连接数量很多,但是因为TIME_WAIT状态的存在,会占用着大量的四元组,因为服务器的IP地址和端口号是固定的,这时新来的客户端连接的IP地址和端口号可能被占用着,就会出现问题。

使用setsockopt()设置socket描述符的 选项SO_REUSEADDR为1, 表示允许创建端口号相同但IP地址不同的多个socket描述符。
 

int opt=1;
setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值