说说TCP传输的三次握手四次挥手策略

embedded/2024/11/17 0:53:26/

TCP(传输控制协议)是一个面向连接、可靠的传输层协议。在建立和关闭连接时,TCP使用“三次握手”和“四次挥手”机制来确保可靠的通信。下面我们详细讲解这两个过程:

一、三次握手(TCP连接建立)

三次握手是建立TCP连接的过程,目的是确保客户端和服务器之间的连接是可靠的。通过三次握手,双方能够确认彼此的接收和发送能力,以及初始的序列号。

三次握手的过程:
  1. 第一次握手 — 客户端发送SYN请求:

    • 客户端发送一个SYN(同步序列编号)报文段到服务器,表示客户端希望建立连接。此时客户端进入 SYN_SENT 状态,等待服务器的响应。
    • SYN报文段中会包含客户端的初始序列号(Seq=Client_ISN),并且SYN标志位被设置为1。
  2. 第二次握手 — 服务器回应SYN-ACK:

    • 服务器收到客户端的SYN报文后,服务器会发送一个SYN-ACK报文段给客户端,表示同意建立连接。此时,服务器进入 SYN_RECEIVED 状态,等待客户端的确认。
    • 该报文中会包含服务器的初始序列号(Seq=Server_ISN),并且ACK标志位被设置为1,表示确认收到客户端的SYN请求(Ack=Client_ISN+1)。服务器还会发送自己的SYN请求。
  3. 第三次握手 — 客户端确认:

    • 客户端收到服务器的SYN-ACK报文后,客户端会发送一个ACK报文段来确认收到服务器的SYN-ACK。此时,客户端进入 ESTABLISHED 状态,表示连接已经建立。
    • 该报文段的序列号为 Seq=Client_ISN+1,ACK字段值为 Ack=Server_ISN+1。客户端发送完毕后,服务器也进入 ESTABLISHED 状态,连接建立完成。

通过这三次握手,客户端和服务器都能确认彼此的接收能力,并且同步序列号,确保数据传输的可靠性。

总结:
  • 第一次:客户端发送SYN请求,服务器收到后回SYN-ACK;
  • 第二次:服务器返回SYN-ACK,客户端确认;
  • 第三次:客户端确认,连接建立。

二、四次挥手(TCP连接关闭)

四次挥手是TCP连接的终止过程。由于TCP是全双工的连接,每一方向的关闭都需要独立处理。四次挥手的目的是确保双方能够完成数据的传输,优雅地关闭连接。

四次挥手的过程:
  1. 第一次挥手 — 客户端发送FIN:

    • 客户端发送一个FIN(结束连接)报文段,表示客户端已经没有数据发送到服务器了。此时,客户端进入 FIN_WAIT_1 状态。
    • 此时客户端请求关闭连接,但仍然可以接收数据。
  2. 第二次挥手 — 服务器回应ACK:

    • 服务器收到客户端的FIN报文后,表示已经接收到客户端关闭连接的请求。服务器会返回一个ACK报文段,确认客户端的FIN报文。此时,服务器进入 CLOSE_WAIT 状态。
    • 服务器的ACK报文段的 Ack=Client_SEQ+1,表明服务器已接收到客户端的关闭请求。
  3. 第三次挥手 — 服务器发送FIN:

    • 服务器发送一个FIN报文段,表示服务器端的数据也传输完毕,准备关闭连接。此时,服务器进入 LAST_ACK 状态。
    • 此时服务器告诉客户端它已经没有数据要发送了,请求客户端关闭连接。
  4. 第四次挥手 — 客户端回应ACK:

    • 客户端收到服务器的FIN报文后,发送一个ACK报文段来确认。此时客户端进入 TIME_WAIT 状态,等待一段时间,以确保服务器收到ACK报文后再完全关闭连接。
    • 客户端的ACK报文的序列号为 Ack=Server_SEQ+1。此时,客户端可以关闭连接,进入 CLOSED 状态。

    TIME_WAIT状态:客户端在发送完最后的ACK报文后,会进入 TIME_WAIT 状态,通常会持续2倍的最大报文生存时间(MSL,Maximum Segment Lifetime),目的是确保服务器能够收到ACK报文,避免重复的数据包影响新连接。

