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

“三次握手”与“四次挥手”:TCP传输控制协议连接过程

目录

什么是TCP协议

“三次握手”建立连接

“四次挥手”断开连接

“三次握手”和“四次挥手”的反思

总结


什么是TCP协议

想象一下,你和远方的朋友要进行一场电话交流,但这通电话不仅仅是随便聊聊,而是要传递一封重要的信件。为了确保这封信能够完整、准确地传递,你们制定了一系列规则,比如谁先说、如何确认对方听到了、如果听不清怎么办。这些规则,就像是TCP协议(Transmission Control Protocol,传输控制协议)在计算机网络中的作用。

TCP的基本概念

TCP 是一种面向连接的、可靠的基于流的传输协议,运行在传输层。它主要用于确保数据能完整、准确地从一台计算机传输到另一台计算机,即使网络环境并不稳定。

简单理解:

  • 面向连接:就像打电话一样,TCP 需要在数据传输前先建立一条稳定的通信线路(连接)。
  • 可靠传输:TCP 确保数据不会丢失、不会重复、不会乱序,就像你确保信件被完整送达。
  • 流式传输:TCP 以数据流的方式传输数据,而不是像快递那样一次性把所有内容打包。

“三次握手”建立连接

在TCP通信开始前,必须先建立连接,这就像是打电话时要先拨号、等待对方接听,然后确认对方能听清楚。

当客户端(Client)和服务器(Server)建立TCP连接时,会经历“三次握手”过程。其目的是:

确保客户端和服务器都具备发送和接收能力。

协商初始序列号(ISN,Initial Sequence Number),防止数据包混乱。

假设客户端A想要与服务器B建立连接:

第一次握手(SYN)

  • 客户端A发送一个 SYN(同步)数据包给服务器B,请求建立连接。
  • 该数据包包含:
    • SYN=1(表示请求建立连接)
    • 初始序列号 ISN(A)(用于数据传输的编号,防止乱序)
  • 这时,客户端A进入 SYN_SENT(同步已发送) 状态。

第二次握手(SYN-ACK)

  • 服务器B收到SYN请求后,回应一个 SYN-ACK(同步-确认)数据包。
  • 该数据包包含:
    • SYN=1(表示服务器同意建立连接)
    • ACK=1(表示确认收到客户端的SYN请求)
    • 服务器的初始序列号 ISN(B)
    • 确认号 ACK=ISN(A)+1(表示已收到客户端的SYN)
  • 服务器B进入 SYN_RECV(同步已收到) 状态。

第三次握手(ACK)

  • 客户端A收到服务器B的SYN-ACK后,发送一个 ACK(确认)数据包。
  • 该数据包包含:
    • ACK=1(确认连接)
    • 序列号 = ISN(A)+1
    • 确认号 ACK=ISN(B)+1(表示已收到服务器的SYN)
  • 服务器B收到ACK后,连接正式建立,双方进入 ESTABLISHED(已建立) 状态。

至此,TCP连接成功建立,双方可以开始数据传输。

TCP如何保证数据可靠传输?

TCP 采用了多个机制来确保数据不会丢失、不会重复、不会乱序。

数据包的编号与确认

每个TCP数据包都会有一个序列号(Sequence Number),而接收方会发送确认号(Acknowledgment Number) 来确认收到的数据。

例如:客户端发送 Seq=1000 的数据包,服务器收到后,会回复 Ack=1001,表示已成功接收。

如果服务器没有收到这个数据包,它不会发送 Ack=1001,这样客户端就知道数据丢失了,需要重新发送。

超时重传

如果客户端发送了数据包,但一直没有收到确认(ACK),就会在一定时间后重发数据,直到对方确认收到。

  • 这类似于寄快递时,如果包裹长时间未送达,快递员可能会重新派送。

流量控制

TCP 允许接收方通过滑动窗口机制控制数据发送速度,避免发送方数据过快而接收方处理不过来。

