写点什么

一个代码仓库(免费)与技术点 的故事

  • 2022 年 9 月 23 日
    北京
  • 本文字数:1037 字

    阅读完需:约 3 分钟

一个代码仓库(免费)与技术点 的故事

今日主题:

1、仓库代码更新(详见公告)

2、服务端 tcp 连接出现大量 time_wait (问题)




一、仓库代码 更新公告🪧

1、新增 4 个 demo 案列 &类库 代码:

1)发送邮件 demo 案例,邮件类库;

2)发送短信 demo 案例,短信类库;

3)导出 excel 表格 demo 案例;

4)数据导出 pdf 案例,类库;


注意事项:代码均可优化,因我写的为了结合案例,未曾使用框架,可替换内容,可自行优化。


链接🔗:https://github.com/doukoi-BDB



             

二、服务端 tcp 连接出现大量 time_wait

上述问题分为 3 块来思考:

Q1、大量的 time_wait 状态 tcp 连接存在,其本质原因是什么?

Q2、会对业务产生影响吗?

Q3、解决方式是什么?


先来回答第一个问题:

解答:高并发场景时候,会有大量短连接场景,特别是在 http 请求头中,如果 connection 头部被设置为 close 时,基本都由【服务端】发起主动关闭连接。

而 tcp 四次挥手关闭连接机制中,为了保证 ack 重发和丢弃延迟数据,设置 time_wait 为 2 倍的 msl(报文最大存活时间)。


其次回答第二个问题:

解答:每一个 time_wait 状态,都会占用一个本地端口,上限为 65535(16bit),当大量连接处于 time_wait 时,新的 tcp 建立连接就会【报错】,报错信息:address already in use :connect 异常 。


tips: tcp 本地端口数量,上限 65535(6.5w),这是因为 tcp 头部使用 16bit 存储端口号,因此约束上限。


最后回答第三个问题:

解答:3 种解决方式,分别是:

1)客户端的 http 请求头部,connection 设置为 keep-alive,保持存活时间。2)服务端缩减 time_wait 时间,设置为 1 msl(即,2min)。 

3)更新内核参数,编辑文件:/etc/sysctl.conf 。调整参数如下:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
复制代码

然后执行 /sbin/sysctl -p 让参数生效。


注意⚠️⚠️⚠️:

统计网络 time_wait 连接状态及 tcpip 连接数 命令如下:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
复制代码

状态:描述

CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放,等待tcp连接的数量,这个状态也是占用连接的
LAST_ACK:等待所有分组死掉
复制代码



关注我,熟悉 &了解更多有趣的事!!!

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2021.06.23 加入

欢迎订阅「八点半技术站」 Bruce.D、在北漂中,目前天猫好房团队中的一名扫地僧 GitHub仓库:https://github.com/doukoi-BDB 关注号主,看一个不一样的故事。 关注号主、加入社群;一起赚钱,一起成长。

评论

发布
暂无评论
一个代码仓库(免费)与技术点 的故事_GitHub_八点半的Bruce.D_InfoQ写作社区