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

TCP三次握手,四次挥手,再次总结

TCP三次握手,四次挥手,再次总结

      • TCP和UDP协议基础
      • 三次握手
        • 为什么需要三次握手?
      • 数据传输阶段
      • 四次挥手
        • 为什么需要超时等待?
        • 为什么四次挥手不能减少到三次?


TCP和UDP协议基础

  1. 协议位置:TCP和UDP协议都属于传输层。
  2. 数据类型:数据可以是文件、视频、图片等多种形式。
  3. TCP传输过程:包括三次握手、数据传输确认、四次挥手。

三次握手

  1. 第一次握手:客户端发送一个SYN包,询问是否建立连接。

  2. 第二次握手:服务端同意连接,回复一个SYN+ACK包。

  3. 第三次握手:客户端收到之后,回复服务端一个ACK包,连接建立。

为什么需要三次握手?
  • 目的:防止失效的请求报文,重新传输到服务端,造成错误。

  • 风险:如果仅有两次握手,滞留的SYN可能恢复连接,导致:

    • 服务端又发送一个SYN+ACK包,再次进入传输状态。
    • 这时,客户端认为是一条连接。
    • 服务端认为是两条连接。
    • 双方状态不一致。
  • 三次握手优势:通过序号机制判断SYN+ACK是否有效或过期,确保连接一致。


数据传输阶段

  1. 可靠性:TCP协议能解决丢包问题和乱序问题。

  2. 过程

    • TCP会建立缓冲区,复制数据并分割,头部拼接序列号和长度。
    • ACK包用于确认接收的数据,并告知发送端下一段数据的序列号。
    • 发送端可以一次发送多个数据包,接收端只需回复一次ACK。
    • ACK包通常不携带实际的传输内容。它仅用于确认已接收到的内容。
  3. 丢包处理

    第一步 - 检测丢失的300-399数据

    • 接收端收到部分数据后,发现序列号300-399的数据未完整,于是发送ACK=300。
    • 发送端收到ACK=300后,会重传序列号为300-399的数据。

    第二步 - 检测丢失的600-699数据

    • 接收端成功接收并确认了300-399数据后,对后续数据进行检查。
    • 接收端发现序列号600-699的数据丢失,因此发送ACK=600。
    • 发送端收到ACK=600后,重新发送600-699的数据。

    逐步确认

    • TCP协议中,接收端每次确认都是基于当前成功接收的数据,并通过ACK通知发送端下一段需要的数据。
    • 这种累积确认机制确保了丢失数据的准确定位和可靠重传。

四次挥手

  1. 第一次挥手:客户端发送FIN包,表示关闭连接,进入终止等待1状态。
  2. 第二次挥手:服务端收到FIN后发送ACK包,进入等待关闭状态;客户端进入终止等待2状态。
    • 服务端此时还可以发送未发送的数据
    • 客户端还可以接受数据
  3. 第三次挥手:服务端传输完数据后发送FIN包,进入最后确认状态。
  4. 第四次挥手:客户端收到FIN包后回复ACK包,进入超时等待状态,确保对方已收到ACK。超时后关闭连接。
为什么需要超时等待?
  • 防止ACK包丢失。
  • 若ACK包丢失,服务端会再次发送FIN包,客户端重发ACK,确保连接关闭。
为什么四次挥手不能减少到三次?

若合并为三次(如服务器收到FIN后立即发FIN+ACK):
■ 服务器可能仍有数据未发送完,导致数据丢失。
■ 客户端无法区分FIN和ACK的合并响应,可能误判连接状态。


相关文章:

  • ubuntu22安装tenserflow0.12.1
  • Java 数据库连接池
  • Mybatis_Plus中的条件构造器和常用接口,插件
  • 【算法手记8】NC95 数组中的最长连续子序列 字母收集
  • AI 只能聊天、生成图片、生成视频吗?
  • 封装了一个iOS多分区自适应宽度layout
  • SQL生成ER图/AI生成ER图,智能生成ER图/在线快速编写ER图
  • 全局安装 Entity Framework Core (EF Core)
  • Redis持久化
  • 当 Windows 10 的 C 盘快满时,可以通过以下方法来释放空间
  • Redis-04.Redis常用命令-字符串常用命令
  • 什么是虚拟机?它们如何工作?
  • Webpack vs Vite:深度对比与实战示例,如何选择最佳构建工具?
  • 知能行综测
  • 算法基础
  • 人工智能:从科幻想象到社会重构的技术革命
  • JAVA反序列化深入学习(十):CommonsBeanutils1
  • 电器维修|基于Java+vue的电器维修系统(源码+数据库+文档)
  • 【踩坑】Mac mini m4 安装 jdk8 失败
  • Pytorch学习笔记(十八)Image and Video - DCGAN Tutorial