例如:如果服务器处理能力有限,它可以告诉客户端“慢点发,我忙不过来了”,客户端就会降低发送速度。

拥塞控制

当网络拥堵时,TCP 会自动降低发送速率,以防止网络进一步恶化。

这就像高速公路上遇到堵车时,大家会自动放慢速度,避免发生更严重的交通事故。

“四次挥手”断开连接

当通信结束时,TCP使用“四次挥手”来关闭连接。其目的是:

  1. 确保双方都完成数据传输后,安全地关闭连接。
  2. 防止数据丢失,确保所有数据包都被正确接收。

假设客户端A想要断开与服务器B的TCP连接:

第一次挥手(FIN)

  • 客户端A发送 FIN(终止)数据包,表示“我不想再发送数据了”。
  • 该数据包包含:
    • FIN=1(请求关闭连接)
    • 序列号 seq=U(U是当前数据序列号)
  • 客户端A进入 FIN_WAIT_1(终止等待1) 状态。

第二次挥手(ACK)

  • 服务器B收到FIN后,发送一个 ACK(确认)数据包。
  • 该数据包包含:
    • ACK=1(确认关闭请求)
    • 序列号 = V
    • 确认号 ACK=U+1(确认收到FIN)
  • 服务器B进入 CLOSE_WAIT(关闭等待) 状态,等待完成剩余的数据传输。
  • 客户端A进入 FIN_WAIT_2(终止等待2) 状态,等待服务器B发送FIN。

第三次挥手(FIN)

  • 服务器B数据传输完成后,主动发送 FIN(终止)数据包,表示“我也不想再发送数据了”。
  • 该数据包包含:
    • FIN=1(请求关闭)
    • 序列号 seq=W
  • 服务器B进入 LAST_ACK(最后确认) 状态,等待客户端的最后ACK。

第四次挥手(ACK)

  • 客户端A收到服务器B的FIN后,发送一个 ACK(确认)数据包,表示“确认关闭”。
  • 该数据包包含:
    • ACK=1(确认关闭请求)
    • 序列号 = X
    • 确认号 ACK=W+1(确认收到FIN)
  • 服务器B收到ACK后,立即进入 CLOSED(关闭) 状态,释放连接。
  • 客户端A等待 TIME_WAIT(通常是2倍的MSL时间,默认240秒)后,最终进入 CLOSED 状态,连接彻底关闭。

至此,TCP连接完全关闭,确保所有数据包已经被正确处理。

“三次握手”和“四次挥手”的反思

为什么 TCP 需要三次握手,而不是两次?

两次握手可能会导致已失效的 SYN 报文被服务器误认为是新的连接,从而建立了一个无效连接。而三次握手可以确保双方都明确对方的接收和发送能力。例如,客户端发出的 SYN 因为网络问题被延迟,服务器收到后认为是新的连接请求并建立连接,但客户端并不知情,导致连接状态不同步。
三次握手能够确保:

客户端确认服务器的 接收能力

服务器确认客户端的 接收能力

双方都确认了彼此的 发送和接收能力,确保连接有效。

为什么 TCP 需要四次挥手,而不是三次?
因为 TCP 是全双工通信,数据的发送和接收是独立的,一方发出 FIN 只表示它不再发送数据,但仍然可以接收数据,所以另一方要单独再发送 FIN 以表示自己也不再发送数据,这就导致了四次挥手。

为什么A在TIME-WAIT状态必须等待2MSL的时间
MSL最长报文段寿命Maximum Segment Lifetime,MSL=2
这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,而A能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则B无法正常进入到CLOSED状态。
总结:

  • 确保 B 已经收到 A 的最后一个 ACK,若 B 没收到,会重发 FIN,A 需要有时间处理。
  • 防止历史连接中的旧报文在网络中滞留,影响后续新的连接。

总结

三次握手(TCP 连接建立)

