5.9、TCP报文段的首部格式

news2024/12/26 21:32:15

为了实现可靠传输,TCP 采用了 面向字节流 \color{red}面向字节流 面向字节流的方式。

TCP 在发送数据时,是从发送缓存取出一部分或全部字节并给其添加一个首部使之成为 TCP 报文段 \color{red}\texttt{TCP} 报文段 TCP报文段后进行发送。

  • 一个 TCP 报文段由 首部 \color{red}首部 首部 数据载荷 \color{red}数据载荷 数据载荷两部分构成;

  • TCP 的全部功能都体现在它首部中各字段的作用。

image-20230107223426865


image-20230107223519611

1、源端口/目的端口字段

image-20230107225650935

源端口:占 16 16 16比特,写入源端口号,用来 标识发送该 TCP 报文段的应用进程 \color{red}标识发送该 \texttt{TCP} 报文段的应用进程 标识发送该TCP报文段的应用进程

目的端口:占 16 16 16 比特,写入目的端口号,用来 标识接收该 TCP 报文段的应用进程 \color{red}标识接收该 \texttt{TCP} 报文段的应用进程 标识接收该TCP报文段的应用进程


假设游览器进程要访问 Web 服务器的进程

为了简单起见:仅从运输层端口号这个角度来举例说明,而不考虑其他细节

  • 例如:ARP,域名解析,TCP 建立连接等

当在游览器地址栏中输入 Web 服务器的域名后

游览器进程会构建一个有 HTTP 请求报文的 TCP 报文段

该报文段首部的源端口字段会填写一个短暂的端口号

  • 例如: 49152 49152 49152
  • 用来标识发送该报文段的游览器进程

目的端口字段会填写熟知端口号 80 80 80

  • 因为使用 HTTP 协议的 Web 服务器进程默认监听该端口

image-20230108001624750


Web 服务器收到该 HTTP 报文段后,从中解封出 HTTP 报文

  • 并根据 TCP 报文段首部中目的端口字段的值 80 80 80,将 HTTP 请求报文上交给Web服务器进程。

Web 服务器进程根据 HTTP 请求报文的内容进行相应处理

  • 并构建一个 HTTP 响应报文

HTTP 响应报文需要封装成 TCP 报文段进行发送

该报文段首部的源端口字段会填写熟知端口号 80 80 80

  • 用来标识发送该报文段的游览器进程

目的端口字段会填写 49152 49152 49152

  • 这是主机中需要接收该 TCP 报文段的游览器进程所对应的端口号

image-20230108001957620


客户端收到该 HTTP 报文段后,从中解封出 HTTP 报文

  • 并根据 TCP 报文段首部中目的端口字段的值 49152 49152 49152,将 HTTP 请求报文上交给游览器进程。

游览器进程对 HTTP 响应报文的内容进行解析并显示

image-20230108002114767

2、与TCP实现可靠传输的序号字段、确认号字段、确认标志位字段ACK

image-20230108002319954

2.1、序号字段(32 bit)

序号:占 32 32 32 比特,取值范围 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,2321],序号增加到最后一个后,下一个序号就又回到 0 0 0

指出本 TCP 报文段数据载荷的第一个字节的序号 \color{red}指出本\texttt{TCP}报文段数据载荷的第一个字节的序号 指出本TCP报文段数据载荷的第一个字节的序号

数据载荷中的每个字节数据都有序号,如下所示

  • 注意:它们使字节数据的序号而不是内容

image-20230108002544804

对于上述,首部中序号字段的值: 166 166 166

  • 用来指出 TCP 报文段数据载荷的第一个字节的序号

2.2、确认号字段(32 bit)&确认号标志位字段ACK(1 bit)

image-20230108002319954

确认号:占 32 32 32 比特,取值范围 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,2321],确认号增加到最后一个后,下一个确认好就又回到 0 0 0

指出期望收到对方下一个 TCP 报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。 \color{red}指出期望收到对方下一个\texttt{TCP}报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。 指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。

  • 即:若确认号 = n n n,则表明到序号 n − 1 n-1 n1 为止的所有数据都已正确接收,期望接收序号为 n n n 的数据。

确认标志位 ACK

  • 取值为 1 1 1 时确认号字段才有效;

  • 取值为 0 0 0 时确认号字段无效。

TCP 规定 , 在连接建立后所有传送的 TCP 报文段都必须把 ACK 置 1 \color{red}\texttt{TCP}规定,在连接建立后所有传送的\texttt{TCP}报文段都必须把\texttt{ACK}置1 TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK1


2.3、三者的作用

