43、TCP报文(一)

news2024/9/25 1:18:24

本节内容开始,我们正式学习TCP协议中具体的一些原理。首先,最重要的内容仍然是这个协议的封装结构和首部格式,因为这里面牵扯到一些环环相扣的知识点,例如ACK、SYN等等,如果这些内容不能很好的理解,那么后续学习中的连接建立、流量控制等知识就没办法学习下去了。


TCP报文的组成

经过前面的学习,我们至少已经知道了两件事情,一是TCP是具有可靠传输特性的传输层协议;二是使用TCP协议的传输层,其PDU是报文段(为什么是段,而不是整个的报文,我们后面学完UDP之后,会出一个对比和总结,此处先简单的把 报文段=报文 理解就可)。

TCP的报文段从整体来看,和IP数据包一样,也是首部+数据部分的格式,这里的首部自然就是TCP的协议首部,数据部分是上面的应用层传递下来的数据,如下图所示:


TCP首部结构

经过前面的数据链路层、网络层等协议封装格式的学习,就会发现一个规律:基本上每个协议所具有的功能都体现在其首部的各个字段当中。TCP协议也是不例外的,所以我们需要详细学习TCP的首部字段,不过限于篇幅,本节先学习其中的一部分。

首先来看TCP首部里面都包含哪些字段:

从图中可以看出,TCP报文的首部和IP数据包的首部有相似的地方,同样在最上方标注着每个字段占的长度是多少,例如第一个字段——源端口,长度为16个二进制位。另外,和IP首部一样,TCP也有20个字节的固定首部长度,也是最小首部长度,因为“选项”和“填充”两个字段是可选的,可以根据需要而增加

首先第一个和第二个字段,也就是源端口和目的端口,前面学过了端口号,在这里就好理解了。这两个字段的值指出了发送方自己的端口号和对方的端口号,比如一台主机的浏览器想要通过HTTP协议访问一个服务器的网址,那么其TCP首部中的源端口就是自己主机浏览器程序的随机端口号,目的端口就是HTTP的熟知端口80。

源端口和目的端口的字段长度都是16位,所以端口号的取值范围就是0—(2^16)-1,也就是0~65535,对应了我们前面学到的端口号范围。

下面一个字段叫“序号”,也叫“报文段序号”,这个字段的值表示本报文段的数据部分的第一个字节的编号。前面我们学过给报文编号,主要是为了让接收方能够区分开一个报文段是新发送的还是重传的,以便接收端进行报文的确认。在TCP协议中,一个报文段的序号就是其数据部分的第一个字节的编号,意思就是说:假设一个TCP报文的数据部分有100个字节,这些数据的编号是1~100,这就说明这个报文段的首部中“序号”值是1;同理,如果这些数据的编号要是101~200,那就说明这个报文段的首部中“序号”值是101。总之应当记住,“序号”字段的值是本报文段的数据部分的第一个字节的编号。

当然上面这些只是举例子为了方便理解,在实际当中的“序号”字段的值没有这么“随便”,不过序号字段的值确实是随机的,当通信双方应用程序建立TCP连接的时候,双方都会自动生成一个随机数作为初始序号,也就是说第一个字节的序号不一定必须是1。

然后我们看到,“序号”字段的长度是32位,也就意味着序号的取值范围是0—(2^32)-1,大概四千多万个。虽然有这么大的取值范围,但毕竟是有限的,在使用高速网络时有可能会出现序号重复使用的情况。如果出现序号重复,就会导致接收方区别不了一个报文段是新到达的还是由于网络拥堵而"迟到"的,为了解决这种问题,在TCP首部的“选项”字段中可以选择加上时间戳选项,时间戳的一个重要功能就是防止序号绕回(PAWS)。

“序号”字段下面紧接着是“确认号”字段,确认号的意思是:期望收到对方下一个报文的序号。要理解确认号,就要特别注意“期望”这两个字。比如说,还是上面的例子,发送方A把序号为101,数据部分有100个字节的报文段发送过来,接收方B接收下来以后,那么B就“期望着”后面的数据到来,于是B将会在发送给A的确认报文中,将首部中的“确认号”字段设置成201。这就是告诉发送方A:“到序号200为止的字节我都已经收到,现在我期望收到200后面的201号字节”。

