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…

网络学习-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;其性能直接影响到我们的工作效率和体验。正是在这样的背景下&#…

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…

在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…

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

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

鸿蒙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…

147.最小栈

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

希尔排序

一&#xff1a;基本思想 先选定一个整数gap&#xff0c;把待排序文件中所有记录分成个组&#xff0c;按照所有距离为整数gap的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&#xff0c;通过整数gap逐渐变小&#xff0c;重复上述分组和排序的工作。当整数gap…

Python全网最全基础课程笔记(七)——列表,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

本专栏系列为Pythong基础系列&#xff0c;每篇内容非常全面&#xff0c;包含全网各个知识点&#xff0c;非常长&#xff0c;请耐心看完。 每天都会更新新的内容&#xff0c;搜罗全网资源以及自己在学习和工作过程中的一些总结&#xff0c;可以说是非常详细和全面。 以至于为什么…

怎样给U盘加密?看这里!30s学会四种方法,保护你的数据安全!

在一家中型科技公司里&#xff0c;一名员工将包含重要项目资料的U盘遗忘在咖啡店的桌子上。该U盘内存有公司尚未公开的新产品设计图纸、客户信息以及财务报告等敏感数据。几小时后&#xff0c;这个未加密的U盘被一名陌生人拾到并插入其电脑中查看&#xff0c;机密信息被上传到网…

erlang学习: Mnesia Erlang数据库

创建Mnesia数据库 mnesia:create_schema([node()]).在shell里输入该行代码即可创建一个mnesia数据库于当前文件夹下 编译器文件路径下同样也有 数据库表定义创建 之后是数据库表定义&#xff0c;打开数据库创建完成后&#xff0c;启动数据库&#xff0c;添加一些表定义&…

Ubuntu22.04安装nginx

1.安装nginx 首先&#xff0c;更新你的包索引&#xff1a; sudo apt update 安装必要的软件包以允许apt通过HTTPS使用仓库&#xff1a; sudo apt install ca-certificates curl gnupg lsb-release 添加Nginx官方的GPG密钥&#xff1a; curl -fsSL https://nginx.org/keys/ng…

JavaScript练手小技巧:利用鼠标滚轮控制图片轮播

近日&#xff0c;在浏览网站的时候&#xff0c;发现了一个有意思的效果&#xff1a;一个图片轮播&#xff0c;通过上下滚动鼠标滚轮控制图片的上下切换。 于是就有了自己做一个的想法&#xff0c;顺带复习下鼠标滚轮事件。 鼠标滚轮事件&#xff0c;参考这篇文章&#xff1a;…