TCP 客户进程发送一个 TCP 报文段

  • 该报文段首部中序号字段的取值为: 201 201 201

    这表示该 TCP 报文段数据载荷的第一个字节的序号为 201 201 201

  • 假设数据载荷的长度为: 100 100 100 字节

  • 首部中确认号的取值为: 800 800 800

    这表示 TCP 客户进程收到了 TCP 服务器进程发来的序号到 799 799 799 的全部数据,现在希望收到序号从 800 800 800 开始的数据

  • 为了使确认号字段有效,首部中的确认标识位 ACK 的值必须设置为 1 1 1

image-20230108003534745


TCP 服务器进程收到该报文段后,也给 TCP 客户进程发送 TCP 报文段

  • 该报文段首部中序号字段的取值为: 800 800 800

    这表示该 TCP 报文段数据载荷的第一个字节的序号为 800 800 800

    这正好与 TCP 客户进程的确认相匹配

  • 假设数据载荷的长度为: 200 200 200 字节

  • 首部中确认号的取值为: 301 301 301

    这表示 TCP 服务器进程收到了 TCP 客户进程发来的序号到 300 300 300 的全部数据,现在希望收到序号从 301 301 301 开始的数据

  • 为了使确认号字段有效,首部中的确认标识位 ACK 的值必须设置为 1 1 1

image-20230108003820617

3、数据偏移字段(4 bit)

image-20230108010147571

数据偏移:

  • 4 4 4 比特,并以 4 4 4 字节为单位。

  • 用来指出 TCP 报文段的数据载荷部分的起始处距离 TCP 报文段的起始处有多远 \color{red}用来指出 \texttt{TCP} 报文段的数据载荷部分的起始处距离\texttt{TCP}报文段的起始处有多远 用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远

  • 这个字段实际上是指出了 TCP 报文段的首部长度。

    • 首部固定长度为 20 20 20 字节,因此数据偏移字段的最小值为 ( 0101 ) 2 (0101)_2 (0101)2

    • 首部最大长度为 60 60 60 字节,因此数据偏移字段的最大值为 ( 1111 ) 2 (1111)_2 (1111)2


image-20230108004151328

4、保留字段(6 bit)

image-20230108010155261

保留:占 6 6 6 比特,保留为今后使用,但目前应置为 0 0 0

5、窗口字段(16 bit)

image-20230108010134391

窗口:占 16 16 16 比特,以字节为单位。 指出发送本报文段的一方的接收窗口 \color{red}指出发送本报文段的一方的接收窗口 指出发送本报文段的一方的接收窗口

  • 窗口值作为接收方让发送方设置其发送窗口的依据。

  • 这是以接收方的接收能力来控制发送方的发送能力,称为流量控制。

注意:发送窗口的大小还取决于拥塞窗口的大小

  • 也就是应该从接收窗口拥塞窗口中取小者

6、校验和(16 bit)

image-20230108010125982

校验和:

  • 16 16 16 比特,检查范围包括 TCP 报文段的首部和数据载荷两部分。

  • UDP 类似,在计算校验和时,要在 TCP 报文段的前面加上 12 12 12 字节的伪首部

该检错算法与 TCP 的其他功能相比并不是重点

7、同步标志位 SYN (1 bit)

image-20230108010116190

同步标志位 SYN :在 TCP 连接建立时用来同步序号。

例如:TCP 通过 “三报文握手” 建立连接的过程:TCP的连接建立

image-20230108004759987

TCP 客户进程发送 TCP 连接请求报文段

  • 首部中的同步标志位 SYN 被置 1 1 1

    表明这是一个 TCP 连接请求报文段

TCP 服务进程发送 TCP 连接请求确认报文段

  • 首部中的同步标志位 SYN 被置 1 1 1 ,确认位 ACK 也被置 1 1 1

    表明这是一个 TCP 连接请求确认报文段

8、终止标志位 FIN(1 bit)

image-20230108010104716

终止标志位 FIN :用来释放 TCP 连接

例如:TCP 通过 “四报文挥手” 释放连接的过程

不管是 TCP 客户进程还是 TCP 服务器进程

  • 它们所发送出的 TCP 连接释放报文段首部中的终止标志位 FIN 都被置 1 1 1

    表明这是 TCP 连接释放报文段

image-20230108005325477

9、复位标志位 RST(1 bit)

image-20230108010053174

复位标志位 RST

  • 用来复位 TCP 连接。

  • RST=1 \texttt{RST=1} RST=1 时,表明 TCP 连接出现了异常,必须释放连接,然后再重新建立连接

  • RST 1 1 1 还用来拒绝一个非法的报文段或拒绝打开一个 TCP 连接。

10、推送标志位 PSH(1 bit)

image-20230108010040516

