当前位置: 首页 > 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的最小时间段;
并且这个时间段,防止旧连接的报文干扰新连接的收发,防止在新连接的时候误识别为需要关闭,等待旧连接的报文在网络中消失;

http://www.xdnf.cn/news/155359.html

相关文章:

  • 游戏状态管理:用Pygame实现场景切换与暂停功能
  • Unity-Shader详解-其一
  • MySQL多查询条件下深度分页性能优化技巧及示例总结
  • Pytorch(无CPU搭建)+Jupyter
  • Unity-Shader详解-其二
  • 【WLAN】华为无线AC双机热备负载分担—双链路热备份
  • 【数据融合】基于拓展卡尔曼滤波实现雷达与红外的异步融合附matlab代码
  • C++异步并发支持库future
  • 探针台的具体分类有哪些
  • 基于pandoc的MarkDown格式与word相互转换小工具开发(pyqt5)
  • AAAI2016论文 UCO: A Unified Cybersecurity Ontology
  • Eclipse 插件开发 1
  • MEME在线进行蛋白氨基酸序列的保守基序预测的具体分析步骤
  • 【Tauri】桌面程序exe开发 - Tauri+Vue开发Windows应用 - 比Electron更轻量!8MB!
  • 提取PPT图片
  • 数据库监控功能-oracle
  • 【多线程】五、线程同步 条件变量
  • Unity之基于MVC的UI框架-含案例
  • mac笔记本安装brew、nvm、git等完整版
  • C#里使用libxl来创建EXCEL文件然后发送到网络
  • 前端节流、防抖函数
  • MobX 在 React 中的使用:状态管理的新选择
  • CS001-50-depth
  • JFLAP SOFTWARE 编译原理用(自动机绘图)
  • 4月26日星期六今日早报简报微语报早读
  • RabbitMQ 四种交换机(Direct、Topic、Fanout、Headers)详解
  • 代码随想录算法训练营Day35
  • 3、初识RabbitMQ
  • Java学习手册:常用的内置工具类包
  • 35-疫苗预约管理系统(微服务)