三次握手四次挥手

第一次握手
A 创建本地的传输控制模块 TCB,然后创建一个 TCP 报文段,报文段中:

SYN = 1 同步控制位(=1 时候不能携带数据)
seq = x;序号,供 B 确认
由于此时 SYN 为 1,不能给携带数据,但是要消耗掉一个序号 seq,发送完以后客户端进入 SYN-SENT(同步已发送) 状态

第二次握手
B 在接收到 A 传来的建立连接请求以后,如果是同意建立连接,则会给 A 响应以确认自己同意建立连接,报文段如下:

SYN = 1 同步控制位(=1 时候不能携带数据)
ACK = 1 确认控制位
ack = x + 1 在 A 传来的序号 x 基础上+1,以确认
seq = y 创建自己的 序号 y,供 A 去确认

这一步主要是添加了 ACK =1 ,表示确认有效,然后再把 A 传来的 x 值加一,以供 A 去确认,再创建一个自己的序号 y。
最终把 TCP 报文传递给 A,B 进入 SYN-RCVD(同步收到) 状态。

第三次握手
A 在接收到 B 传来的 TCP 报文以后,还需要再次向 B 确认,

ACK = 1
ack = y + 1
seq = x + 1

此时把 ACK = 1表示确认,然后把 B 传来的 seq +1 作为确认序号 ack ,消耗自己的序号数 seq = x+1,
这个时候没有 SYN 控制位,此 TCP 是可以携带数据,但是会消耗自己的序号,如果不携带数据的话,不会消耗自己的序号,
等到下次数据传输的时候seq 还是 x+1,这个时候 TCP 连接已经建立,A进入ESTAB-LISHED(已建立连接)状态。

当 B 收到 A 传来的 TCP 报文的时候,也进入ESTAB-LISHED(已建立连接)状态。

第一次挥手
当客户端 A 没有数据要和服务器 B 交互的时候,就会发送一个 TCP 报文,

FIN = 1 标志着要断开此 TCP 连接
seq = u ;u 等于前面已经传送过数据的最后一个字节的序号 +1

A 发送了这个 TCP 报文以后就进入了 FIN-WAIT1(终止等待 1)状态,等待 B 的确认,这里要注意的是:即使 FIN 报文段不携带数据,也会将序号消耗掉一个。

第二次挥手
B 接收到 A 发来的请求终止 TCP 连接的报文以后,要回复给 A 一个确认报文,

ACK = 1 ;ACK =1 表示确认
ack = u+1 ;把 A 传来的 u 加 1 以后,通过确认序号返回给 A
seq = v ;自身前面已经传送过的数据的最后一个字节的需要+1 以后作为本次序号传递给 A

B 发送完了本次确认报文以后就进入了 CLOSE-WAIT(关闭等待)状态,这时的 TCP 连接处于半关闭状态,
即:A 没有数据要发送给 B,但是 B 还是有可能发送数据给 A 的,这个时候 A 仍然会对 B 发送的数据进行接收。

A 收到 B 传来的确认报文以后,就进入了 FIN-WAIT-2(终止等待 2) 状态,等待 B 发送最后的连接关闭报文

第三次挥手
这个时候发生在 B 也没有数据要发送给 A 了,这时 B 要发送报文告诉 A,B 自身也要关闭连接。

FIN = 1; 关闭连接控制位
ACK = 1; 确认控制位
seq = w; 如果在第二次握手以后 B 没有发送数据,那么 w = v,如果发生了数据发送,就 w > v
ack = u+1;重复发送上次发送的 u+1确认序号。

此时 B 发送了以后自身进入了LAST-ACK(最后确认)状态,等待 A 的确认

第四次挥手
A 在收到 B 的请求关闭连接的报文以后,在确认报文段中将 ACk 置为 1,表示确认,并给 B 回复:

ACK = 1;确认控制位
ack = w+1;确认序号为 B 发来的 w+1
seq = u+1;自身的序号+1

A 在发送了最后的报文以后,自身就进入了TIME-WAIT(时间等待)状态,此时的 TCP 连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间 2MSL 以后 A 才会进入到 CLOSED 状态。

只要 B 接收到 A 发来的确认报文,就进入了 CLOSED 状态,但是由于 A 要再发送报文以后等待一段时间才会关闭,所以B 的关闭会比 A 早一点。
第一次握手
A 创建本地的传输控制模块 TCB,然后创建一个 TCP 报文段,报文段中:

SYN = 1 同步控制位(=1 时候不能携带数据)
seq = x;序号,供 B 确认
由于此时 SYN 为 1,不能给携带数据,但是要消耗掉一个序号 seq,发送完以后客户端进入 SYN-SENT(同步已发送) 状态

第二次握手
B 在接收到 A 传来的建立连接请求以后,如果是同意建立连接,则会给 A 响应以确认自己同意建立连接,报文段如下:

SYN = 1 同步控制位(=1 时候不能携带数据)
ACK = 1 确认控制位
ack = x + 1 在 A 传来的序号 x 基础上+1,以确认
seq = y 创建自己的 序号 y,供 A 去确认

这一步主要是添加了 ACK =1 ,表示确认有效,然后再把 A 传来的 x 值加一,以供 A 去确认,再创建一个自己的序号 y。
最终把 TCP 报文传递给 A,B 进入 SYN-RCVD(同步收到) 状态。

第三次握手
A 在接收到 B 传来的 TCP 报文以后,还需要再次向 B 确认,

ACK = 1
ack = y + 1
seq = x + 1

此时把 ACK = 1表示确认,然后把 B 传来的 seq +1 作为确认序号 ack ,消耗自己的序号数 seq = x+1,
这个时候没有 SYN 控制位,此 TCP 是可以携带数据,但是会消耗自己的序号,如果不携带数据的话,不会消耗自己的序号,
等到下次数据传输的时候seq 还是 x+1,这个时候 TCP 连接已经建立,A进入ESTAB-LISHED(已建立连接)状态。

当 B 收到 A 传来的 TCP 报文的时候,也进入ESTAB-LISHED(已建立连接)状态。

第一次挥手
当客户端 A 没有数据要和服务器 B 交互的时候,就会发送一个 TCP 报文,

FIN = 1 标志着要断开此 TCP 连接
seq = u ;u 等于前面已经传送过数据的最后一个字节的序号 +1

A 发送了这个 TCP 报文以后就进入了 FIN-WAIT1(终止等待 1)状态,等待 B 的确认,这里要注意的是:即使 FIN 报文段不携带数据,也会将序号消耗掉一个。

第二次挥手
B 接收到 A 发来的请求终止 TCP 连接的报文以后,要回复给 A 一个确认报文,

ACK = 1 ;ACK =1 表示确认
ack = u+1 ;把 A 传来的 u 加 1 以后,通过确认序号返回给 A
seq = v ;自身前面已经传送过的数据的最后一个字节的需要+1 以后作为本次序号传递给 A

B 发送完了本次确认报文以后就进入了 CLOSE-WAIT(关闭等待)状态,这时的 TCP 连接处于半关闭状态,
即:A 没有数据要发送给 B,但是 B 还是有可能发送数据给 A 的,这个时候 A 仍然会对 B 发送的数据进行接收。

A 收到 B 传来的确认报文以后,就进入了 FIN-WAIT-2(终止等待 2) 状态,等待 B 发送最后的连接关闭报文

第三次挥手
这个时候发生在 B 也没有数据要发送给 A 了,这时 B 要发送报文告诉 A,B 自身也要关闭连接。

FIN = 1; 关闭连接控制位
ACK = 1; 确认控制位
seq = w; 如果在第二次握手以后 B 没有发送数据,那么 w = v,如果发生了数据发送,就 w > v
ack = u+1;重复发送上次发送的 u+1确认序号。

此时 B 发送了以后自身进入了LAST-ACK(最后确认)状态,等待 A 的确认

第四次挥手
A 在收到 B 的请求关闭连接的报文以后,在确认报文段中将 ACk 置为 1,表示确认,并给 B 回复:

ACK = 1;确认控制位
ack = w+1;确认序号为 B 发来的 w+1
seq = u+1;自身的序号+1

A 在发送了最后的报文以后,自身就进入了TIME-WAIT(时间等待)状态,此时的 TCP 连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间 2MSL 以后 A 才会进入到 CLOSED 状态。

只要 B 接收到 A 发来的确认报文,就进入了 CLOSED 状态,但是由于 A 要再发送报文以后等待一段时间才会关闭,所以B 的关闭会比 A 早一点。

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

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

相关文章

Educational Codeforces Round 159(div2) --- E. Collapsing Strings-- 题解

目录 E. Collapsing Strings 题目大意: 思路: 代码: E. Collapsing Strings Problem - E - Codeforces 题目大意: 给你n个字符串,然后对任意两个字符串进行合并操作, 设两个字符串 a 和 b 的折叠 C(a,b) 是以下…

中危漏洞!小程序优惠卷遍历

进入小程序,因为是一个小商城,所以照例先查看收货地址是否存在越权,以及能否未授权访问,但是发现不存在这些问题,所以去查看优惠卷 进入领券中心,点击领取优惠券时抓包 发现数据包,存在敏感参数…

DevEco Studio将常用内容设为代码模板 通过快捷键调出

有时候 我们开发 可能有一些经常要写的内容 天天CV大法找东西也非常麻烦 我们这里打开编辑器 选择 File下的Settings 打开设置界面 选择 Editor 下的 Live Templates 模板 然后 我们点击右侧加号 然后点第一个 加一个 这里 我们设置 输入 em时会触发提示 内容时 问君能有几…

使用Serv-U FTP服务器共享文件,实现无公网IP环境下远程访问

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天,移动电子设备似乎成了我们生活的主角,智能…

每日一题(LeetCode)----字符串--反转字符串