A -> B(SYN):A 发送 SYN 报文,表示请求建立连接,进入 SYN-SENT 状态。

B -> A(SYN-ACK):B 收到 SYN 后,发送 SYN-ACK 报文,表示同意建立连接,进入 SYN-RECEIVED 状态。

A -> B(ACK):A 收到 SYN-ACK 后,发送 ACK 报文,B 进入 ESTABLISHED 状态,A 也进入 ESTABLISHED 状态,连接建立完成。

四次挥手(TCP 连接释放)

A -> B(FIN):A 发送 FIN 报文,表示不再发送数据,进入 FIN-WAIT-1 状态。

B -> A(ACK):B 收到 FIN 后,发送 ACK,表示确认,进入 CLOSE-WAIT 状态;A 收到 ACK 后,进入 FIN-WAIT-2 状态。

B -> A(FIN):B 处理完剩余数据后,发送 FIN 报文,进入 LAST-ACK 状态。

A -> B(ACK):A 收到 FIN 后,发送 ACK 报文,进入 TIME-WAIT 状态,等待 2MSL;B 收到 ACK 后,进入 CLOSED 状态。

A 进入 CLOSED 状态:等待计时器 2MSL 结束后,A 进入 CLOSED 状态,连接彻底关闭。

相关文章:

“三次握手”与“四次挥手”:TCP传输控制协议连接过程

目录 什么是TCP协议 “三次握手”建立连接 “四次挥手”断开连接 “三次握手”和“四次挥手”的反思 总结 什么是TCP协议 想象一下,你和远方的朋友要进行一场电话交流,但这通电话不仅仅是随便聊聊,而是要传递一封重要的信件。为了确保这…...

OpenCV形态学操作

1.1. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…...

深入理解WebSocket接口:如何使用C++实现行情接口

在现代网络应用中,实时数据传输变得越来越重要。通过WebSocket,我们可以建立一个持久连接,让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度,还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…...

汇能感知的光谱相机/模块产品有哪些?

CM020A 分辨率:1600H1200V 光谱范围:350~950nm 光谱分辨率:1nm 接口:USB2.0 帧率:16001200 (6帧) 输出格式:Raw 8bit FOV:D73.5H58.8V44.1 相机尺寸:505055mm VM02S10 分辨率…...

抓包工具是什么?

抓包工具是一种用于捕获和分析网络数据包的软件或硬件设备。它可以帮助用户监控网络通信过程,查看网络中传输的数据内容、协议类型、源地址、目的地址等信息。以下是关于抓包工具的一些详细解释: 1. 主要功能 捕获数据包:抓包工具能够实时捕…...

Kubernetes的Ingress 资源是什么?

在Kubernetes中,Ingress资源是一种用于管理集群外部对内部服务访问的API对象,主要用于将不同的外部请求路由到集群内的不同服务,以下是关于它的详细介绍: 定义与作用 Ingress资源定义了从集群外部到内部服务的HTTP和HTTPS路由规…...

【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致

业务场景 发布信息,更新到数据库MySQLCOS操作,更新JSON文件 不过可能存在幂等性和数据一致性的问题。 // 批量存MySQL entityPublishService.saveOrUpdateBatch(entityPublishList); // 遍历批量存COS对象存储searchEntitys.forEach(req -> {//删除…...

DevOps自动化部署详解:从理念到实践

在软件开发日益快速迭代的今天,如何以高效、稳定且可重复的方式将代码变更从开发环境自动部署到生产环境成为企业竞争的重要因素。DevOps 正是在这一背景下应运而生,它打破开发、测试、运维之间的壁垒,通过自动化工具和流程,实现持…...

LeetCodehot 力扣热题100

