【计算机网络09】传输层之TCP连接管理

2023-11-19

1.深入理解序号seq、确认号ack

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.建立连接(三次握手)

在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送 SYN 包到服务器,并进入 SYN-SENT 状态,等待服务器确认。

第二次握手:服务器收到 SYN 包,必须确认客户的 SYN,同时自己也发送一个 SYN 包,即 SYN+ACK 包,此时服务器进入 SYN-RCVD 状态。

第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK,此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。

在这里插入图片描述

2.1 状态解读

CLOSED:client 处于关闭状态。

LISTEN:server 处于监听状态,等待 client 连接。

SYN-RCVD:表示 server 接收到了 SYN 报文,当收到 client 的 ACK 报文后,它会进入到 ESTABLISHED 状态。

SYN-SENT:表示 client 已发送 SYN 报文,等待 server 的第 2 次握手。

ESTABLISHED:表示连接已经建立。

2.2 前 2 次握手的特点

SYN 都设置为 1

数据部分的长度都为 0

TCP 头部的长度一般是 32 字节(固定头部 20 字节,选项部分 12 字节)

双方会交换确认一些信息,比如 MSS、是否支持SACK、Window scale(窗口缩放系数)等,这些数据都放在了 TCP 头部的选项部分(12字节)中。

2.3 为什么建立连接要进行 3 次握手?2 次不行吗?

主要目的:防止 server 端一直等待,浪费资源。

如果建立连接只需要 2 次握手,可能会出现如下情况:

假设 client 发出的第一个连接请求报文段,因为网络延迟,在连接释放以后的某个时间才到达 server。本来这是一个早已失效的连接请求,但 server 收到此失效的请求后,误认为是 client 再次发出的一个新的连接请求。于是 server 就向 client 发出确认报文段,同意建立连接。
如果不采用“3次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有真正想连接服务器的意愿,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的连接已经建立,并一直等待 client 发来数据,这样,server 的很多资源就白白浪费掉了。

采用“三次握手”的办法可以防止上述现象发生:

例如上述情况,client 没有向 server 的确认发出确认,server 由于收不到确认,就知道 client 并没有要求建立连接。

2.4 第 3 次握手失败了会怎么处理?

此时 server 的状态为 SYN-RCVD,若等不到 client 的 ACK,server 会重新发送 SYN+ACK 包,如果 server 多次重发 SYN+ACK 都等不到 client 的 ACK,就会发送 RST 包,强制关闭连接。

3.释放连接(四次挥手)

TCP 采用四次挥手来释放连接。

第一次挥手:Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN-WAIT-1 状态。

