网站首页 > 博客文章 正文
TCP的状态转化如下图所示,其中time_awit状态是CLOSED之前的一个状态,等待2个MSL时间。
为什么需要time_awit状态呢?为什么不直接进入closed状态呢?直接进入closed状态不就能更快地释放资源给新的连接使用了吗?而是需要2MSL(linux默认)的等待时间呢?
有两个原因,第一个原因是为了防止出现“迷路的数据包”,如下图所示,如果在第一个连接里面第三个数据包由于底层网络故障延迟送达,新的连接建立后,这个迟到的数据包才到达,那么将会导致接收数据紊乱。
第二个原因则更加简单,如果因为最后一个ack丢失,那么对方将一直处于last ack状态,如果此时重新发起新的连接,对方将返回RST包拒绝请求,将会导致无法建立新连接。
为此,设计了time_awit状态。在高并发情况下,如果能将time_awit的tcp复用,那么便可以极大地提高并发效率。Time_awit的tcp复用是指可以将处于time_awit状态的连接重复利用起来,从time_awit转化为established,继续使用。linux内核通过net.ipv4.tcp_tw_reuse参数控制是否开启time_awit状态复用。那么读者可能很好奇,之前不是说time_awit设计之初是为了解决上面两个问题的吗?如果直接复用不是会导致上面两个问题吗?这里先介绍linux默认开启的一个tcp时间戳策略net.ipv4.tcp_timestamps = 1,时间戳开启后,针对第一个迷路数据包的问题,由于晚到数据包的时间戳过早,这个数据包会被直接丢弃,不会导致新连接的数据包紊乱。针对第二个问题,当开启reuse后,当对方处于last-ack状态时,发送syn包会返回FIN,ACK包,然后客户端发送RST让服务端关闭请求,从而客户端便可以再次发送syn建立新的连接了。
最后还需要提醒读者的是,linux 4.1内核版本之前除了tcp_tw_reuse以外,还有一个参数tcp_tw_recycle,这个参数就是强制回收time_wait状态的连接,它会导致NAT环境丢包,所以不建议开启。
- 上一篇: 科研笔记神器:??一边视频,一边笔记,轻松搞定B站视频学习
- 下一篇: 小程序开发工具有哪些
猜你喜欢
- 2024-12-03 科研笔记神器:??一边视频,一边笔记,轻松搞定B站视频学习
- 2024-12-03 可信时间戳知识产权保护全攻略
- 2024-12-03 建议收藏!生活中你应该知道的急救黄金时间
- 2024-12-03 时间戳展示设计思路分享
- 2024-12-03 自己写插件-实现时间戳自由
- 2024-12-03 POSTGRESQL中时间戳的奥秘timestamptz
- 2024-12-03 比特币与时间戳
- 2024-12-03 一个按时间戳排序导致的 Bug
- 2024-12-03 以太坊基本术语
- 2024-12-03 你可能永远不知道的记事本功能
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)