TCP通信三次握手、四次挥手

前言

        前面我说到了,UDP通信的实现,但我们经常说UDP通信不可靠,是因为他只会接收和发送,并不会去验证对方收到没有,那么我们说TCP通信可靠,就是因为他会进行验证接收端是否能够接收和发送,并且只有在验证通过的情况下才会发送数据,并且会通过一些操作来保证数据发送的完整性。本小节主要介绍TCP通信过程中如何通过三次握手和四次挥手来保证数据的传输。

一、三次握手

         TCP(Transmission Control Protocol)通信中,三次握手是指在客户端和服务器之间建立可靠连接时的三步过程。这一过程的目的是确保双方都能够准备好进行数据传输,并且能确认彼此的接收和发送能力。视频链接:屏幕录制 2024-09-10 221512-CSDN直播

TCP三次握手的详细过程

  1. 第一次握手:客户端发送SYN包

    • 客户端向服务器发送一个SYN(Synchronize)标志位为1的TCP报文段,表示客户端想要发起连接,并请求同步序列号(Sequence Number)。
    • 在这个阶段,客户端会生成一个初始序列号(ISN,Initial Sequence Number),并将这个序列号放入报文中。
    • 报文格式:SYN = 1, SEQ = xx 是客户端的初始序列号)
  2. 第二次握手:服务器回复SYN-ACK包

    • 服务器收到客户端的SYN报文后,理解到客户端想建立连接。于是,服务器也生成一个自己的初始序列号,并发送一个SYN-ACK(Acknowledgment)报文段回给客户端,表示接收到客户端的连接请求。
    • 在这个SYN-ACK报文中:
      • SYN = 1:表示服务器同意建立连接。
      • ACK = 1:表示确认客户端发出的SYN。
      • ACK序列号:x + 1,表示确认客户端的序列号x
      • 服务器同时也会发送自己的序列号y
    • 报文格式:SYN = 1, ACK = 1, SEQ = y, ACK = x + 1
  3. 第三次握手:客户端发送ACK包

    • 客户端收到服务器的SYN-ACK报文后,确认服务器收到了自己的连接请求,接着客户端发送一个确认报文段(ACK = 1)给服务器,确认服务器的SYN和ACK。
    • 在这个ACK报文中:
      • ACK = 1,表示确认服务器的序列号。
      • ACK序列号:y + 1,表示确认服务器的序列号y
    • 报文格式:ACK = 1, SEQ = x + 1, ACK = y + 1

此时,双方都已经完成了三次握手,客户端和服务器之间的TCP连接已经建立,接下来可以开始数据传输。

 

我们可以这样理解:

客户端需要知道:客户端自己的接收和发送能力;服务器的接收和发送能力;

服务器需要知道:客户端的接收和发送能力;服务器自己的接收和发送能力;

        第一次握手:客户端发送请求,服务器接收请求,这时,服务器知道自己有接收能力;其余能力没有。

        第二次握手:服务器发送信号告诉客户端,自己知道了客户端的连接请求,等到信号传递到客户端之后,这时,客户端知道服务器有接收能力,发送能力;客户端也知道了自己有发送能力,和接收能力,但是服务器不知道客户端有没有接收能力。

        第三次握手:客户端发送信号给服务器表示自己知道了服务器有发送和接收能力,等到服务器接收到信号以后,服务器知道了客户端收到了第二次握手发送的数据,这时,服务器知道客户端有接收能力;

        到此:客户端知道自己有的接收和发送能力;服务器也知道的自己有接收和发送能力;

二、四次挥手

         四次挥手是指在TCP(Transmission Control Protocol)通信中,客户端与服务器之间关闭连接的过程。与三次握手类似,四次挥手也是为了确保双方能够有序地终止连接。由于TCP是全双工通信协议,即通信双方都可以同时发送和接收数据,因此关闭连接时需要双方都同意停止发送和接收数据,整个过程需要四个步骤,称为“四次挥手”。

