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

三次握手四次挥手

第一次握手
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.kler.cn/news/156959.html

相关文章:

  • Google Protocol Buffers (proto3) 中的 DoubleValue 类型用法总结
  • linux创建新的py文件
  • 电商项目之Web实时消息推送(附源码)
  • 入门Python+Vue 全栈开发高级BI数据的可视化实战项目几个技术点总结
  • 2023年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——解析版
  • 131. 分割回文串
  • JMeter从入门到精通
  • 个人Windows电脑通过Cloudreve+Cpolar搭建PHP云盘系统公网可访问
  • 机器学习(1)机器学习类型和机器学习的主要概念
  • 练习十一:简单卷积器的设计
  • 纯C读取文件实现解析H264裸流每一帧数据
  • 回归分析:预测和建模
  • Git 简介及异常场景处理
  • 12月4日作业
  • 作业12.4
  • 分享77个菜单导航JS特效,总有一款适合您
  • JDBC常见的几种连接池使用(C3P0、Druid、HikariCP 、DBCP)(附上代码详细讲解)
  • 软件测试【理论基础】
  • 基于AT89C51单片机的秒表设计
  • Python机器学习、深度学习入门丨气象常用科学计算库、气象海洋常用可视化库、爬虫和气象海洋数据、气象海洋常用插值方法、EOF统计分析、WRF模式后处理等
  • Stream 流
  • 【Vue】Linux 运行 npm run serve 报错 vue-cli-service: Permission denied
  • Django总结
  • 【bug排查解决】现象级延迟8-10s
  • 编程语言中常量(Constant)简介
  • Python (十八) 正则表达式
  • 外包干了2个月,技术退步明显。。。。。
  • MySQL Connector/J 数据库连接 URL的语法
  • Metasploit渗透测试的漏洞利用和攻击方法
  • Leetcode—409.最长回文串【简单】