“确认号”在后面走,是4位长度的“数据偏移”字段,数据偏移指的是本报文段中的数据部分距离报文首部开始有多少个字节,其实也就可以理解为“首部长度”。因为TCP虽然有固定首部20字节,但是如果加入了长度可变的“选项”字段,首部长度就不固定了,所以通过一个字段来指出首部的长度是有必要的。

另外需要知道的是,TCP的首部也有一个最大长度,和IP一样,都是60字节。因为“数据偏移”字段长度有4位,4个二进制位能表示的最大数是1111,也就是十进制的15,而且这里也是以4个字节为单位,15×4(字节)=60(字节),这就是TCP的首部最大长度。

“数据偏移”字段后面是6位的“保留”字段,保留为今后使用,其值在目前应设置为0。


本节关于TCP首部先学习到这里,下一节继续学习后面的字段。

参考教材:谢希仁《计算机网络》第八版

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

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

相关文章

A. Copil Copac Draws Trees(Codeforces Round 875 (Div. 1))

Copil Copac is given a list of n − 1 n-1 n−1 edges describing a tree of n n n vertices. He decides to draw it using the following algorithm: Step 0 0 0: Draws the first vertex (vertex 1 1 1). Go to step 1 1 1.Step 1 1 1: For every edge in the inpu…

号外号外,最经典的16S数据库Greengenes2更新啦!!!

没错,这是真的,沉积十年之后,多样性研究中最经典的16S数据库——Greengenes数据库,竟!然!更!新!了!惊不惊喜!意不意外! 遥想当年小编还是一个小白…

vue 数字递增(滚动从0到)

使用 html <Incremental :startVal"0" :endVal"1000" :duration"500" />js&#xff1a; import Incremental from /utils/num/numViewjs let lastTime 0 const prefixes webkit moz ms o.split( ) // 各浏览器前缀let requestAnimatio…

基于YOLOv5n/s/m不同参数量级模型开发构建茶叶嫩芽检测识别模型,使用pruning剪枝技术来对模型进行轻量化处理,探索不同剪枝水平下模型性能影响

今天有点时间就想着之前遗留的一个问题正好拿过来做一下看看&#xff0c;主要的目的就是想要对训练好的目标检测模型进行剪枝处理&#xff0c;这里就以茶叶嫩芽检测数据场景为例了&#xff0c;在我前面的博文中已经有过相关的实践介绍了&#xff0c;感兴趣的话可以自行移步阅读…

QT的设计器介绍

设计器介绍 Qt制作 UI 界面&#xff0c;一般可以通过UI制作工具QtDesigner和纯代码编写两种方式来实现。纯代码实现暂时在这里不阐述了在后续布局章节详细说明&#xff0c;QtDesigner已经继承到开发环境中&#xff0c;在工程中直接双击ui文件就可以直接在QtDesigner设计器中打…

AtCoder Beginner Contest 314 E题题解

文章目录 Roulettes问题建模问题分析1.分析每个转盘对所求的作用2.从集合的角度思考每个积分的贡献代码 Roulettes 问题建模 给定n个轮盘&#xff0c;每个轮盘上有p个积分&#xff0c;每次转动轮盘需要一定的代价&#xff0c;在转动轮盘后可以等概率获得p个积分中的一个&#…

【通俗易懂】如何使用GitHub上传文件,如何用git在github上传文件

目录 创建 GitHub 仓库 使用 Git 进行操作 步骤 1&#xff1a;初始化本地仓库 步骤 2&#xff1a;切换默认分支 步骤 3&#xff1a;连接到远程仓库 步骤 4&#xff1a;获取远程更改 步骤 5&#xff1a;添加文件到暂存区 步骤 6&#xff1a;提交更改 步骤 7&#xff1a…

频繁full gc 调参

Error message from spark is:java.lang.Exception: application_1678793738534_17900289 Driver Disassociated [akka.tcp://sparkDriverClient11.71.243.117:37931] <- [akka.tcp://sparkYarnSQLAM9.10.130.149:38513] disassociated! 日志里频繁full gc &#xff0c;可以…

nginx代理请求到内网不同服务器

需求&#xff1a;之前用的是frp做的内网穿透&#xff0c;但是每次电脑断电重启&#xff0c;路由或者端口会冲突&#xff0c;现在使用汉土云盒替换frp。 需要把公网ip映射到任意一台内网服务器上&#xff0c;然后在这台内网服务器上用Nginx做代理即可访问内网其它服务器&#xf…

微服务中间件--微服务保护

微服务保护 微服务保护a.sentinelb.sentinel限流规则1) 流控模式1.a) 关联模式1.b) 链路模式 2) 流控效果2.a) 预热模式2.b) 排队等待 3) 热点参数限流 c.隔离和降级1) Feign整合Sentinel2) 线程隔离2.a) 线程隔离&#xff08;舱壁模式&#xff09; 3) 熔断降级3.a) 熔断策略-慢…

