计算机网络:运输层 - TCP首部格式 连接的创建与释放

news2024/11/19 7:49:01

计算机网络:运输层 - TCP首部格式 & 连接的创建与释放

    • TCP首部格式
      • 源端口 目的端口
      • 序号
      • 确认号
      • 数据偏移
      • 保留
      • 控制位
      • 窗口
      • 检验和
      • 紧急指针
    • TCP连接创建 - 三次握手
    • TCP传输过程
    • TCP连接释放 - 四次挥手


TCP首部格式

TCP的首部如下:

在这里插入图片描述

首部的前20 byte是固定的,后面的选项字段可变。

源端口 目的端口

源端口目的端口各占2 byte,即填入通信的两个进程使用的端口号。


序号

4 byte,范围是 [ 0 , 2 32 − 1 ] {\red{[0, 2^{32} - 1]}} [0,2321]TCP是面向字节流的,在TCP中传输的每一个字节都要按顺序进行编号。整个传输过程中,第一个字节的值是任意的,由发送方随机设定,后续所有字节都由第一个字节的编号以及偏移量得出。比如整个TCP连接中,第一个字节编号为x,那么第201个字节的编号就是x + 201

如果某个字节在编号时,超出了 2 32 − 1 2^{32} - 1 2321 ,此时从0开始重新计数。


确认号

4 byte,含义是:期望收到对方下一个报文段的第一个字节的序号

例如,主机B收到了来自A的编号为501的数据报,数据报长度为200。这说明主机B收到了编号为501 - 700字节的数据。那么主机B接下来就期望收到701开始的数据,此时确认号就设为701

若确认号为 n,说明 n - 1 及之前的所有数据都已经收到了


数据偏移

4 bit,其含义为:报文起始处数据起始处的距离,简单理解就是整个首部的长度

由于TCP带有填充字段,所以长度是不确定的,需要该字段来指明长度。另外的,由于只占该字段只占4 bit,能表示的范围是 [ 0 , 2 4 − 1 ] {\red{[0, 2^{4} - 1]}} [0,241],也就是[0, 15],而数据偏移字段以4 byte为单位。所以整个首部的长度最长为60 byte,进而说明选项字段的长度不超过40 byte


保留

6 bit,目前没有用,使用时设为全0


控制位

接着就是连续的留个控制位

紧急 URG:当URG = 1,表明紧急指针字段有效,告诉系统此报文有紧急数据,需要尽快传送,此时该报文就无需排队,直接插入到队列的首部立马发送出去。

确认 ACK:当ACK = 1时,确认号字段才有效。TCP规定:在连接建立后所有的传送报文段,ACK必须置为1

推送 PSH:发送该报文后,如果希望尽快收到对方的回应,就可以PSH = 1。接受方收到该报文后,会立刻把该报文提交给应用进程,而不是等到接收缓存满了才提交。

复位 RST:当RST = 1,表示TCP连接出现重大差错,必须释放连接。也可以用来拒绝一个连接或报文段。

同步 SYN:用于建立连接

  • SYN = 1并且ACK = 0,表明这是一个连接请求报文,(ACK = 0的情况,一般来说整个TCP连接只有此处ACK = 0)
  • SYN = 1并且ACK = 1,表明这是一个连接同意报文

终止 FIN:用于释放一个连接,当FIN = 1,表明这是一个释放连接的报文


窗口

2 byte,用于指明自己的接收窗口,对方收到该报文后,读取窗口字段,就知道自己接下来可以发送多少数据了。


检验和

2 byte,检验范围包括首部数据两部分,与UDP一样,在计算检验和时,要加上伪首部

如图:

在这里插入图片描述

只有计算检验和时才会存在伪首部,实际上其不存在,TCP 数据报中只有首部数据


紧急指针

2 byte,仅在URG = 1时才有效。当URG = 1,说明这是一个紧急的报文,此时要立刻发出去,整个数据报会插队到其他数据报的前面。那么计算机怎么知道这个紧急报文的长度是多少?

此时就需要紧急指针字段,其指明了本报文中紧急数据的字节数,当把所有紧急数据处理完后,就要恢复正常状态,把之前的数据发送出去。而什么时候紧急数据发送完,就是依靠紧急指针字段指明的紧急数据的字节数。


讲解完报文的格式后,我们来讲解TCP连接的创建与释放。后续会用到一些标识符,接下来我解释一下每个标识符对应数据报首部的哪一个字段:

  • seq:对应首部中的序号字段,指明希望收到的下一个数据的序号是什么
  • ack:对应首部中的确认号字段,表明xxx之前的所有数据都已经收到了
  • ACK:对应首部中的确认位字段,表明确认号有效
  • SYN:对应首部中的同步位字段,用于创建TCP连接
  • FIN:对应首部中的终止位字段,用于终止TCP连接

