TCP三次握手的意外情况分析

news/2024/11/15 21:54:39/文章来源:https://www.cnblogs.com/seamount3/p/18300213

> 其实很简单,就像我个人给别人发信息一样,有个重传机制,毕竟对方可能突然有事忘看了,或者说看完了忘了回,所以我本人会重传,那么接下来就以聊天的角度来给大家解析一下TCP三次握手时的意外情况以及应对方针

注文中的大部分知识非我原创,我只是知识的搬运工,并且尝试搬运进脑子里而已

总结

  • 重发的情况永远出在等待消息的那方(例如说你去发了个消息给你的女神"今天一起吃饭吗?",然后人家迟迟不回复,那么怎么说这个重发的人也该是你吧?所以TCP三次握手会重发的只有发送SYN包的人(因为他在等待消息回复))
  • 纯ACK的发送者是不会重发(不然就stackoverflow了,你回复我的收到,我回复你的收到("代表说我收到了你说的收到"),你又接着回复收到(子子孙孙无穷无尽也))

第一次握手丢失了,会发生什么?

当客户端想和服务端建立 TCP 连接的时候,首先第一个发的就是 SYN 报文,然后进入到 SYN_SENT 状态。

在这之后,如果客户端迟迟收不到服务端的 SYN-ACK 报文(第二次握手),就会触发「超时重传」机制,重传 SYN 报文,而且重传的 SYN 报文的序列号都是一样的

不同版本的操作系统可能超时时间不同,有的 1 秒的,也有 3 秒的,这个超时时间是写死在内核里的,如果想要更改则需要重新编译内核,比较麻烦。

当客户端在 1 秒后没收到服务端的 SYN-ACK 报文后,客户端就会重发 SYN 报文,那到底重发几次呢?

在 Linux 里,客户端的 SYN 报文最大重传次数由 tcp_syn_retries内核参数控制,这个参数是可以自定义的,默认值一般是 5。

# cat /proc/sys/net/ipv4/tcp_syn_retries
5

通常,第一次超时重传是在 1 秒后,第二次超时重传是在 2 秒,第三次超时重传是在 4 秒后,第四次超时重传是在 8 秒后,第五次是在超时重传 16 秒后。没错,每次超时的时间是上一次的 2 倍

当第五次超时重传后,会继续等待 32 秒,如果服务端仍然没有回应 ACK,客户端就不再发送 SYN 包,然后断开 TCP 连接。

所以,总耗时是 1+2+4+8+16+32=63 秒,大约 1 分钟左右。

举个例子,假设 tcp_syn_retries 参数值为 3,那么当客户端的 SYN 报文一直在网络中丢失时,会发生下图的过程:

img

具体过程:

  • 当客户端超时重传 3 次 SYN 报文后,由于 tcp_syn_retries 为 3,已达到最大重传次数,于是再等待一段时间(时间为上一次超时时间的 2 倍),如果还是没能收到服务端的第二次握手(SYN-ACK 报文),那么客户端就会断开连接。

第二次握手丢失了,会发生什么?

当服务端收到客户端的第一次握手后,就会回 SYN-ACK 报文给客户端,这个就是第二次握手,此时服务端会进入 SYN_RCVD 状态。

第二次握手的 SYN-ACK 报文其实有两个目的 :

  • 第二次握手里的 ACK, 是对第一次握手的确认报文;
  • 第二次握手里的 SYN,是服务端发起建立 TCP 连接的报文;

所以,如果第二次握手丢了,就会发生比较有意思的事情,具体会怎么样呢?

因为第二次握手报文里是包含对客户端的第一次握手的 ACK 确认报文,所以,如果客户端迟迟没有收到第二次握手,那么客户端就觉得可能自己的 SYN 报文(第一次握手)丢失了,于是客户端就会触发超时重传机制,重传 SYN 报文

然后,因为第二次握手中包含服务端的 SYN 报文,所以当客户端收到后,需要给服务端发送 ACK 确认报文(第三次握手),服务端才会认为该 SYN 报文被客户端收到了。

那么,如果第二次握手丢失了,服务端就收不到第三次握手,于是服务端这边会触发超时重传机制,重传 SYN-ACK 报文

注意哦,这里并不违反我们的总结中的第一条,因为你客户端是发送SYN的一方,同时服务端是发送SYN的一方

在 Linux 下,SYN-ACK 报文的最大重传次数由 tcp_synack_retries内核参数决定,默认值是 5。

# cat /proc/sys/net/ipv4/tcp_synack_retries
5

因此,当第二次握手丢失了,客户端和服务端都会重传:

  • 客户端会重传 SYN 报文,也就是第一次握手,最大重传次数由 tcp_syn_retries内核参数决定;
  • 服务端会重传 SYN-ACK 报文,也就是第二次握手,最大重传次数由 tcp_synack_retries 内核参数决定。

举个例子,假设 tcp_syn_retries 参数值为 1,tcp_synack_retries 参数值为 2,那么当第二次握手一直丢失时,发生的过程如下图:

img

