当前位置: 首页 > news >正文

TCP协议的报头格式和滑动窗口

文章目录

  • TCP报头格式
    • 端口号
    • 序号和确认序号
      • 确认应答(ACK)机制
      • 超时重传机制
    • 首部长度
    • 窗口大小
    • 报文类型
      • URG
      • ACK
      • SYN
      • PSH
      • FIN
      • RST
  • 滑动窗口
    • 滑动窗口的大小怎么设定怎么变化
    • 滑动窗口变化问题

TCP报头格式

image-20230811215559584

端口号

两个端口号比较好理解,通过端口号来找到指定的进程

序号和确认序号

先要认清这两个序号首先得了解TCP的确认应答(ACK)机制

确认应答(ACK)机制

根据生活例子来说,当我们再和别人聊天时需要得到对方的回复才能够确定对方能够听到我们的话。对于TCP通信也是如此,当一端向另一端发送数据后,对端收到数据后需要告诉发送端已经收到了,这样发送端才能够知道,因此作为接收端就会应答确保已经接收到数据了

这种机制就是确认应答机制

在真实的使用场景中,TCP发送端如果是一条数据发送后等收到接收端的应答再发送另一条数据,这样效率就非常的低。所以真实的场景中,发送端会一下子发送多条数据。那么为了确保每一条数据都被接收端接收到了,那么接收端就需要对应每一条数据都进行应答,那么如何保证接收端应答的是对应的数据。或者说如果发生了丢包,接收端不会应答该条数据那么作为发送端如何知道是哪一条数据没有收到接收端的应答呢

这就引进了序号和确认序号的概念:

序号可以用来标识数据之间的不同,接收端收到数据后应答该条数据就会返回确认序号,而这个确认序号就是数据序号+1 。这样的目的是告诉发送端下次发送数据的序号从这个确认序号开始。

有了序号和确认序号的配合后,应答机制就能保证应答的是指定的数据

需要注意:接收方应答了一个确认序号后,就代表着这个确认序号之前的所有序号的数据都已经接收到。

也就是说假如接收端接收到了序号1000和3000的数据,但是没有收到2000的数据,那么接收端应答的确认序号只会是1001。那么这里又得引出一个概念:

超时重传机制

根据上述的例子,如果接收端没有收到2000的数据,那它就只会发送1001的应答。那么作为发送端迟迟都等不来2000的数据的应答,那发送端就会意识到数据丢包了。这时候作为发送端就会再次向接收端发送数据。

关于数据丢包就会出现另一种情况,上述的情况是发送端发送的数据丢包了。那么如果接收端接收到了数据,但是它发送的应答丢包了呢。这种情况同样会导致发送端迟迟收不到应答而重新发送数据,那假如应答老是丢包那么发送端就会发送很多份相同的数据,这时候作为接收端就会收到很多重复的数据。所以接收端需要对数据去重,而去重就可以利用序号实现,因为每个相同的数据都会有相同的序号

image-20230811222432166

首部长度

  1. TCP协议的报头是有标准长度的也就是最少长度,长度为20字节。因此读取时首先会读取20字节
  2. 首部长度为4个比特位,也就是说范围在[0000 - 1111]也就是[0 - 15]
  3. TCP报头的总长度 = 首部长度 * 4字节
  4. 因为TCP协议的标准长度为20字节,因此首部长度初始为5(0101)

窗口大小

首先的了解TCP协议发送数据和读取数据是在哪里得到的。

事实上,接收端调用read函数将数据读取并不是从TCP的报文中读取的,而是从一个缓冲区中也就是接收缓冲区中读取的。而发送端调用write函数写数据发送也不是直接写到TCP的报文中,而是写到发送缓冲区中

那么对于缓冲区而言就必定有大小,窗口大小就是指接收缓冲区的大小。TCP的报头中要含有自己缓冲区剩余的大小,为了告诉发送端自己的缓冲区大小还剩多少,让发送端做出发送策略调整,防止出现发送的太快导致来不及读使得缓冲区满了,也不能发的太慢

报文类型

事实上,TCP的报文也是有类型的,接收端要根据不同类型的报文做出不同的动作

image-20230811223736461

这几个就对应着TCP不同的报文类型,而这几个都是一位来着,置1或置0

URG

数据对于接收方而言,乱序就是不可靠的现象。所以要对收到的数据进行排序,因为报文是有序号的所以可以保证数据的按序到达。那么如果需要排队那就难免会有需要插队的情况。

URG:代表着有需要尽快读取的数据

