前言

文章插图
两条竖线分别是表示:
- 主动关闭(active close)的一方
- 被动关闭(passive close)的一方
问题描述模拟高并发的场景,会出现批量的 time-wait 的 tcp 连接:

文章插图
短时间后,所有的 time-wait 全都消失,被回收,端口包括服务,均正常 。即,在高并发的场景下,time-wait 连接存在,属于正常现象 。
线上场景中,持续的高并发场景:
- 一部分 time-wait 连接被回收,但新的 time-wait 连接产生;
- 一些极端情况下,会出现大量的 time-wait 连接;
Nginx 作为反向代理时,大量的短链接,可能导致 Nginx 上的 tcp 连接处于 time_wait 状态:
- 每一个 time_wait 状态,都会占用一个本地端口,上限为 65535(16 bit,2 Byte);
- 当大量的连接处于 time_wait 时,新建立 tcp 连接会出错,address already in use : connect 异常;
// 统计:各种连接的数量$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'ESTABLISHED 1154TIME_WAIT 1645tips: tcp 本地端口数量,上限为 65535,这是因为 tcp 头部使用 16 bit 存储端口号,因此约束上限为 65535 。问题分析大量的 time-wait 状态 tcp 连接存在,其本质原因是什么?
- 大量的短连接存在;
- 特别是 HTTP 请求中,如果 connection 头部取值被设置为 close 时,基本都由服务端发起主动关闭连接;
- tcp 四次挥手关闭连接机制中,为了保证 ACK 重发和丢弃延迟数据,设置 time_wait 为 2 倍的 MSL(报文最大存活时间);
- tcp 连接中,主动关闭连接的一方出现的状态;(收到 FIN 命令,进入 time-wait 状态,并返回 ACK 命令)
- 保持 2 个 MSL 时间,即 4 分钟;(MSL 为 2 分钟)
- 客户端,HTTP 请求的头部,connection 设置为 keep-alive,保持存活一段时间,现在的浏览器,一般都这么进行了;
- 服务器端,允许 time_wait 状态的 socket 被重用;
- 服务器端,缩减 time_wait 时间,设置为 1 MSL;(即 2 分钟)
【tcp 连接 time-wait 状态过多问题解释】参考链接:https://www.zhihu.com/question/298214130
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
