43、TCP报文(一)
本节内容开始,我们正式学习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首部先学习到这里,下一节继续学习后面的字段。
参考教材:谢希仁《计算机网络》第八版
相关文章:

43、TCP报文(一)
本节内容开始,我们正式学习TCP协议中具体的一些原理。首先,最重要的内容仍然是这个协议的封装结构和首部格式,因为这里面牵扯到一些环环相扣的知识点,例如ACK、SYN等等,如果这些内容不能很好的理解,那么后续…...

【JavaScript】使用js实现滑块验证码功能与浏览器打印
滑块验证码 效果图: 实现思路: 根据滑块的最左侧点跟最右侧点, 是否在规定的距离内【页面最左侧为原点】,来判断是否通过 html代码: <!DOCTYPE html> <html><head><title>滑动图片验证码&…...

【使用群晖远程链接drive挂载电脑硬盘】
文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…...

easyx图形库基础4:贪吃蛇
贪吃蛇 一实现贪吃蛇:1.绘制网格:1.绘制蛇:3.控制蛇的默认移动向右:4.控制蛇的移动方向:5.生成食物6.判断蛇吃到食物并且长大。7.判断游戏结束:8.重置函数: 二整体代码: 一实现贪吃蛇…...

哈夫曼树(赫夫曼树、最优树)详解
目录 哈夫曼树(赫夫曼树、最优树)详解 哈夫曼树相关的几个名词 什么是哈夫曼树 构建哈夫曼树的过程 哈弗曼树中结点结构 构建哈弗曼树的算法实现 哈夫曼树(赫夫曼树、最优树)详解 哈夫曼树相关的几个名词 路径:…...

智慧建筑工地平台,通过信息化技术、物联网、人工智能技术,实现对施工全过程的实时监控、数据分析、智能管理和优化调控
智慧工地是指通过信息化技术、物联网、人工智能技术等手段,对建筑工地进行数字化、智能化、网络化升级,实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量,降低施工成本…...

Springboot 实践(8)springboot集成Oauth2.0授权包,对接spring security接口
此文之前,项目已经添加了数据库DAO服务接口、资源访问目录、以及数据访问的html页面,同时项目集成了spring security,并替换了登录授权页面;但是,系统用户存储代码之中,而且只注册了admin和user两个用户。在…...

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取
OpenCV-Python中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…...
leetcode原题 后继者:找出二叉搜索树中指定节点的“下一个”节点
题目: 设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。 如果指定节点没有对应的“下一个”节点,则返回null。 示例: 输入: root [2,1,3], p 1 2 / \ 1 3 输出: 2 解题思路…...
pyqt5 QlineEdit 如何设置只能输入数字
在 PyQt(Python中的一个GUI库)中,可以使用QLineEdit小部件的setValidator()方法来限制用户输入的内容。要让QLineEdit只能输入数字,你可以使用QIntValidator或QDoubleValidator。下面是一个示例代码,展示如何设置只能输…...

ubuntu中安装python
最简单方便的是 apt 使用第三方的 ppa 源,然后直接 apt 安装 python3.9 安装 software-properties-common 获取add-apt-repository命令:apt install -y software-properties-common添加第三方的 ppa 源:add-apt-repository ppa:deadsnakes/p…...

LeetCode150道面试经典题-- 快乐数(简单)
1.题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&am…...
科研论文配图----第一章笔记
第一章笔记 科研论文的绘制基础 科研论文配图的分类与构成 根据呈现方式,科研论文配图可分为线性图、灰度图、照片彩图和综合配图 4 种类型。 其中,线性图是主要和常用的配图类型,也是本书重点介绍的配图类型。 科研论文配图的格式和尺寸 格…...

OpenHarmony Meetup 广州站 OpenHarmony正当时—技术开源
招募令 OpenHarmony Meetup 广州站 火热招募中,等待激情四射的开发者,线下参与OpenHarmonyMeetup线下交流 展示前沿技术、探讨未来可能、让你了解更多专属OpenHarmony的魅力 线下参与,先到先得,仅限20个名额! 报名截止时间8月23日…...
如何使用PHP Smarty模板实现静态页面生成
首先,你需要从Smarty官网下载这个神奇的文件。然后,你需要在你的PHP文件中引入Smarty类。就像这样: require_once(Smarty.class.php);现在,我们要创建一个Smarty实例。这就像打开一个新的文件,只不过这个文件是可以和…...

【 Cocos Creator 项目实战】益智游戏《2048》(附带完整源码工程)
本文乃Siliphen原创,转载请注明出处 目录 游戏介绍 概述 游戏整体流程 游戏框架设计 主要流程控制类 本文项目的代码组织结构 构建游戏世界 数字方块 地图 触摸手势识别 防触摸抖动 判断用户输入的方向 地图 任意大小的地图 初始化地图大小 地图绘制…...

剑指Offer68-II.二叉树的最近公共祖先 C++
1、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以…...

【JAVA】我们该如何规避代码中可能出现的错误?(一)
个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言三种类型的异常异常处理JAVA内置异常类Exception 类的层次 前言 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的&…...

openLayers实战(八):坐标系及其转换
坐标系介绍 EPSG: 3857 --web地图,基于球体的、web墨卡托投影(伪墨卡托投影Pseudo-Mercator)的投影坐标系,范围为纬度85度以下,由于google地图最先使用而成为事实标准。至今,大多互联网地图都使用EPSG3857&…...

DAY06_SpringBoot—简介基础配置yaml多环境开发配置整合第三方技术
目录 一 SpringBoot简介1. 入门案例问题导入1.1 入门案例开发步骤1.2 基于SpringBoot官网创建项目1.3 SpringBoot项目快速启动 2. SpringBoot概述问题导入2.1 起步依赖2.2 辅助功能 二 基础配置1. 配置文件格式问题导入1.1 修改服务器端口1.2 自动提示功能消失解决方案1.3 Spri…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...