四次挥手的详细过程

  1. 第一次挥手:客户端发送FIN包

    • 当客户端想要结束数据传输时,它会发送一个**FIN(Finish)**标志位为1的报文,告诉服务器它已经不再发送数据了,但仍然可以接收来自服务器的数据。
    • 这时,客户端进入FIN_WAIT_1状态,等待服务器的响应。
    • 报文格式:FIN = 1, SEQ = xx为当前的序列号)
  2. 第二次挥手:服务器回复ACK包

    • 服务器收到客户端的FIN报文后,回复一个ACK(Acknowledgment)报文,表示它收到了客户端的请求,但此时服务器可能仍然有数据要发送,因此不会立即关闭连接。
    • 服务器发送的ACK报文中的确认号为x + 1,表示确认客户端的序列号x
    • 此时,客户端进入FIN_WAIT_2状态,继续等待服务器的FIN报文,而服务器进入CLOSE_WAIT状态,准备关闭连接。
    • 报文格式:ACK = 1, SEQ = y, ACK = x + 1
  3. 第三次挥手:服务器发送FIN包

    • 当服务器处理完剩余的数据并准备好关闭连接时,它会发送一个FIN报文,通知客户端它也准备结束通信,不再发送数据了。
    • 服务器此时进入LAST_ACK状态,等待客户端的最后确认。
    • 报文格式:FIN = 1, SEQ = yy为服务器当前的序列号)
  4. 第四次挥手:客户端回复ACK包

    • 客户端收到服务器的FIN报文后,回复一个ACK报文,确认服务器已经关闭连接。
    • 发送完ACK报文后,客户端进入TIME_WAIT状态,等待一定的时间(通常为2个最大段寿命时间,2MSL,Maximum Segment Lifetime),以确保服务器收到这个ACK报文后不会重发FIN报文。如果在此期间没有收到任何新数据包,客户端才正式关闭连接,进入CLOSED状态。
    • 服务器收到客户端的ACK报文后,也进入CLOSED状态,连接彻底关闭。
    • 报文格式:ACK = 1, SEQ = x + 1, ACK = y + 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python通过字节串或字节数组加载和保存PDF文档

处理PDF文件的可以直接读取和写入文件系统中的PDF文件,然而,通过字节串(byte string)或字节数组(byte array)来加载和保存PDF文档在某些情况下更高效。这种方法不仅可以提高数据处理的灵活性,允…

怎么能实现VIN码充电吗?针对一个单一的VIN码,设置不同的服务费这种计费模式

为了实现VIN码充电并针对单一VIN码设置不同的服务费这种计费模式,需深入了解VIN码充电的实现过程及技术细节。VIN码充电是一种基于车辆识别号码(VIN)进行充电和计费的方法,适用于新能源汽车的充电桩。具体分析如下: V…

MybatisPlus中@EnumValue注解介绍、应用场景和示例代码

EnumValue注解详细介绍 功能概述: EnumValue注解标记在枚举类型的字段上,表示该字段是枚举值在数据库中存储的实际值。这对于枚举的持久化是关键,确保枚举在数据库中的表示与Java枚举类的一致性。 主要用途: 字段指定:…

网络学习-eNSP配置NAT

NAT实现内网和外网互通 #给路由器接口设置IP地址模拟实验环境 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]interface gigabitethernet 0/0/0 [Huawei-Gigabi…

告别繁琐,IsMyHdOK硬盘测速,即刻享受科技便利

快节奏的生活因科技而精彩纷呈&#xff0c;它赋予我们超越时空的能力&#xff0c;让工作与家庭的天平在忙碌中依然保持平衡——而面对数据爆炸的时代&#xff0c;硬盘作为数据存储与交换的核心部件&#xff0c;其性能直接影响到我们的工作效率和体验。正是在这样的背景下&#…

基于Service Worker实现WebRTC局域网大文件传输能力

基于Service Worker实现WebRTC局域网大文件传输能力 Service Worker是一种驻留在用户浏览器后台的脚本&#xff0c;能够拦截和处理网络请求&#xff0c;从而实现丰富的离线体验、缓存管理和网络效率优化。请求拦截是其关键功能之一&#xff0c;通过监听fetch事件&#xff0c;S…

Python面试常见问题及详细解答:从基础到高级概念全覆盖

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 以下是Python面试中常见的一些问题及其详细答案的整理&#xff1a; 1. Python的可变与不可变对象 问题: 什么是可变对象和不可变对象&#xff1f;举例说明。答案: 可变对象: 可以在原地…