而这个要配合这紧急指针使用,通过紧急指针知道一个偏移量在报文的有效数据中通过偏移量找到该数据

ACK

ACK用于建立连接时应答确认

SYN

用于请求连接

PSH

催促接收端尽快读取数据,避免缓冲区满

FIN

用于断开连接请求

RST

由于连接并不一定会成功,RST就用于重置连接

滑动窗口

因为发送端发出数据后接收端不一定会接收到数据,也就是出现丢包。因此发送端在发送出去数据后并不能直接将数据抹除,需要等待接收端应答后才可以抹除。那么这份数据保存在哪里呢?

这种数据就保存在滑动窗口中

image-20230811225908424

图中为缓冲区的分布,其中中间部分就是滑动窗口

滑动窗口的大小怎么设定怎么变化

对于缓冲区本质上就是一个数组,所以滑动窗口就有这个数组中的两个下标控制大小

image-20230811230408810

而决定缓冲区的大小和接收端的接受能力有关,也就是不管未来滑动窗口怎么变化都一定要保证在接收端的接受范围内。

因为数据都是有数据序号的,因此滑动窗口的变化:win_start = 应答收到的数据确认序号,win_end = win_start + 对端的窗口大小

滑动窗口变化问题

窗口会往左移动吗?

答案肯定是不会的

窗口一定会向右移动吗?

肯定窗口的变化可以得出,只有收到应答时窗口才会滑动,所以也有可能是不动的,但是如果动了一定是向右动

滑动窗口移动的本质就是数组下标的更新,所以窗口有可能会不动的

同样窗口也有可能变成0,例如对方的缓冲区满了

如果一直移动,空间不够了怎么办

针对这个问题,操作系统内核将发送缓冲区组织为环形结构了

相关文章:

TCP协议的报头格式和滑动窗口

文章目录 TCP报头格式端口号序号和确认序号确认应答(ACK)机制超时重传机制 首部长度窗口大小报文类型URGACKSYNPSHFINRST 滑动窗口滑动窗口的大小怎么设定怎么变化滑动窗口变化问题 TCP报头格式 端口号 两个端口号比较好理解,通过端口号来找…...

java 使用log4j显示到界面和文件 并格式化

1.下载log4j jar包https://dlcdn.apache.org/logging/log4j/2.20.0/apache-log4j-2.20.0-bin.zip 2. 我只要到核心包 ,看需要 sources是源码包,可以看到说明。在IDEA里先加入class jar后,再双击这个class jar包或或右键选Navigate ,Add ,…...

【js】链接中有多余的怎么取出参数值

https://pq.equalearning.net/assessment/379208869278126080?userId23ebb&originhttps://www.equalearning.net&fnameIm&lnamehappy在上面的例子中,fnameI’m,其中单引号’被转义为, 而如果使用下面的代码,因为在UR…...

Verdi_traceX and autotrace

Verdi_traceX and autotrace Trace X From nWave/nTrace of from the Teporal Flow View. Show Paths on Flow ViewShow Paths on nWave 若Waveform中有X态,鼠标右键会有Trace X的选项; 会自动打开Temporal Flow View窗口,展示对应路径&am…...

安卓逆向 - 某严选app sign算法还原

本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除! 目标app: 5ouN5ouN5Lil6YCJMy45LjY 目标接口:aHR0cHM6Ly9hcGkubS5qZC5jb20vYXBp 一、引言 1、本篇分析某二手交易平台 …...

arcgis数据采集与拓扑检查

1、已准备好一张配准好的浙江省行政区划图,如下: 2、现在需要绘制湖州市县级行政区划。需要右击文件夹新建文件地理数据库,如下: 其余步骤均默认即可。 创建好县级要素数据集后,再新建要素类,命名为县。 为…...

【前端 | CSS】滚动到底部加载,滚动监听、懒加载

背景 在日常开发过程中,我们会遇到图片懒加载的功能,基本原理是,滚动条滚动到底部后再次获取数据进行渲染。 那怎么判断滚动条是否滚动到底部呢?滚动条滚动到底部触发时间的时机和方法又该怎样定义? 针对以上问题我…...

word将mathtype公式批量转为latex公式

最近,由于工作学习需要,要将word里面的mathype公式转为latex公式。 查了查资料,有alt\的操作,这样太慢了。通过下面链接的操作,结合起来可以解决问题。 某乎:https://www.zhihu.com/question/532353646 csd…...

docker-compose部署nacos 2.2.3