TCP连接创建 - 三次握手

假设现有一台客户主机A,一台服务器主机B,现在A申请向B发起TCP连接

处于创建连接的过程中,SYN就起作用了,如图:

在这里插入图片描述

首先令SYN = 1,表明当前正在创建连接,创建连接的报文分两种情况:

  • SYN = 1并且ACK = 0,表明这是一个连接请求报文,(ACK = 0的第一种情况)
  • SYN = 1并且ACK = 1,表明这是一个连接同意报文

当前A正在发起连接的请求,所以此时ACK = 0,注意:后续只要不标明的位,都是0

而发送数据是要对每个字节进行编号的,第一个字节的编号由主机随机生成,此时seq = x表明:第一个字节的编号为x

A发起请求后,此时B就要同意这个连接:

在这里插入图片描述

同意连接是SYN = 1ACK = 1,表明当前报文用于同意一个连接。此时主机B也要生成第一个字节的编码,也就是seq = y

B在回应时,还有一个字段ack = x + 1ack表示:我希望收到的下一个数据的编号。

比如说某一次报文发送时,第一个字节的编号为666,总数据长度为200 byte,那么接收方就收到了[666, 865]的所有数据,此时回应报文为ack = 866表明下一个数据的编号为866

那么目前来说刚刚TCP请求报文的编号为seq = x,现在我回应ack = x + 1,是不是可以理解为:整个TCP请求报文只携带一个字节的数据呢?

TPC规定:SYN = 1的报文不允许携带数据,但是消耗掉一个seq

其实SYN = 1的报文不携带数据部分,但是TCP强制规定了其要消耗掉一个seq,因此刚刚序号x视为被消耗了,下一个字节的序号为x + 1

A收到B的确认后,此时A也要再给B做一次确认:

在这里插入图片描述

这个确认,是对第二个报文的确认,此时SYN = 0,因为其既不是连接请求,也不是连接同意ACK = 1表明ack字段有效。seq = x + 1,因为第一个报文seq = x,并且SYN = 1要消耗掉一个需要,此时就用下一个序号x + 1

ack = y + 1是因为,刚刚B发送的报文seq = y,而SYN = 1要消耗掉一个序号,此时希望收到的下一个序号为y + 1

接下来考虑一个问题:为什么需要三次报文交换才能建立连接?明明A发送一个请求,B发送一个同意,就表明双方都准备建立连接了,为什么不直接开始传输数据,而是还要第三次确认?

这是因为在B发送第二个同意报文后,A可能还没准备好接收数据。比如说B发送的同意报文丢失了,此时A还在等待B的同意,而B以为A已经可以发送数据了。结果B发送了一段数据后,A根本不接收,因为A在等B的同意。此时就是A没有准备好。

因此A要发送第三个报文,来表明自己已经准备好了,对面可以开始发送数据了。

另外的,第三个报文是可以携带数据的,此时A发送第三个报文时,表明连接建立完毕了,于是A就顺带可以把一部分数据先通过该报文传输过去!

对于FIN = 0SYN = 0ACK = 1的报文,可以携带数据,携带多少数据就消耗多少序号,如果不携带数据,就不消耗序号

现在连接已经创建完毕,就可以正常数据传输了!


TCP传输过程

很多地方都只讲了连接创建与释放的过程,反而没有说明传输的过程。其实这个过程也很重要,本博客再简单讲解一下传输的过程。

如图所示:

在这里插入图片描述

现在TCP连接建立时,第三个报文携带了100个数据(data用于说明这个报文携带了多少数据)。

随后A又紧接着发送了300个数据:

在这里插入图片描述

此时seq = x + 101,这是因为刚刚的第三个报文携带了100 byte的数据,其中第一个字节的编号为x + 1,说明我已经把[x + 1, x + 100]的数据发出去了,接下来的300字节,第一个编号就是x + 101了。

ack = y + 1,这是因为上一次收到B的报文是SYN = 1ACK = 1的连接同意报文,序号为y,消耗掉一个序号后变为y + 1,即下一个希望收到的编号为y + 1

随后B发送了一个长度为200 byte的报文:

在这里插入图片描述

此时seq = y + 1,这是因为上一次B发送的报文是seq = y,而SYN = 1消耗掉一个序号,这次第一个字节使用的序号为y + 1ack = x + 401表明[x, x + 400]的所有数据都收到了,下一个希望收到的序号是x + 401

随后A再发送一个100 byte的报文:

在这里插入图片描述