具体过程:

  • 当客户端超时重传 1 次 SYN 报文后,由于 tcp_syn_retries 为 1,已达到最大重传次数,于是再等待一段时间(时间为上一次超时时间的 2 倍),如果还是没能收到服务端的第二次握手(SYN-ACK 报文),那么客户端就会断开连接。
  • 当服务端超时重传 2 次 SYN-ACK 报文后,由于 tcp_synack_retries 为 2,已达到最大重传次数,于是再等待一段时间(时间为上一次超时时间的 2 倍),如果还是没能收到客户端的第三次握手(ACK 报文),那么服务端就会断开连接。

第三次握手丢失了,会发生什么?

客户端收到服务端的 SYN-ACK 报文后,就会给服务端回一个 ACK 报文,也就是第三次握手,此时客户端状态进入到 ESTABLISH 状态。

因为这个第三次握手的 ACK 是对第二次握手的 SYN 的确认报文,所以当第三次握手丢失了,如果服务端那一方迟迟收不到这个确认报文,就会触发超时重传机制,重传 SYN-ACK 报文,直到收到第三次握手,或者达到最大重传次数。

注意,ACK 报文是不会有重传的,当 ACK 丢失了,就由对方重传对应的报文

这里映射的是总结的第二条

举个例子,假设 tcp_synack_retries 参数值为 2,那么当第三次握手一直丢失时,发生的过程如下图:

img

具体过程:

  • 当服务端超时重传 2 次 SYN-ACK 报文后,由于 tcp_synack_retries 为 2,已达到最大重传次数,于是再等待一段时间(时间为上一次超时时间的 2 倍),如果还是没能收到客户端的第三次握手(ACK 报文),那么服务端就会断开连接。

参考

4.1 TCP 三次握手与四次挥手面试题 | 小林coding (xiaolincoding.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/743120.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MBR20200FCT-ASEMI无人机专用MBR20200FCT

MBR20200FCT-ASEMI无人机专用MBR20200FCT编辑:ll MBR20200FCT-ASEMI无人机专用MBR20200FCT 型号:MBR20200FCT 品牌:ASEMI 封装:TO-220F 批号:最新 最大平均正向电流(IF):20A 最大循环峰值反向电压(VRRM):200V 最大正向电压(VF):0..90V 工作温度:-50C~175C 反向恢…

fiddler笔记

fiddler汉化 只抓取指定浏览器的包

CDN在App分发中的作用

CDN(Content Delivery Network,内容分发网络)在App分发中扮演着至关重要的角色。它通过一系列技术手段,将App的内容高效、快速地传递给用户,显著提升用户体验和下载速度。以下是CDN在App分发中的具体作用和优势: 一、CDN在App分发中的作用提升下载速度:CDN分发系统能够将…

配置文件的编写

1. 在application.yml里面配置需要的参数 2. pom.xml文件引入配置文件依赖<!-- 配置生成配置文件处理器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><op…

全网最适合入门的面向对象编程教程:16 类和对象的Python实现-多态、方法重写与开闭原则

本文主要介绍了 Python 中创建自定义类时子类如何实现对父类方法的重写、方法重写的定义和多态的基本概念,并对开闭原则进行介绍。全网最适合入门的面向对象编程教程:16 类和对象的 Python 实现-多态、方法重写与开闭原则 摘要: 本文主要介绍了 Python 中创建自定义类时子类…

TapData 医疗美容行业数字化白皮书上线

本白皮书全面分析和探讨了医疗美容行业的数字化现状、驱动力及应用场景,旨在为行业从业者提供深度洞察和实用建议。随着颜值经济的发展,人们追求“美”的热情也不断高涨,而作为近年来被资本频频下注的赛道之一,医疗美容逐渐走进大众视野。 一方面,社会对外貌的重视程度不断…

华为超融合FusionCude8.1.5实施手册(三)

登录平台,初始化系统 平台默认密码:修改为Admin@2024默认用户名:admin 默认密码:fc2HW@CLOUD8! 摘录官方文档关闭关闭iBMC平面网关Ping校验。后重新执行初始化 关闭校验后重新执行校验校验失败,后排查因为带外和管理网络不能互通的原因导致的。因ip地址资源不足,重新申请…

如何pr到别人仓库(无废话)

如何PR到别人仓库(指定分支) 记录一下,之前都是直接master分支,现在记录如何pr到别人仓库的其他分支 首先进入别人仓库然后点击fork到自己仓库步骤(以博主自己一个例子为例) (1)拉取你fork到你仓库 git clone https://github.com/dragonforward/MaixCDK.git(2)添加原…

MBR10200CT-ASEMI智能AI应用MBR10200CT

MBR10200CT-ASEMI智能AI应用MBR10200CT编辑:ll MBR10200CT-ASEMI智能AI应用MBR10200CT 型号:MBR10200CT 品牌:ASEMI 封装:TO-220 批号:最新 恢复时间:35ns 最大平均正向电流(IF):10A 最大循环峰值反向电压(VRRM):200V 最大正向电压(VF):0.70V~0.90V 工作温度:-…