iOS 知识点记录

王巍 博客地址:OneVs Den git地址:onevcat (Wei Wang) GitHub 江湖人称喵神,目前就职于line。喵神的博客涉及方面比较广, 有Obejctive-C, Swift, SwiftUI, Unity等等。博客内容很有深度,非常值得关注。 戴铭 博客地址:戴铭的博客 git地址:ming1016 (戴铭) GitHub 《i…

C# 排序算法之冒泡排序

冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。这个算法…

在Webmin上默认状态无法正常显示 Mariadb V11.02及以上版本

OS: Armbian OS 24.5.0 Bookworm Mariadb V11.02及以上版本 Webmin&#xff1a;V2.202 非常小众的问题&#xff0c;主要是记录一下。 如题 Webmin 默认无法 Mariadb V11.02及以上版本 如果对 /etc/webmin/mysql/config 文件作相应调整就可以再现Mariadb管理界面。 路径文件&am…

Mamba模型学习笔记

笔记来源&#xff1a;bilibili Transformer 的死穴 Transformer 结构的核心是自注意力机制层&#xff0c;无论是 encoder 还是 decoder&#xff0c;序列数据都先经过位置编码后喂给这个模块。 但是自注意力机制的计算范围仅限于窗口内&#xff0c;而无法直接处理窗口外的元素…

java spring定时任务-动态任务

cron表达式 在线生成https://cron.qqe2.com/ 6个时间刻度的话 * * * * * * 分别对应 秒 分 时 日 月 星期 &#xff1b; 7个时间刻度的话 * * * * * * * 分别对应 秒 分 时 日 月 星期 年&#xff1b;每隔5秒执行一次&#xff1a;*/5 * * * * ? 每隔1分钟执行一次&#xff1a…

kubectl的安装使用

1. Windows下载kubectl 2.将kucectl的所在目录添加到PATH环境变量下 3.运行 kubectl version --client 命令来测试kubectl是否正确安装并显示其版本信息。这个命令会显示kubectl客户端的版本信息&#xff0c;如果一切正常&#xff0c;这将确认kubectl已经成功安装在你的Windo…

Jon Myers:颠覆性的技术与市场开发

DataShapesAI 是一家设计和交付下一代硬件无关的AI技术的科技公司&#xff0c;解决了世界上最紧迫的问题之一&#xff1a;无论是在海上、太空还是陆地上&#xff0c;任何需要的地方的无线电频谱态势感知。他们的创新文化引领着公司的使命&#xff0c;为政府和商业客户带来数据驱…

基于SSM的汽车租赁系统+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

2024数学建模国赛B题代码

B题已经完成模型代码&#xff01;详情查看文末名片 问题1&#xff1a;可以考虑使用统计学中的“样本量估算”方法&#xff0c;使用二项分布或正态近似来决定最少的样本量&#xff0c;并通过假设检验&#xff08;如单侧检验&#xff09;在95%和90%置信度下进行判断。 import n…

鸿蒙HarmonyOS应用开发者高级认证重点知识详解

✍️作者简介&#xff1a;小北编程&#xff08;专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f…

骑砍模型修改逻辑

这篇博客用作日志的性质。 一&#xff0c;在自定义战场中测试自己制作好的地图 1、将制作好的地图保存到Mount & Blade II Bannerlord\Modules\SandBoxCore\SceneObj内 2、用Notepad打开 \Mount & Blade II Bannerlord\Modules\CustomBattle\ModuleData\custom_battl…

MongoDB设置系统服务启动教程

1、编辑mongodb.service文件 将MongoDB设置成系统服务&#xff0c;就可以通过systemctl进行启动停止重启&#xff0c;在目录/etc/systemd/system下编写mongodb.service文件&#xff1a; [Unit] DescriptionMongoDB Database Server Documentationhttps://www.mongodb.com/docs…

147.最小栈

题目 链接&#xff1a;leetcode链接 思路 这道题目做起来还是比较简单的&#xff0c;使用两个栈就可以实现题目要求。 其中一个栈s实现栈的基本功能&#xff0c;另一个栈mins实现检索最小元素的功能。 来看一下怎么样实现检索最小元素的功能呢&#xff1f; 我们可以这么…