第二次挥手:Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号+1(与 SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE-WAIT 状态。

第三次挥手:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST-ACK 状态。

第四次挥手:Client 收到 FIN 后,Client 进入 TIME-WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号+1,Server 进入 CLOSED 状态,完成四次挥手。

在这里插入图片描述

3.1 状态解读

FIN-WAIT-1:表示想主动关闭连接。向对方发送了 FIN 报文,此时进入到 FIN-WAIT-1 状态。

CLOSE-WAIT:表示在等待关闭。当对方发送 FIN 给自己,自己会回应一个 ACK 报文给对方,此时则进入到 CLOSE-WAIT 状态,在此状态下,需要考虑自己是否还有数据要发送给对方,如果没有,发送 FIN 报文给对方。

FIN-WAIT-2:只要对方发送 ACK 确认后,主动方就会处于 FIN-WAIT-2 状态,然后等待对方发送 FIN 报文。

CLOSING:一种比较罕见的例外状态。表示你发送 FIN 报文后,并没有收到对方的 ACK 报文,反而却也收到了对方的 FIN 报文,如果双方几乎在同时准备关闭连接的话,那么就出现了双方同时发送 FIN 报文的情况,也即会出现 CLOSING 状态,表示双方都正在关闭连接。

LAST-ACK:被动关闭一方在发送 FIN 报文后,最后等待对方的 ACK 报文。当收到 ACK 报文后,即可进入 CLOSED 状态了。

TIME-WAIT:表示收到了对方的 FIN 报文,并发送出了 ACK 报文,就等 2MSL 后即可进入 CLOSED 状态了。如果 FIN-WAIT-1 状态下,收到了对方同时带 FIN 标志和 ACK 标志的报文时,可以直接进入到 TIME-WAIT 状态,而无须经过 FIN-WAIT-2 状态。

CLOSED:关闭状态。

由于有些状态的时间比较短暂,所以很难用 netstat 命令看到,比如 SYN-RCVD、FIN-WAIT-1 等。

3.2 为什么 TIME-WAIT 状态要等待 2 倍的 MSL?

TCP/IP 协议栈在设计上,允许任何一方先发起断开请求。这里演示的是 client 主动要求断开。

client 发送 ACK 后,需要有个 TIME-WAIT 阶段,等待一段时间后,再真正关闭连接。一般是等待 2 倍的 MSL(Maximum Segment Lifetime,最大分段生存期)

  • MSL 是 TCP 报文在 Internet 上的最长生存时间
  • 每个具体的 TCP 实现都必须选择一个确定的 MSL 值,RFC 1122 建议是 2 分钟

那为什么要等待 2 倍的 MSL呢?

可以防止本次连接中产生的数据包误传到下一次连接中(因为本次连接中的数据包都会在 2MSL 时间内消失了)

如果 client 发送 ACK 后马上释放了,然后又因为网络原因,server 没有收到 client 的 ACK,server 就会重发 FIN,这时可能出现的情况是

  1. client 没有任何响应,服务器那边会干等,甚至多次重发 FIN,浪费资源。
  2. client 有个新的应用程序刚好分配了同一个端口号,新的应用程序收到 FIN 后马上开始执行断开连接的操作,本来它可能是想跟 server 建立连接的。

3.3 为什么释放连接要进行 4 次挥手?

因为 TCP 是全双工模式,发送方和接收方都需要 FIN 报文和 ACK 报文。

第 1 次挥手:当 主机1 发出 FIN 报文段时,表示 主机1 告诉 主机2,主机1 已经没有数据要发送了,但是,此时 主机1 还是可以接受来自 主机2 的数据。

第 2 次挥手:当 主机2 返回 ACK 报文段时,表示 主机2 已经知道 主机1 没有数据发送了,但是 主机2 还是可以发送数据到 主机1 的。

第 3 次挥手:当 主机2 也发送了 FIN 报文段时,表示 主机2 告诉 主机1,主机2 已经没有数据要发送了。

第 4 次挥手:当 主机1 返回 ACK 报文段时,表示 主机1 已经知道 主机2 没有数据发送了。随后正式断开整个 TCP 连接。

3.4 为什么只会看到 3 次挥手?

在这里插入图片描述

有时候在使用抓包工具的时候,有可能只会看到“3次“挥手,这其实是将第 2、3 次挥手合并了。

当 server 接收到 client 的 FIN 时,如果 server 后面也没有数据要发送给 client 了,这时,server 就可以将第 2、3 次挥手合并,同时告诉 client 两件事:

  • 已经知道 client 没有数据要发
  • server 已经没有数据要发了

4.TCP状态转换

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机网络09】传输层之TCP连接管理 的相关文章

随机推荐

  • mybatis获取新增记录的主键

    最近项目中有个需求 需要在新增一条记录后返回该记录的主键 查了下资料 用mybatis可以做 我需要拿第一个方法执行返回的id作为变量传给下面 数据库中该id是记录主键 并且数据库用的是主键自增长 这是前提 有两种方式 第一种方式写法如下
  • 信息化战略规划-CRO-SCM-应用集成-电子商务

    信息化战略规划 CRO SCM 应用集成 电子商务 信息化战略体系 重点 信息系统战略规划 重点 客户关系管理 重点 供应链管理 企业应用集成 电子商务 信息化战略体系 重点 企业战略 目标 企业战略规划 实现目标的规划 企业信息化战略 使
  • 操作系统(四):磁盘调度算法,先来先服务,最短寻道时间优先,电梯算法

    文章目录 一 磁盘结构 二 先来先服务 三 最短寻道时间优先 四 电梯算法 SCAN 一 磁盘结构 盘面 Platter 一个磁盘有多个盘面 磁道 Track 盘面上的圆形带状区域 一个盘面可以有多个磁道 扇区 Track Sector 磁
  • 在echarts中自定义提示框内容

    以折线图为例 在鼠标滑过每个数据标签时 为了更友好地显示数据内容 需要对显示的数据内容作格式化处理 添加自定义内容 这就需要用到tooltip的formatter属性的回调函数 本文将从配置代码和效果两方面来展示它的使用 柱状图的原理类似
  • NCC低代码平台服务搭建指南

    NCC服务搭建 前言 本文档旨在帮助第一次接触NCC的开发人员 搭建NCC开发环境 1 NCC相关资料 开发者社区 https nccdev yonyou com 资料 https pan baidu com s 15V71U7vVOGr8
  • 【论文笔记】TNASP:A Transformer-based NAS Predictor with a Self-evolution Framework

    文章目录 0 摘要 摘要解读 1 Introduction 2 相关工作 3 方法 3 1 Training based network performance predictors 3 2 基于Transformer的预测器 3 3 自演
  • unity3d实现简单的打飞碟游戏

    游戏内容 游戏有n个round 每个round发射10次trial 每个trial的飞碟都可能不同 包括速度角度得分等 使用鼠标进行射击 点中即表示射击成功 游戏要求 使用带缓存的工厂模式来管理飞碟的生产与再利用 工厂使用单例模式 游戏的设
  • python中.argsort()的用法

    argsort 是对数组参数从小到大排序 然后取出排序后的索引 例如 a np array 0 2 0 5 0 3 0 4 a argsort 输出的就是对a数组排序过后的索引 0 2 3 1
  • 三、web端显示之hdfs基本操作

    三台的节点均启动成功之后 完全匹配的上配置的下图所示情况 若启动不成功 则先 root hadoop1 hadoop 3 1 3 stop all sh 再输入ll显示一下 删除每一个集群上的data和logs root hadoop1 h
  • Qt源代码中二进制兼容及d、q指针的理解

    1 二进制兼容的理解 首先按照本文对二进制兼容进行理解 此处是本人的总结 将类的私有属性 不需要暴露的部分 放到私有类中 在类中定义私类的指针进行交互 指针的大小是已知不变的 指针数据类型为Int 4个字节 软件发布后只需要改私类中的部分
  • 安装vmware tools时,kernel版本不匹配问题的解决方法

    安装vmware tools 的时候 提示找不到C header files 此种情况下 按以下步骤操作 1 内核安装完毕后 需要用这个命令确定内核 C header 的安装目录 ls d usr src kernels uname r i
  • 怎样知道自己适不适合做程序员

    编程是一门非常有技术含量的手艺活 待遇和福利相对来说较为丰厚 由于种种原因想要转行做程序员的人 总会有这样的困惑 我是否适合做程序员呢 其实做为一个开发者 有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C语言C 交流群58365041
  • 全文检索几种词向量模型

    1 倒排索引模型 2 布尔检索类型 3 TF IDF权重计算 下面是TF IDF的JAVA代码实现 public class TFIDF public double tf List
  • vue的循环遍历(v-for)

    1 循环遍历 1 循环遍历 vue的循环遍历用v for 语法类似于js中的for循环 当我们有一组数据需要进行渲染时 我们就可以使用v for来完成 2 v for使用格式 格式为 v for item in items 遍历items中
  • 【Android开发】一文全面解析Framework层

    前言 上一篇文章从Native角度讲解了Android进程管理的相关概念 本文将继续从上层的Framework中的进程启动 销毁场景和优先级处理 以及它们与四大组件的种种关联 来逐步解析Android进程管理的其他关键要素 进程的启动 An
  • 腾讯 Bugly 和 CrashHandler 冲突,不上传日志

    简单介绍 CrashHandler 是继承 UncaughtExceptionHandler 类来处理 app 崩溃 自由度比较大 可以收集日志信息保存到本地 上传网络 并重启应用 可以说是除了三方的异常上报工具 开发者使用最多的一种方式
  • Android Log系统介绍

    前言 日志分析是开发的核心阶段之一 开发人员经常会遇到这样那样的问题 需要借助日志分析来解决 Bug日志有助于在开发阶段识别Android应用中的Bug 一旦应用发布到市场上 开发者 或者支持工程师 也要通过分析bug日志来解决问题 可见
  • EditText横屏键盘全屏的问题

    在EditText的属性 android imeOptions flagNoExtractUi flagNoFullscreen 可以解决问题 一定要设置flagNoFullscreen否则会出现一个切换回竖屏后页面显示不全的问题
  • Citrix_XenDesktop7.5安装图解,实现Citrix虚拟云桌面

    Cirtrix XenDesktop 7 5 安装图解 一 安装 XenDesktop 7 5 安装 Winodws 2012 并加入域 xenad local 计算机名为 xd xenad local 过程略 安装 XenDesktop
  • 【计算机网络09】传输层之TCP连接管理

    文章目录 1 深入理解序号seq 确认号ack 2 建立连接 三次握手 2 1 状态解读 2 2 前 2 次握手的特点 2 3 为什么建立连接要进行 3 次握手 2 次不行吗 2 4 第 3 次握手失败了会怎么处理 3 释放连接 四次挥手