这时seq = x + 401,因为之前发送了[x, x + 400]的数据,下一个字节编号为x + 401ack = y + 201表明[y, y + 200]的数据都受到了。

以此类推,直到连接释放。


TCP连接释放 - 四次挥手

TCP连接传输数据完毕,此时就可以释放连接了。

TCP连接释放可以由任意一方发起,假设现在A发起释放连接:

在这里插入图片描述

首先要把FIN = 1,表明A发起了一个释放连接的请求。而seq = u,表明当前的报文编号为u,也说明之前A传输的最后一个字节编号为u - 1ack = v,表明A收到的来自B的最后一个字节是u

A发起释放连接的请求,只说明A要传送的数据已经完毕了,可以释放连接了。但是B可能还有没有传送完的数据

在这里插入图片描述

首先B发送一个ACK报文,表明自己已经收到了刚刚FIN = 1的报文。

TCP规定:FIN = 1的报文,就算不携带数据也要消耗一个序号

A发送的连接释放报文中,FIN = 1并且不携带数据,那么也要消耗掉一个序号。因此B希望收到的下一个序号是u + 1

如果B收到该报文,那么ack = u + 1,否则ack = u,这样发送方就可以根据下一个报文得知B有没有收到连接释放的请求包围了

随后B可以继续发送自己之前没发完的数据,这期间B发送的报文FIN = 0,表明B还有数据要发,没这么快终止连接。

剩下B发送的所有报文中ack = u + 1,因为刚刚A发送了一个FIN = 1的报文。

seq = v,表明自己现在发送的数据中,第一个字节序号为v

B传输完自己的所有数据后,在发送释放连接的同意报文:

在这里插入图片描述

FIN = 1表明这是一个连接释放的报文,在两个FIN = 1的报文中间,B还发了一些报文,导致序号一直增加,假设现在增加到了w,那么seq = w

B发送完最后一个FIN = 1的连接释放报文后,A最后发送一个确认报文:

在这里插入图片描述

这是因为B无法保证自己发出去的报文A一定可以接收到,如果B发送的FIN = 1的报文丢失了,此时B以为自己以为结束TCP连接,而A还在一直等待B发出FIN = 1的报文。所以要对这个FIN = 1的报文最后做一次确认。

当这四个报文传输完毕,A不能直接结束,而要等待2 MSL

在这里插入图片描述

MSL(Maximum Segment Lifetime,最大报文段生存时间):指的是一个 TCP 报文在网络中存活的最长时间。

这是因为A传送的最后一个确认报文也有可能丢失,B如过发现A没有回应,超时计时器结束就重传FIN = 1的报文。而这个报文一定可以在2 * MSL期间到达,所以如果A2MSL期间没有收到B的报文,说明最后一个报文B收到了,可以释放连接了。


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

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

相关文章

在Python项目中自定义日志工具

在Python项目中自定义日志工具 日志记录是软件开发中的一个关键部分,它可以帮助开发人员调试代码、监控运行状况以及记录重要事件。在Python中,logging 模块提供了强大的日志记录功能。本文将介绍如何创建一个日志工具,使其能够同时将日志输…

【会议征稿,IEEE出版】第四届电气工程与机电一体化技术国际学术会议(ICEEMT 2024,7月5-7)

第四届电气工程与机电一体化技术国际学术会议(ICEEMT 2024)定于2024年7月5-7日在浙江省杭州市隆重举行 。会议主要围绕“电气工程”、“机电一体化” 等研究领域展开讨论,旨在为电气工程、机电一体化等领域的专家学者、工程技术人员、技术研发…

leetcode (top100)接雨水

题目: 题解: 可以把每个宽度看作一个桶,每个桶能接的水等于这个桶左右两个方向最高桶的最小高度再减去这个桶本身的高度。把每个桶能接的水相加即可。 难点在于如何快速找到当前桶的左右两个方向的最高桶的高度,可以先遍历一遍…

Java学习【深入解读File类:从基础到高级的完整指南】

Java学习【深入解读File类:从基础到高级的完整指南】 ⭐File的概述和构造方法⭐File常见的成员方法🌙构造方法🌙length()🌙getAbsoluteFile()和getPath()🌙getName()和lastModified() ⭐文件的创建和删除⭐获取并遍历 …

电脑操作系统有哪些?一文了解全部!

在当今数字化飞速发展的时代,电脑操作系统作为计算机硬件与软件之间的桥梁,扮演着至关重要的角色。它不仅管理着计算机的各项资源,还为用户提供了一个直观、友好的界面,使得用户可以轻松地进行各种操作和任务。那么,电…

【八股系列】介绍React高阶组件,适用于什么场景?