总结:
  • 第一次:客户端发送FIN,表示请求关闭;
  • 第二次:服务器回复ACK,确认关闭;
  • 第三次:服务器发送FIN,表示数据发送完毕;
  • 第四次:客户端回复ACK,连接完全关闭。

为什么需要四次挥手?

TCP连接是全双工的,客户端和服务器各自都可以独立地发送和接收数据。因此,当客户端或服务器中的一方决定关闭连接时,需要确保另一方还有时间来完成数据的发送,避免丢失数据。此外,TIME_WAIT 状态可以防止连接关闭后的老数据包干扰新的连接。

总结

  • 三次握手:用于建立TCP连接,确保双方都准备好进行数据传输,并且能够同步初始的序列号。
  • 四次挥手:用于正常终止TCP连接,确保双方都能完成剩余数据的发送和接收,并且优雅地关闭连接。

这两种机制是TCP协议提供的可靠性保障,确保在连接的建立与关闭过程中不会丢失数据或出现通信错误。


http://www.ppmy.cn/embedded/138136.html

相关文章

我的docker随笔45:在龙芯平台安装docker

本文介绍在龙芯平台安装docker。 前言 2017年下半年开始接触docker时,那会李大锤刚刚会爬,而今年(2024年)下半年,李大锤已经是一个经常考得C并且经常和妹妹吵架的二年级学生了。这么多年就过去,docker一直…

Rust 数据类型

Rust 数据类型 Rust 是一种系统编程语言,以其内存安全性、速度和并发性而闻名。Rust 的设计理念是“零成本抽象”,这意味着它提供了高级语言的便利性,同时保持了接近低级语言的性能。Rust 的数据类型系统是其核心特性之一,它包括了几种不同的类型,用于处理各种编程场景。…

oneplus6-编译-LineageOS-19.1-android12

lineage-19.1/oneplus6-build.md 修复内核崩溃 经过此两修改后, 编译出的OTA包 刷入手机, 手机重启正常越过logo 进入android, 但卡在LineageOS-19的弧形进度界面, 没有此两修改时, 根本进不到android, 只到开机logo就黑屏 亮呼吸灯 , 串口处于900E(高通ramdump模式), 因此…

CSS Module:告别类名冲突,拥抱模块化样式(5)

CSS Module 是一种解决 CSS 类名冲突的全新思路。它通过构建工具(如 webpack)将 CSS 样式切分为更加精细的模块,并在编译时将类名转换为唯一的标识符,从而避免类名冲突。本文将详细介绍 CSS Module 的实现原理和使用方法。 1. 思…

第三次作业

1.在/home中创建一个名为 file1.txt 的文件,并设置权限为:所有者和组成员可以读写,但其他人只能读。 [rootlocalhost home]# touch file1.txt [rootlocalhost home]# ll -rw-r--r--. 1 root root 0 11月 11 23:06 file1.txt [rootlo…

深入探索Waymo自动驾驶技术发展:从DARPA挑战赛到第五代系统的突破

引言 自动驾驶技术正引领着未来出行方式的革命,而Waymo作为全球自动驾驶领域的先锋,始终走在技术发展的最前沿。本文基于Waymo联席CEO德米特里多尔戈夫(Dmitri Dolgov)在No Priors节目中的访谈,全面介绍Waymo的技术发展…

【EasyExcel等比例缩小导出图片】

EasyExcel等比例缩小导出图片 一、背景二、思路三、代码 一、背景 使用EasyExcel导出excel文件,但是需要同时导出图片信息,且图片信息不能影响行高和单元格宽度,图片本身被导出时,不能因为压缩导致图片变形 二、思路 使用EasyE…

Tomcat 8.5 源码导读

Tomcat 是一个流行的开源 Java Servlet 容器,负责执行 Java Servlets 和呈现 Web 应用程序。Tomcat 8.5 是一个常用版本,理解其核心代码对于开发和运维人员来说非常重要。下面是对 Tomcat 8.5 核心代码的一些关键部分的导读: 1. 启动过程 B…