1、编写docker-compose.yml文件 version: "3.1" services:nacos:restart: alwaysimage: nacos/nacos-server:v2.2.3container_name: nacosenvironment:- NACOS_AUTH_ENABLEtrue- MODEstandalone- NACOS_AUTH_TOKEN8b92c609089f74db3c5ee04bd7d4d89e8b92c609089f74db…...

软件测试52讲-学习笔记

测试基础知识篇(11讲) 01 你真的懂测试吗?从“用户登录”测试谈起 测试用例设计框架 基于功能性需求和非功能性需求思考: 功能性需求使用等价类划分、边界值分析、错误推断法设计用例 非功能性需求考虑安全(信息的保存…...

【ARM 嵌入式 编译系列 4 -- GCC 编译属性 __read_mostly 详细介绍】

文章目录 __read_mostly 介绍__read_mostly 在 linux 中的使用.data.read_mostly 介绍 __read_mostly 介绍 __read_mostly 是一个在Linux内核编程中用到的宏定义,这是一个gcc编译器的属性,用于告诉编译器此变量主要用于读取,很少进行写入&am…...

Maven在IDEA2021版本中全局配置(一次配置处处生效)

前言 我们在开发中,Maven是必不可少的,但是每次都需要设置一遍Maven的仓库和settings.xml。真的是心累,今天教大家全局配置一下。再也不要每次项目都配了,Maven还经常出问题。 解决方案 友情提示:小编的IDEA版本为2…...

名侦探番外——Arduino“炸弹”引爆摩天大楼

名侦探番外——Arduino“炸弹”引爆摩天大楼 硬件准备1.材料准备2.模块介绍 电路设计1.硬件接线 程序设计1.设计思路2.部分程序3.功能优化 总结 好久不见,童鞋们!小编突然想到很久以前看的柯南剧场版——计时引爆摩天大楼的情景,对剧里的“炸…...

自适应AI chatgpt智能聊天创作官网html源码

我们致力于开发先进的自适应AI智能聊天技术,旨在为用户提供前所未有的聊天体验。通过融合自然语言处理、机器学习和深度学习等领域的顶尖技术,我们的智能聊天系统能够准确理解用户的需求并给出相应的回应。 我们的自适应AI智能聊天系统具备以下核心特点…...

防抖,节流

概念 防抖(debounce):类似法师技能读条,读条没完再按技能就会重新读条,在触发后的n秒内只会执行一次,若在这n秒内重复触发则重新计算 节流(throttle):连续发生的事件在n秒内只执行一次函数 参考 【前端面试必问】—…...

【Linux】多线程1——线程概念与线程控制

文章目录 1. 线程概念什么是线程Linux中的线程线程的优点线程的缺点线程的独立资源和共享资源 2. 线程控制Linux的pthread库用户级线程 📝 个人主页 :超人不会飞)📑 本文收录专栏:《Linux》💭 如果本文对您有帮助&…...

【Maven】SpringBoot项目使用maven-assembly-plugin插件多环境打包

SpringBoot项目使用maven-assembly-plugin插件多环境打包 1.创建SpringBoot项目并在pom.xml文件中添加maven-assembly-plugin配置 <!-- 多环境配置 --><profiles><!-- 开发环境 --><profile><id>dev</id><properties><prof…...

指令集_基础

指令集-基础 一、提示过程1,文章摘要2&#xff0c;数学问题求解 二、角色提示三、多范例提示 一、提示过程 指导人工智能&#xff0c;执行任务的过程&#xff0c;称为提示过程。向AI 提供一组指令&#xff08;提示&#xff09;&#xff0c;然后它执行任务 1,文章摘要 例如&a…...

学习Vue:数据绑定的基本概念

在 Vue.js 中&#xff0c;Vue 实例是您构建应用程序的核心。它允许您将数据和界面连接起来&#xff0c;实现动态的数据绑定&#xff0c;使您的应用程序能够根据数据的变化自动更新界面。让我们来深入了解 Vue 实例与数据绑定的基本概念。 Vue 实例与数据绑定 什么是 Vue 实例&…...

Python 装饰器 - 推导式(列表推导式) - 迭代器 - 生成器 - 闭包

目录 推导式 1、列表推导式&#xff08;用得最多的&#xff09; 给你一个列表&#xff0c;求所有数据的绝对值 列表推导式跟if运算 打印50以内能被3整除的数的平方&#xff08;filter&#xff09;&#xff08;if的使用&#xff09; 找到1000以内开平方的结果是整数的数&am…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...