推送标志位 PSH

  • 接收方的 TCP 收到该标志位为 1 1 1 的报文段 会尽快上交应用进程 \color{red}会尽快上交应用进程 会尽快上交应用进程
  • 而不必等到接收缓存都填满后再向上交付。

11、紧急标志位 URG(1 bit) & 紧急指针字段(16 bit)

image-20230108010029435

首部中的紧急标志位 URG 和 紧急指针字段用来实现紧急操作

紧急标志位 URG

  • 取值为 1 1 1 时紧急指针字段有效;
  • 取值为 0 0 0 时紧急指针字段无效。

紧急指针:占 16 16 16 比特,以字节为单位,用来指明紧急数据的长度。

当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个 TCP 报文段中进行发送。

  • 紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。

接收方接收到紧急标志位 URG 1 1 1 的报文段

  • 会按照紧急指针字段的值从报文段数据载荷部分取出紧急数据,并 直接上交应用进程 \color{red}直接上交应用进程 直接上交应用进程
  • 而不必在接收缓存中排队

12、选项(长度可变)

image-20230108010222205

TCP 报文段首部除了 20 20 20 字节的固定部分,还有最大 40 40 40 字节的选项部分

增加选项可以增加 TCP 的功能

  • 最大报文段长度 MSS 选项 \color{blue}最大报文段长度 \texttt{MSS}选项 最大报文段长度MSS选项TCP 报文段数据载荷部分的最大长度。

  • 窗口扩大选项 \color{blue}窗口扩大选项 窗口扩大选项:为了扩大窗口(提高吞吐率)。

  • 时间戳选项 \color{blue}时间戳选项 时间戳选项

    • 用来计算往返时间 RTT

    • 用于处理序号超范围的情况,又称为防止序号绕回 PAWS

  • 选择确认选项 \color{blue}选择确认选项 选择确认选项:用来实现选择确认功能

13、填充

image-20230108010824204

填充:由于选项的长度可变,因此使用填充来 确保报文段首部能被 4 整除 \color{red}确保报文段首部能被4整除 确保报文段首部能被4整除

  • (因为数据偏移字段,也就是首部长度字段,是以 4 4 4 字节为单位的)。

若选项的长度加上 20 20 20 字节固定首部的长度不能能被 4 4 4 整除

  • 则需要使用填充字段来确保首部能被 4 4 4 整除

14、小结

image-20230108010848326

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

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

相关文章

ELAN设计理念:通过梯度路径分析设计网络设计策略

设计高效、高质量的表达性网络架构一直是深度学习领域最重要的研究课题。当今的大多数网络设计策略都集中于如何集成从不同层提取的特征,以及如何设计计算单元来有效地提取这些特征,从而增强网络的表现力。本文提出了一种新的网络设计策略,即…

Django框架MVT模型工作流程

Django 一、Django介绍 Django是一个开源的Web应用框架,由Python写成。采用了MTV的框架模式,它最初是被用来做CMS(内容管理系统)软件。 使用Django,程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序…

聚威新材在科创板被暂缓审议:毛利率高于同行,张天荣为董事长

2023年1月10日,上海证券交易所披露的信息显示,上海聚威新材料股份有限公司(下称“聚威新材”)被科创板上市委员会暂缓审议。据贝多财经了解,聚威新材仍有多个问题需进一步落实事项。 上市委要求聚威新材落实&#xff1…

YOLOv5进行水域游泳者检测系统源码+标注好的数据集

YoloV5对水域中游泳者进行检测 一、说明 1.1 项目说明 完整代码下载地址:YOLOv5进行水域游泳者检测系统源码标注好的数据集 本项目是使用 YoloV5 来训练自己的数据集,所以仅仅展示训练自定义数据集的过程。 本次视频检测的结果已经上传至B站&#x…

MATLAB-样条插值运算

MATLAB中不仅提供了一维插值、二维插值和三维插值方法,还提供了样条插值的方法。其主要思想是:假定有一组已知的数据点,希望找到该组数据的拟合多项式。在多项式的拟合过程中,对于每组相邻的样本数据点,存在一条曲线,该…

MCU-51:单片机之AD模数转换与DA数模转换

目录一、AD/DA介绍二、硬件电路模型2.1 模型2.2 硬件电路三、运算放大器3.1 运算放大器介绍3.2 运放电路四、DA原理4.1 T型电阻网络DA转换器:4.2 PWM型DA转换器:五、AD原理六、AD/DA性能指标七、XPT2046介绍7.1 功能说明7.2 XPT2046时序八、代码演示8.1 …

JAVA17连接sqlserver:驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

JAVA17连接sqlserver报错 : com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]”。 Clien…

【Java寒假打卡】Java基础-字节输入流和字节输出流