每日一题(LeetCode)----字符串–反转字符串 1.题目(344. 反转字符串) 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) …

网盘系统设计:万亿 GB 网盘如何实现秒传与限速?

Java全能学习面试指南:https://javaxiaobear.cn 网盘,又称云盘,是提供文件托管和文件上传、下载服务的网站(File hostingservice)。人们通过网盘保管自己拍摄的照片、视频,通过网盘和他人共享文件&#xff…

C++进阶篇6---lambda表达式

目录 一、lambda表达式 1.引入 2、lambda表达式语法 二、包装器---function 1.引入 2.包装器介绍 三、bind 一、lambda表达式 1.引入 class Person { public:Person(int age,string name):_age(age),_name(name){} //private://方便后面的举例int _age;string _name…

CAN总线负载率

总线负载率就是每秒钟传输了多少个位,波特率为500K的总线上每秒钟能够传输500‘000位,如果在某一秒中总线上只传输了100000位,则总线负载率为20%。 总线负载率 总线每秒上传输的实际位数 / 总线波特率 * 100% CAN总线负载率是CAN总线架构协…

JS生成登录验证码

采用js生成登录的验证码 采用的技术点有html&#xff0c;css&#xff0c;JS&#xff0c;jQuery HTML&#xff1a; <div class"box_b"><img src"./img/0775639c-c82c-4a29-937f-d2a3bae5151a.png" alt""><div class"regist…

智能变压器监控系统

智能变压器监控系统是一种先进的物联网技术和智能设备&#xff0c;能够实现对变压器的实时监测和管理&#xff0c;提高变压器的运行效率和可靠性&#xff0c;为用户提供及时、准确的变压器运行状态信息和故障预警。 力安科技A30变压器云控终端是一款集变压器温控仪、变压器运行…

LabVIEW开发工业设备远程在线状态监测

LabVIEW开发工业设备远程在线状态监测 项目需要减少意外停机和维护费用、提供更完整的机器操作和状态图、改进设备使用情况跟踪。 该解决方案是一个多节点&#xff08;即多站点&#xff09;远程监控系统&#xff0c;它利用了基于NI cRIO的控制器和定制的LabVIEW监测软件。 方…

【Lustre相关】应用部署-03-Lustre集群部署实践(软raid方案)

文章目录 一、前言1、硬件配置2、组网拓扑3、总体方案 二、软件安装三、集群部署1、配置多路径2、配置高可用集群3、配置zpool4、部署lustre5、配置Lustre角色高可用6、配置Lustre状态监控6.1、Lustre网络状态监控6.2、Lustre集群状态监控6.3、配置优化6.3.1、设置故障恢复不回…

不同数据库进行同步和增量数据(SQL server 与MySQL数据库为例)

场景 最近在做的一个项目需要将远程服务器的SQL server数据库中表的数据传输到本机的MySQL数据库中&#xff0c;并且远程的SQL server数据库表的数据会实时进行更新&#xff0c;并且差不多是一分钟内传输18条数据&#xff0c;例如现在是2023-12-4 15:09&#xff0c;在15:08这个…

JDK安装太麻烦?一篇文章搞定

JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA工具。 JDK包含的基本组件包括&#xff1a; javac – 编译器&#xf…

FCRP第二题

【题目要求】 数据库中有一张地区数据统计表&#xff0c;但是并不规则 &#xff0c;记录类似于&#xff0c;225100:02:3:20160725是一串代码&#xff0c;以&#xff1a;分割&#xff0c;第1位为地区代码&#xff0c;第2位为分类代码&#xff0c;第3位为数量&#xff0c;第4位为…

X540t2关于手动安装intel驱动

首先去intel驱动官网下载&#xff0c;win10和win11驱动一样 https://www.intel.cn/content/www/cn/zh/download/18293/intel-network-adapter-driver-for-windows-10.html 然后下载下来解压 将Wired_driver_28.2_x64.exe修改成Wired_driver_28.2_x64.zip文件再解压 打开设备管…

【算法思考记录】力扣1094.拼车 C++【树状数组】

拼车问题&#xff08;LeetCode 1094&#xff09;的解析与C实现 Problem: 1094. 拼车 题目背景 在本题中&#xff0c;我们需要处理一个拼车的问题。假设一辆车有固定的座位容量&#xff0c;我们需要根据乘客的上车和下车地点&#xff0c;判断车辆是否能够在整个行程中满足不超过…

DPDK驱动加载

目录 整体加载思路 配置步骤 全局变量配置 调用流程编写 加载VFIO模块 删除VFIO模块 加载KNI模块 卸载KNI模块 创建大页内存 创建大页内存文件系统 删除遗留的大页内存 卸载大页文件系统 调用dpdk-devbind.py脚本来绑定PCI设备igb_uio驱动 加载igb_uio.ko驱动. 卸…

基于springboot + vue 学生网上请假系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

GeoServer本地部署与远程访问Web管理页面——“cpolar内网穿透”

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…