class Solution { public:int max_sum INT_MIN; // 初始化为最小值,确保能够处理所有可能的路径和int maxPathSum(TreeNode* root) {dfs(root);return max_sum;}int dfs(TreeNode* root) {if (root nullptr) return 0; // 如果是空节点,返回0// 递归…...

解锁 AIoT 无限可能,乐鑫邀您共赴 Embedded World 2025

2025 年 3 月 11-13 日,全球规模最大的嵌入式展览会——Embedded World 2025 将在德国纽伦堡盛大开幕。作为物联网和嵌入式技术领域的领先企业,乐鑫信息科技 (688018.SH) 将展示在 AI LLM、HMI、双频 Wi-Fi 6、低功耗 MCU 和 Matter 等领域的最新技术及解…...

C# 背景 透明 抗锯齿 (效果完美)

主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll,同时定义了一些结构体来配合这些 API 函数的使用,常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大,抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…...

Debezium:实时数据捕获与同步的利器

一、什么是 Debezium Debezium 是一个开源的分布式平台,专门用于捕获数据库中的数据变更。它通过读取数据库的事务日志,能够以非侵入性的方式捕获数据库中发生的所有变化,并将这些变化转化为事件流,实时推送到像 Kafka 这样的消息…...

Word中接入大模型教程

前言 为什么要在word中接入大模型呢? 个人觉得最大的意义就是不用来回切换与复制粘贴了吧。 今天分享一下昨天实践的在word中接入大模型的教程。 在word中接入大模型最简单的方式就是使用vba。 vba代码要做的事,拆分一下就是: 获取用户…...

Centos修改ip

1 查看ip [rootlocalhost ~]# ip addr2 root账号修改ip [rootlocalhost ~]# su [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ [rootlocalhost network-scripts]# llvi编辑ifcfg-ens33 3 重启网卡 [rootlocalhost network-scripts]# systemctl restart network...

uni-app小程序开发 基础知识2

目标&#xff1a; 构建一个文章发表平台。 我们先来写一个静态框架。 以下是 首页初代码文章列表页代码&#xff1a; <template><view class"content"><!-- 轮播图 --><swiper class"swiper-container" autoplay"true"…...

第4章 4.1 Entity Framework Core概述

4.1.1 什么是ORM ORM (object tralstional mapping ,对象关系映射)中的“对象”指的就是C#中的对象&#xff0c;而“关系”是关系型数据库&#xff0c;“映射”指搭建数据库与C#对象之间的“桥梁”。 比如使用ORM &#xff0c;可以通过创建C#对象的方式把数据插入数据库而不需…...

在 Spring Boot 中使用 `@Autowired` 和 `@Bean` 注解

文章目录 在 Spring Boot 中使用 Autowired 和 Bean 注解示例背景 1. 定义 Student 类2. 配置类&#xff1a;初始化 Bean3. 测试类&#xff1a;使用 Autowired 注解自动注入 Bean4. Spring Boot 的自动装配5. 总结 在 Spring Boot 中使用 Autowired 和 Bean 注解 在 Spring Bo…...

Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好?

Langchain vs. LlamaIndex&#xff1a;哪个在集成MongoDB并分析资产负债表时效果更好&#xff1f; 随着大语言模型&#xff08;LLM&#xff09;在实际应用中的普及&#xff0c;许多开发者开始寻求能够帮助他们更高效地开发基于语言模型的应用框架。在众多框架中&#xff0c;La…...

Java 中的内存泄漏问题及解决方案

在 Java 中&#xff0c;内存泄漏&#xff08;Memory Leak&#xff09;是指在程序运行过程中&#xff0c;某些对象已经不再使用&#xff0c;但由于引用仍然存在&#xff0c;这些对象无法被垃圾回收器回收&#xff0c;从而导致内存无法释放&#xff0c;最终可能导致系统性能下降甚…...

VS Code 如何搭建C/C++开发环境

目录 1.VS Code是什么 2. VS Code的下载和安装 2.1 下载和安装 2.2.1 下载 2.2.2 安装 2.2 环境的介绍 2.3 安装中文插件 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 3.1.1 下载 3.1.2 配置 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编写…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...