44、TCP报文(二)
接上节内容,本节我们继续TCP报文首部字段含义的学习。上节为止我们学习到“数据偏移”和“保留”字段。接下来我们学习后面的一些字段(暂不包含“检验和”的计算方法和选项字段)。
TCP首部结构(续)

“数据偏移”和“保留”字段的后面,紧挨着是六个控制位,这六个控制位在整个TCP报文中起着举足轻重的作用。
为什么把这六个称做控制位呢?因为它们有两个特点:第一,每一个控制位的取值都是只有0和1,也就是相当于日常生活中的控制开关,只有开和关两种状态。第二,其中有些控制位的作用就是能够控制首部中其它的字段,比如其中的ACK位,只有把它的值设置为1,“确认号”字段的值才能有效,如果ACK位设置为0,“确认号”字段的值就是无效的了。
控制位
1、控制位第一个是URG,也叫“紧急位”。这个位是配合后面的“紧急指针”字段使用的,只有URG位的值设置为1时,首部中的“紧急指针”字段才有效。
这时候就有问题了,为什么需要“紧急”呢?什么样的数据是“紧急数据”呢?比如说,本地主机A有一个程序要在远程的主机B上运行,在运行过程中,突然想起这个程序是有病毒的,因此A必须立即停止运行,例如按下ctrl+c键中断程序的运行。ctrl+c中断命令就属于是紧急数据,也就相当于优先级高的数据,TCP对这类数据应当尽快地传输,把它放到本报文段数据的最前面,而不要再按先后顺序。如果按先后顺序的话,紧急数据到达以后,程序已经运行完了,也就没什么意义了。
2、控制位第二个是ACK,也叫“确认位”。仅当这个位的值设置为1时,“确认号”字段的值才有效,所以TCP也规定,在连接建立后所有传送的报文段都必须把ACK位设置为1。
3、第三个控制位是PSH,也叫“推送位”。这个操作一般很少使用,它主要是用于交互式通信的情况。比如在一端的应用程序输入一些命令后希望立刻得到对方的回应,这时候可以把PSH位设置为1,TCP就会立即创建一个报文段发送出去,接收方收到后也会尽快的把这个报文段交付给应用进程。
4、第四个是RST位,也叫“重置位”,是用来重置一条TCP连接的。当RST位的值设置为1时,表示这条TCP连接出了很严重的差错(例如主机崩溃)时需要释放这条连接,然后再建立一条新的连接。
5、第五个是SYN位,也叫“同步位”,报文段的SYN位设置为1主要是用在建立TCP连接的时候,建立连接的请求发发出请求,接受方接受建立请求的时候,都要把报文的SYN位设置为1进行交互。
6、最后一个控制位是FIN位,也叫“终止位”,看字面意思就知道这个控制位表示的是释放一条TCP连接。当FIN位的值为1时,表示发送方的数据都已经发送完毕,可以释放连接了。
窗口
6个控制位的后面挨着,是16个二进制位长度的“窗口”字段。我们前面已经学过发送窗口和接收窗口,窗口的本质也就是数据缓存空间的大小。而在TCP报文首部中,“窗口”字段的值指的应该是接收窗口的大小。因为接收窗口的大小是可以限制发送窗口的大小的,接收方把自己接收窗口的大小写在TCP首部中,让发送方在发送数据的时候必须考虑到接收方目前有多大的缓存容量可以接收。
举个例子,发送了一个报文段,其窗口字段的值是1000,这也就是告诉对方:现在我的接收缓存容量还有1000个字节,允许你再最多发送1000个字节,否则我就接收不了了。
读到这里,我们应该提醒两件事情:
第一,发送窗口并不是单纯的相当于“发送方的窗口”,同理,接收窗口也并不是单纯的等于“接收方的窗口”,因为现在的网络通信大多数都是全双工通信,双方在同时都可以收发,是双向交互的,也就是双方互为发送方和接收方。我们在前面一直在区分发送方和接收方,只是为了叙述原理的方便。
因此发送方也有接收窗口(因为接收来自对方发来的确认),同理接收方也有发送窗口(因为要给对方发送确认报文)。
第二,窗口值的大小并不是固定不变的。因为接收方也是一直在处理自己的接收缓存中的数据,所以接收缓存是动态变化着的。
检验和
接下来,“窗口”字段的后面是“检验和”字段,检验和的作用是通过一种算法来校验当前报文中的数据在传输过程中有没有出现错误。由于TCP和UDP的检验和计算方法一致,所以具体的方法我们在后面学到UDP的时候放在一起介绍。
紧急指针
“紧急指针”字段,刚才在学习URG控制位的时候已经见到过,只有当URG=1时,紧急指针字段才有效。配合URG位,那么紧急指针字段的值应该是紧急数据的末尾在报文段中的位置,因为紧急数据要被插入在数据的最前面,所以其实这个字段也就相当于指出了紧急数据占多少个字节。另外,需要记住的一点是:即使窗口值为零时,也可以发送紧急数据,因为紧急数据的优先级高,就像生活中的手机欠费了也能拨打110。
选项(长度可变)和填充
“选项”和“填充”不属于TCP的固定首部,因此这两个字段是可选的。其中,选项是长度可变,不过我们上一节说到过,TCP首部最大60个字节,减去固定首部20字节,那么选项字段最大也就是能达到40字节。选项包括了TCP的一些附加功能,下节我们学习常用的几个选项。最后的填充字段,就是为了在使用长度可变的选项之后,能够保证整个TCP首部的长度是4字节的整数倍。
本节我们学习了TCP首部的其余的字段,主要是6个控制位和窗口值比较重要。下一节我们学习TCP常用的选项,作为这一部分的收尾。
参考教材:谢希仁《计算机网络》第八版
相关文章:
44、TCP报文(二)
接上节内容,本节我们继续TCP报文首部字段含义的学习。上节为止我们学习到“数据偏移”和“保留”字段。接下来我们学习后面的一些字段(暂不包含“检验和”的计算方法和选项字段)。 TCP首部结构(续) “数据偏移”和“保…...
目标检测(Object Detection)
文章目录 1. 目标检测1.1 目标检测简要概述及名词解释1.2 IOU1.3 TP TN FP FN1.4 precision(精确度)和recall(召回率) 2. 边框回归Bounding-Box regression3. Faster R-CNN3.1 Faster-RCNN:conv layer3.2 Faster-RCNN&…...
vue中实现文字检索时候将搜索内容标红
实现结果 html: <div class"searchBox"><span class"bt">标  题</span><div class"search"><div class"shuru"><!-- <span class"title">生产经营<…...
PCL protocol composition logic
PCL 协议组合逻辑 一 主体(principal)和线程(thread)的区分 1.主体:指 **协议的参与者,用X^来表示。**每个主体可以扮演一个或多个角色,如 InitCR和RespCR ; 2.线程:主…...
聊聊看React和Vue的区别
Vue 更适合小项目,React 更适合大公司大项目; Vue 的学习成本较低,很容易上手,但项目质量不能保证...... 真的是这样吗?借助本篇文章,我们来从一些方面的比较来客观的去看这个问题。 论文档的丰富性 从两个…...
OSPF在广播类型的网络拓扑中DR和BDR的选举
指定路由器(DR): 一个网段上的其他路由器都和指定路由器(DR)构成邻接关系,而不是它们互相之间构成邻接关系。 备份指定路由器(BDR): 当DR出现问题,由BDR接…...
系统学习Linux-Mariadb高可用MHA
概念 MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大程度上…...
慢SQL的原因
如何排查慢SQL问题 识别慢SQL:使用数据库性能监控工具,如慢SQL日志,识别耗时较长的查询。执行计划分析:使用数据库提供的分析工具,例如EXPLAIN来查看查询的执行计划,判断是否存在全表扫描,索引…...
php正则替换文章的图片
要使用正则表达式替换文章中的图片链接,可以按照以下步骤进行操作: 1. 获取文章内容:首先,你需要获取包含图片链接的文章内容。你可以从文件中读取文章,或者从数据库中检索文章内容。 2. 使用正则表达式匹配图片链接…...
57 | TAPTAP客户端分析
TAPTAP客户端分析 一、用户群分析 首先,TapTap用户群可分为三大类: 游戏爱好者游戏发烧者游戏开发者(次要用户,有开发者后台,可以显示数据,不重点分析)注:爱好者与发烧者区别在于,前者是用空余时间来玩游戏,时间不如后者充足,且后者更执着于游戏,游戏种类更多。 …...
开源了一套基于springboot+vue+uniapp的商城,包含分类、sku、商户管理、分销、会员、适合企业或个人二次开发
RuoYi-Mall-JAVA商城-电商系统简介 开源了一套基于若依框架,SringBoot2MybatisPlusSpringSecurityjwtredisVueUniapp的前后端分离的商城系统, 包含分类、sku、商户管理、分销、会员、适合企业或个人二次开发。 前端采用Vue、Element UI(ant…...
Android进阶之多级列表
遇到一个需求需要显示多级列表,因为界面是在平板上的,所以层级是从左向右往下排的,类似于 我当时的写法是在xml布局里一个个RecyclerView往下排的 当然前提是已经规定好最大的层级我才敢如此去写界面,如果已经明确规定只有两级或…...
Stochastic: Distribution-Expectation-Inequalities
见:https://www.math.hkust.edu.hk/~makchen/MATH5411/Chap1Sec2.pdf...
Java算法_ 二叉树的最大深度(LeetCode_Hot100)
题目描述:给定一个二叉树 ,返回其最大深度。root 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 获得更多?算法思路:代码文档,算法解析的私得。 运行效果 完整代码 /*** 2 * Author: LJJ* 3 * Date: 2023/…...
行业追踪,2023-08-18
自动复盘 2023-08-18 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
js将项目中的图片上传到服务器
项目上有时候会有奇怪的需求,比如前端有一些示例,想点击按钮就能上传图片,而这个图片是在前端的项目中的,如果不上传吧,又获取不到一些业务数据的id,但后端又不想为这块功能做特殊的处理,这时想通过前端直接上传到后端,需要file对象才可以。 这个时候我们需要将img转换…...
【C语言】指针的进阶
目录 一、字符指针 二、指针数组 三、数组指针 1.数组指针的定义 2.&数组名和数组名区别 3.数组指针的使用 四、数组参数与指针参数 1.一维数组传参 2.二维数组传参 3.一级指针传参 4.二级指针传参 五、函数指针 六、函数指针数组 七、指向函数指针数组的指针…...
【Windows系统编程】03.远线程注入ShellCode
shellcode:本质上也是一段普通的代码,只不过特殊的编程手法,可以在任意环境下,不依赖于原有的依赖库执行。 远程线程 #include <iostream> #include <windows.h> #include <TlHelp32.h>int main(){HANDLE hPr…...
第1天----验证一个字符串是否是另一个字符串的子串
本文我们将学习如何去验证一个字符串是否是另一个字符串的子串。 一、小试牛刀: 题目描述 输入两个字符串,验证其中一个串是否为另一个串的子串。 输入格式 两行,每行一个字符串。 输出格式 若第一个串 s 1 是第二个串 s 2 的子串,…...
项目实战第四十三讲:使用模版模式优雅实现财务编辑费用
项目实战第四十三讲:财务编辑费用 本文是项目实战第43讲:使用模版模式优雅实现财务编辑费用。支持查看司机填写费用信息,并且附件管理支持展示司机上传费用照片。 文章目录 项目实战第四十三讲:财务编辑费用1、项目背景2、主要技术3、项目职责4、项目实现4.1、表结构4.2、流…...
AI大模型时代:微店商品数据API如何重构反向海淘决策
在AI大模型时代,微店商品数据API凭借覆盖下沉市场、小众货源、私域供给的独特优势,成为重构反向海淘决策的核心支撑,将传统“人工经验判断”升级为“数据采集→AI分析→自动决策→反馈优化”的全链路数据驱动模式,大幅提升选品精准…...
OpCore-Simplify:三步解决黑苹果配置难题的零代码自动化工具
OpCore-Simplify:三步解决黑苹果配置难题的零代码自动化工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 问题诊断:黑苹果配…...
GHelper:华硕笔记本轻量级替代方案与性能优化指南
GHelper:华硕笔记本轻量级替代方案与性能优化指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, …...
Kodi PVR IPTV Simple全方位应用指南:从入门到精通的多场景解决方案
Kodi PVR IPTV Simple全方位应用指南:从入门到精通的多场景解决方案 【免费下载链接】pvr.iptvsimple IPTV Simple client for Kodi PVR 项目地址: https://gitcode.com/gh_mirrors/pv/pvr.iptvsimple 一、场景痛点分析:当IPTV体验不如预期时&…...
技术揭秘:QtScrcpy如何实现跨平台Android投屏与低延迟控制
技术揭秘:QtScrcpy如何实现跨平台Android投屏与低延迟控制 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScr…...
comsol的单相变压器绕组及铁芯振动形变仿真模型 1、单相变压器组振动形变模型:绕组在漏磁场...
comsol的单相变压器绕组及铁芯振动形变仿真模型 1、单相变压器组振动形变模型:绕组在漏磁场的洛伦兹力作用下振动,在长期作用下发生位移形变 2、单相变压器铁芯振动形变模型:铁芯在磁致伸缩作用下发生振动形变 注:时域仿真可以设置观察点,导出随时间变化…...
Intel XE核显PyTorch环境搭建避坑指南
1. 为什么选择Intel XE核显跑PyTorch? 最近很多小伙伴都在问,用Intel XE核显跑PyTorch到底靠不靠谱?作为一个在AI领域摸爬滚打多年的老司机,我可以很负责任地告诉你:完全可行!特别是对于预算有限的学生党&a…...
FreeRTOS数据通信避坑指南:为什么我的MessageBuffer总是接收失败?
FreeRTOS消息缓冲区实战:从接收失败到高效通信的深度解析 第一次在FreeRTOS项目中使用MessageBuffer时,我遇到了一个令人抓狂的问题——明明发送端显示消息已成功写入,接收端却总是返回0字节。调试器显示缓冲区非空,但xMessageBuf…...
从裸机到RTOS:IMX6ULL启动流程与FreeRTOS源码实战解析
1. IMX6ULL裸机启动机制详解 第一次拿到IMX6ULL开发板时,很多人会疑惑:为什么我的程序烧录进去没反应?这得从芯片的启动机制说起。IMX6ULL上电后最先执行的并不是我们写的代码,而是芯片内部ROM中的固化程序。这个ROM代码就像个尽职…...
FairyGUI在CocosCreator中的高级应用:异步加载、事件处理与性能优化技巧
FairyGUI在CocosCreator中的高阶实战:异步架构设计与性能调优全指南 当你的CocosCreator项目UI复杂度达到临界点时,传统的资源加载和事件处理方式往往会成为性能瓶颈。FairyGUI作为专业UI解决方案,其深度集成能力可以彻底改变这种局面——但真…...
