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…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...