文章目录 1. HOC的工作原理2. 返回的新组件3. 适用场景4. 注意事项5. 示例代码 React高阶组件( Higher-Order Components,简称HOC)是 React中一种高级的 复用组件逻辑的技术。 HOC自身不是 React API的一部分,而是基于 Reac…

Zyxel NAS设备 setCookie 未授权命令注入漏洞复现(CVE-2024-29973)

0x01 产品简介 Zyxel-NAS 是指由 Zyxel Communications Corporation(合勤科技股份有限公司)开发和生产的网络附加存储(Network Attached Storage,简称 NAS)设备。NAS 是一种专门用于存储和共享文件的设备,它通过网络连接到计算机、服务器或其他设备,提供集中式的文件存…

linux最大线程数限制及打开最大文件数

1.root用户下执行 ulimit -a 然后查看 max user processes 这个值通常是系统最大线程数的一半 max user processes:当前用户同时打开的进程(包括线程)的最大个数为 2.普通用户下 ulimit -a 出现的max user processes的值 默认是 /etc/security/limits.d/20-nproc.co…

范式(下)-BC范式(BCNF)、关系模式的规范化

一、关系模式STC 假设有一个关系模式STC,包含有学号Sno、教师编号Tno、课程编号Cno、选课成绩G四个属性 即STC(Sno,Tno,Cno,G) 数据间的关系为 每个学生可选修多门课程,每门课程可以被多名学生选修每个老师只能讲授…

虹科免拆诊断案例 | 15款马自达3偶发高速CAN网络故障

CAN总线大家都不陌生,遇到这类故障,我们第一反应可能是用万用表测一下电压,看看存不存在短路、断路等问题。不过,使用万用表测得的电压值只是CAN总线上的平均电压,是一个大概的数值,并不能反映真实的CAN总线…

用户组相关的一些命令

1./etc/passwd>列出了系统里的所有用户 2./etc/shadow>保存了用户的密码信息 空表示密码为空 *表示账号被在锁定 !表示未设置密码 !!表示这个密码已经过期 $1表示MD5加密, $2表示用Blowfish加密, $5表示用SHA-256加密, $6表示SHA-512加…

关于微信小程序(必看)

前言 为规范开发者的用户个人信息处理行为,保障用户的合法权益,自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…

FANUC喷涂机器人P-350iA电机过热维修解决方案

发那科喷涂机器人作为自动化喷涂生产线的重要组成部分,其性能稳定性和可靠性对于生产效率和产品质量具有重要影响。然而,在实际使用过程中,FANUC喷涂机器人P-350iA电机过热故障问题往往成为影响其正常运行的主要因素之一。 FANUC机器人M-100…

数据库实战(一)(关系数据库设计)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀数据库 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 前言 练习题 题型一:判断关系…

登录爆破神器:Hydra 保姆级教程

前言 Hydra 是一个广泛使用的网络登录破解工具,支持多种协议(如 HTTP、FTP、SSH、Telnet 等),用于执行暴力破解攻击。它由 Van Hauser 和 The Hackers Choice (THC) 团队开发,设计用于快速和高效地尝试大量用户名和密…

信息技术课如何禁止学生玩游戏

在信息技术课上禁止学生玩游戏是一个常见的挑战,但可以通过一系列策略和工具来有效地实现。以下是一些建议: 明确课堂规则和纪律: (1)在课程开始时,明确告知学生课堂规则和纪律,包括禁止玩游戏的规定。 (2)强调遵守…

创建一个electron桌面备忘录

Sound Of Silence 1.创建electron项目命令: npm create quick-start/electron my-new-project 2选择:√ Select a framework: vue √ Add TypeScript? ... No √ Add Electron updater plugin? ... Yes √ Enable Electron download mirror proxy? .…

记一次生产事故,来来回回搞了一个月

🍅我是小宋,关注我,带你轻松过面试 读源码。提升简历亮点(14个demo) 🌏号:tutou123com。拉你进专属群。 记一次生产事故,来来回回搞了一个月 背景 我们的主要业务是台湾省的一个小…

工业自动化中OBC充电机测试负载箱的应用

在工业自动化中,OBC充电机是电动汽车和混合动力汽车的重要组成部分。它的主要功能是为电动汽车的电池组提供电能,保证车辆的正常运行。为了保证OBC充电机的性能和安全性,通常需要对其进行严格的测试。在这个过程中,负载箱是一种非…

【SQL server速成之路】函数

(3)LEFT函数 LEFT ( character_expression , integer_expression ) 功能:返回从字符串character_expression左边开始,由integer_expression指定个数的字符。参数character_expression:为字符型表达式,integ…