当前位置: 首页 > news >正文

关于TCP三次握手和四次挥手的疑点

参考文章:浅谈TCP三次握手和四次挥手

1、三次握手的作用
(1)确保双方收到对方的初始序列号:客户端发送SYN包,服务器回复SYN-ACK包,客户端再回复ACK包,确保双方都接收到对方的序列号。
(2)防止重复的连接初始化:如果网络中存在旧的连接请求包,三次握手可以确保不会因为这些旧包而错误地建立连接。
(3)同步序列号:在建立连接时,双方需要同步各自的序列号,以确保后续数据传输的顺序和完整性。

2、为什么能防止重复连接初始化?
客户端发送的旧SYN报文如果比新报文先到达服务端,服务端会回复SYN+ACK,但客户端发现确认号不对,就会发送RST终止连接。这样旧的连接请求就不会建立,而新的SYN之后到达时就能正常建立连接。
通过返回的确认ACK信息中的序列号,判断是否是当前连接的请求,从而即时发送RTS报文终止连接,避免服务器为连接分配资源造成浪费;

3、为什么要四次挥手?
四次挥手的主要目的是为了确保双方都已经完全准备好关闭连接,避免数据丢失或中断。具体原因如下:
双向关闭:TCP连接是全双工的,需要双方分别关闭发送和接收信道。四次挥手确保双方都确认了关闭操作。
数据传输完毕:通过FIN和ACK的交换,确保所有数据都已传输和接收完毕,没有遗漏。
避免资源浪费:确保双方的连接资源都已释放,防止因未完全关闭连接而造成资源浪费。

备注:为什么是四次挥手不是三次挥手,因为TCP连接是全双工,任何一端都是具有发送和接受功能的,如果是三次,也就是在第二次服务端回复ACK信息时,加上Fin终结发送指令,有可能服务端此时还没有数据还没有传输处理完成,需要等待传输完成后,再发送Fin终结指令,所以将三次拆成四次;

4、为什么TIME_WAIT要等待2MSL?
在挥手过程中,客户端在发送最后一个ACK包后会进入一个称为TIME_WAIT状态,持续2MSL(Maximum Segment Lifetime,最大报文段生存时间)。主要原因如下:

确保最后的ACK包被接收:如果服务器没有收到最后的ACK包,会重发FIN包。客户端处于TIME_WAIT状态可以确保它有足够的时间接收和处理重发的FIN包,再次发送ACK包。
防止旧连接数据混淆:2MSL的等待时间确保了连接的旧数据包在网络中消失,避免新连接中出现旧连接的数据包混淆。

备注:为什么是2MSL,客户端发送ACK到服务端需要1MSL,服务端到客户端重发FIN需要1MSL,2MSL是客户端能接受到服务端重发的FIN的最小时间段;
并且这个时间段,防止旧连接的报文干扰新连接的收发,防止在新连接的时候误识别为需要关闭,等待旧连接的报文在网络中消失;

相关文章:

  • Ubuntu下安装vsode+qt搭建开发框架(二)
  • 罗技Flow跨电脑控制
  • 买币永续合约成全球交易热点,XBIT去中心化交易所平台显著提升市场流动性
  • 信奥赛CSP-J复赛集训(DP专题)(28):P2946 [USACO09MAR] Cow Frisbee Team S
  • io_uring概述:现代 Linux 异步 IO 的新范式
  • MySQL长事务的隐患:深入剖析与解决方案
  • 强化学习基础
  • 图像畸变-径向切向畸变实时图像RTSP推流
  • 考研系列-计算机组成原理第四章、指令系统
  • 任务管理系统,Java+Vue,含源码与文档,科学规划任务节点,全程督办保障项目落地提效
  • 【Java 数据结构】List,ArrayList与顺序表
  • 软件设计原则
  • 4.23-4.26学习总结 HTML—CSS常见标签和样式
  • 使用 OpenCV 进行视觉图片调整的几种常见方法
  • 案例速成GO操作redis,个人笔记
  • 区块链VS传统数据库:金融数据存储的“信任”与“效率”博弈
  • 第十六届蓝桥杯网安初赛wp
  • SpringBoot集成WebSocket,单元测试执行报错
  • Ubuntu20.04 Ollama 配置相关
  • 区块链实战:Hyperledger Fabric多节点网络部署与高性能业务链码
  • “90后”樊鑫履新乌兰察布市察右中旗副旗长人选
  • 上海112位全国劳动模范和先进工作者接受表彰,樊振东榜上有名
  • 这些被低估的降血压运动,每天几分钟就管用
  • 关键词看中国经济“一季报”:稳,开局良好看信心
  • 谢震业、梁小静等名将在列,世界田联接力赛中国队名单出炉
  • “爱泼斯坦案”关键证人弗吉尼亚·朱弗雷自杀身亡