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、流…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