【Java寒假打卡】Java基础-字节输入流和字节输出流)概述字节输出流快速入门字节输出流的注意事项输出字节流-一次性写多个数据字节输出流的两个问题try-catch-finally捕获异常字节输入流写数据字节流读数据 一次性读取多个数据案例、文件复制使用字节数组进行拷贝文…

基于Springboot+vue+uni-app的校园失物招领平台源码+数据库,含主体PC端、微信小程序和web后台数据管理平台

校园失物招领网站 | lijinghai 项目介绍 📖 👉基于Springbootvueuni-app的校园失物招领平台. 含平台主体PC端、微信小程序和web后台数据管理平台. 完整代码下载地址:基于Springbootvueuni-app的校园失物招领平台源码数据库 失物招领信息一…

枚举算法实例应用(二)

枚举算法实例应用(二) Extended Lights Out Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons each). Each button has a light. When a button …

什么是云原生(非常详细)

云原生计算加速了应用与基础设施资源之间的解耦,通过定义开放标准,向下封装资源,将复杂性下沉到基础设施层;向上支撑应用,让开发者更关注业务价值。此外,云原生计算提供统一的技术栈,动态、混合…

LabVIEW创建Web服务

LabVIEW创建Web服务在LabVIEW项目中开发Web服务,组合并配置构成Web服务的VI和其他文件。按照下列步骤创建一个Web服务项目和两个HTTP方法VI。创建一个组织Web服务文件的LabVIEW项目。将项目保存为Tutorial.lvproj。右键单击我的电脑并选择新建Web服务。LabVIEW在该终…

C语言基本数据类型

一、float、double和 long double 1.1 声明浮点型变量 1.2浮点型常量 1.3 打印浮点值 二、复数和虚数类型 三、其他类型 一、float、double和 long double 对于金融和数学的程序经常使用浮点数,而C语言中的浮点类型有float、double和 long double类型。常见的…

CentOS Stream 9下RabbitMQ安装教程(最新RabbitMQ安装教程)

CentOS Stream 9 RabbitMQ安装教程前言Erlang下载安装RabbitMQ下载安装启动RabbitMQ配置RabbitMQManagement Plugin访问和权限日志文件和管理总结和收获如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!前言 操作系统:Cent…

RocketMQ消息短暂而又精彩的一生

核心概念 NameServer:可以理解为是一个注册中心,主要是用来保存topic路由信息,管理Broker。在NameServer的集群中,NameServer与NameServer之间是没有任何通信的。Broker:核心的一个角色,主要是用来保存消息…

刚录制德云社相声春晚,又带领徒弟排练京剧,郭德纲成功不是偶然

不知道大家有没有发现一种现象,很多人在底层的时候,都是削尖了脑袋往前钻,可是一旦有一天功成名就,就会刀兵入库马放南山。这种做法通俗地讲,就是功成名就激流勇退,比如马云、刘强东、黄征等互联网企业大佬…

【RabbitMQ】MQ的基本概念、RabbitMQ简介及安装

文章目录MQ的基本概念MQ概述MQ 的优势和劣势常见的MQ产品RabbitMQ简介RabbitMQ的安装1. 安装依赖环境2. 安装Erlang3. 安装RabbitMQ4. 开启管理界面及配置5. 启动6. 配置虚拟主机及用户用户角色Virtual Hosts配置创建Virtual Hosts设置Virtual Hosts权限MQ的基本概念 MQ概述 …

Python3,我把新年祝福写在“雨“中,你看,雨一直下,气氛还算融洽,在同个屋檐下....

新年愿望写在"雨"中1、引言2、代码实战2.1 模块介绍2.1.1 Pygame 介绍2.1.2 Pygame的display介绍2.1.3 Pygame的event介绍2.1.4 Pygame的font介绍2.2 代码示例3、总结1、引言 小屌丝:鱼哥,2023年了, 你有啥愿望啊? 小鱼…

同消费互联网时代的轰轰烈烈相比,产业互联网似乎低调了许多

毫无疑问的是,一场衍生于产业的深度变革正在上演。在这样一场深度变革之中,曾经看似无法改变的存在,有了进化的可能性;曾经让玩家们望而却步的领域,有了进军的可能性。如果对这样一场深度变革进行一次总结的话&#xf…

测试分类那么多,哪些是你最需要掌握的内容?

目录 一、按照测试对象分类 1.1、可靠性测试 1.2、容错性测试 1.3、安装卸载测试 1.4、内存泄漏测试 1.5、弱网测试 二、按照是否查看代码分类 2.1、黑盒测试(系统测试) 2.2、白盒测试(单元测试) 2.3、灰盒测试&#xff0…