Xshell安装使用教程安排~

简介 Xshell 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以在Windows界面下用来访问远端不…

蔚来李斌卖手机:安卓系统,苹果售价,一年一发

‍作者 | Amy 编辑 | 德新 车圈大佬的玩法真让人寻不着套路&#xff01; 苹果的库克和小米的雷布斯&#xff0c;甚至是FF贾老板准备许久&#xff0c;都想分一块新能源车的蛋糕&#xff0c;蔚来李斌却反手进军手机界&#xff0c;从宣布造手机到手机入网仅仅隔了一年。 近期…

微盟集团中报增长稳健 重点发力智慧零售AI赛道

零售数字化进程已从渠道构建走向了用户的深度运营。粗放式用户运营体系无法适应“基于用户增长所需配套的精细化运营能力”,所以需要有个体、群体、个性化、自动化运营——即在对的时候、以对的方式、把对的内容推给用户。 出品|产业家 2023年已经过半&#xff0c;经济复苏成为…

生信豆芽菜-两组比较的柱状图

网址&#xff1a;http://www.sxdyc.com/visualsPlotMutiBar 1、数据准备 准备一个两列的数据 2、输入图片的宽度和高度&#xff0c;如果这里选择不转置&#xff0c;选择颜色&#xff0c;这里的颜色个数由输入数据第一列分组的个数决定&#xff0c;如果选择转置&#xff0c;选…

随手笔记——g2o实现BA

随手笔记——g2o实现BA 说明源代码 说明 源代码 bundle_adjustment_g2o.cpp #include <g2o/core/base_vertex.h> #include <g2o/core/base_binary_edge.h> #include <g2o/core/block_solver.h> #include <g2o/core/optimization_algorithm_levenberg.h&…

MapReduce介绍

目录 ​一、什么是MapReduce 二、MapReduce 的设计思想 2.1 分而治之 2.2 构建抽象模型&#xff1a;Map和Reduce 2.3 隐藏系统层细节 三、MapReduce 的框架原理 3.1 MRv1工作原理 3.1.1 MRv1架构工作原理图 3.1.1.1 流程说明 3.1.1.1.1 作业的提交 3.1.1.1.2 作业的初始化 3…

在线客户评论——电商行业的终极销售人员

电子商务评论是最近购买或使用产品或服务的人对产品或服务的评估&#xff0c;是一种反馈&#xff0c;可帮助在线购物者做出更好的购买决策&#xff0c;帮助企业主完善其产品和服务范围。您的在线声誉取决于有多少客户喜欢您的品牌购物体验&#xff0c;那些与贵公司有积极互动的…

代码随想录算法训练营第四十二天|LeetCode 121,122

目录 LeetCode 121.买卖股票的最佳时机 动态规划五步曲&#xff1a; 1.确定dp[i][j] 的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方向 5.打印dp数组 LeetCode 122.买卖股票的最佳时间II 动态规划五步曲&#xff1a; 1.确定dp[i][j] 的含义 2.找出递推公式 3.初始化dp数组…

【C++起飞之路】类和对象 —— 类

类 ~ ~ ~ 一、面向过程和面向对象初步认识a. 面向过程编程b. 面向对象编程例如&#xff1a;无人机送货系统1、面向过程编程方式2、面向对象编程方式 二、类的引入1、定义类的关键字2、栈的手动实现a. C语言实现栈b. C实现栈 三、类的定义类的两种定义方式&#xff1a; 四、类的…

Linux6.40 Kubernetes 配置资源管理

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes 配置资源管理一、Secret1.Secret 四种类型1&#xff09;kubernetes.io/service-account-token2&#xff09;Opaque3&#xff09;kubernetes.io/dockerconfigjson4&#xff09;kubernetes.io/tls 2.Pod 需要先引用才能使用某…