关于tcp中time_wait状态的4个问题

time_wait是个常问的问题,tcp网络编程中最不容易理解的也是它的time_wait状态,这也说明了tcp/ip四次挥手中time_wait状态的重要性。
下面通过4个问题来描述它


问题

1.time_wait状态是什么
2.为什么会有time_wait状态
3.哪一方会有time_wait状态
4.如何避免time_wait状态占用资源

1.time_wait状态是什么

简单来说:time_wait状态是四次挥手中服务器向客户端发送FIN终止连接后进入的状态。

下图为tcp四次挥手过程
这里写图片描述
可以看到time_wait状态存在于客户端收到服务器Fin并返回ack包时的状态
当处于time_wait状态时,我们无法创建新的连接,因为端口被占用。


2.为什么会有time_wait状态

time_wait存在的原因有两点
1.可靠的终止TCP连接。
2.保证让迟来的TCP报文段有足够的时间被识别并丢弃。

1.可靠的终止TCP连接,若处于time_wait的客户端发送给服务器确认报文段丢失的话,服务器将在此重新发送FIN报文段,那么客户端必须处于一个可接收的状态就是time_wait而不是close状态。
2.保证迟来的TCP报文段有足够的时间被识别并丢弃,linux 中一个TCP端口不能打开两次或两次以上,当客户端处于time_wait状态时我们将无法使用此端口建立新连接,如果不存在time_wait状态,新连接可能会收到旧连接的数据。time_wait持续的时间是2MSL,保证旧的数据可以丢弃,因为网络中的数据最大存在MSL(maxinum segment lifetime)


3.哪一方会有time_wait状态

time_wait状态是一般有客户端的状态。而且会占用端口
有时产生在服务器端,因为服务器主动断开连接或者发生异常


4.如何避免time_wait状态占用资源

如果是客户端,我们一般不用担心,因为客户端一般选用临时端口,再次创建连接会新分配一个端口。除非指定客户端使用某端口,不过一般不需要这么做。

如果是服务器主动关闭连接后异常终止,则因为它总是使用用一个知名服务器端口号,所以连接的time_wait状态将导致它不能重启,不过我们可以通过socket的选项SO_REUSEADDR来强制进程立即使用处于time_wait状态的连接占用的端口。
通过socksetopt设置后,即使sock处于time_wait状态,与之绑定的socket地址也可以立即被重用。

此外也可以通过修改内核参数/proc/sys/net/ipv4/tcp_tw/recycle来快速回收被关闭的socket,从而是tcp连接根本不进入time_wait状态,进而允许应用程序立即重用本地的socket地址。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值