【slighttpd】基于lighttpd架构的Server项目实战(5)—TCP的TIME_WAIT状态

上一节我们已经开发了一个简单的echo服务器,在这里我们先不急着继续下去,先看看一些小细节!

在listener的代码中,对于监听套接字,我设置了SO_REUSEADDR这个选项,那么,这个选项有什么用呢?

int reuse = 1;
setsockopt(listen_sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

要明白这个问题,我们先看看tcp关闭连接的四次握手:


这里写图片描述

可以看到,主动关闭的一端将经历TIME_WAIT状态。

TIME_WAIT状态有两个存在的理由——

一、可靠地实现TCP全双工连接的终止:
假设主动关闭端最后发送的ACK丢失了,对端将重新发送FIN,主动关闭端只有在维护状态信息的情况下才能重传最后那个ACK。否则,主动关闭端将会响应一个RST,对端会将此响应标记为错误,所以不能进行正常的关闭。

二、允许老的重复分节在网络中消逝:
假设我们在两个主机之间建立了一个TCP连接,之后关闭这个连接,过一会又在相同的IP地址和端口之间建立另一个连接。由于IP地址和端口号与之前相同,所以如果出现上一个连接的老的重复分组,将会影响到新的连接。为解决这个问题,TCP将不会给处于TIME_WAIT状态的连接发起这个新的连接。

为解决以上问题,TIME_WAIT状态需要持续一定的时间,所以TIME_WAIT也被称为2MSL等待状态,一般持续时间在1分钟到4分钟之间。

关于TCP的各个状态,建立与终止等情况,可以参考下我的另一篇博文:

《TCP/IP详解 卷1:协议》 读书笔记 第十八章 TCP连接的建立与终止

因此,服务器端程序启用SO_REUSEADDR选项的好处是:如果服务端程序由于某种错误操作关闭了,我们需要立马重启服务程序,但是TIME_WAIT还占用着这些地址端口资源让你的服务无法开启。当开启SOREUSEADDR这个选项之后,就允许地址端口的重复绑定,使得服务快速重启。

另外,既然提到TIME_WAIT,有另一个问题需要提一下——

高并发TCP服务器中主动关闭的一方最好是客户端:
因为对于高并发服务器来说文件描述符资源是十分重要的,如果对于每一个连接都要经历TIME_WAIT这个2MSL的时长,势必造成资源不能马上复用的浪费。对于客户端,一般很少有并发资源限制,所以客户端执行主动关闭是比较合适的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值