DJ3-4 传输层(第四节课)
目录
一、TCP 概述
二、TCP 报文段的首部字段格式
三、TCP 往返时延的估计和超时
1. 估计往返时间
2. RTT 估计例子
3. 估计往返时间的偏差
4. 设置重传超时间隔
一、TCP 概述
全双工服务:允许在同一时间同一连接上,数据能够双向传输。注意:TCP 可从缓存中取出并放入报文段中的数据数量受限于最大报文段长度(maximum segment size, MSS)
点到点:一个发送者,一个接收者;可靠按序的字节流。
面向连接:在数据交换前握手(交换控制信息),初始化发送方和接收方的状态。
没有 “信息边界”:假设我们需要发三个数据包,TCP 可能会因受限于 MSS 而把这三个包截断并组合后再发出。而 UDP 不会这样做,首先 UDP 会限制分组的大小从而使其适合发送,其次分组之间是相互独立的。因此,在 UDP 传输中不会出现把数据包截断的情况。
流量控制:使发送方不会淹没接收方。
TCP 拥塞和流量控制:
- 设置窗口大小
- 设置收发缓冲区
二、TCP 报文段的首部字段格式
TCP 报文段的构成:
- 首部字段
- 一个数据字段,包含了一块应用数据
MSS 限制了报文段数据字段的最大长度。
1. 源端口号和目的端口号
用于多路复用/分解来自或送到上层应用的数据。注意:发送时是多路复用,接收时是多路分解。
2. 序号和确认号
1)序号
序号 = 该报文段的第一个字节在字节流中的位置编号
一条 TCP 连接的双方均可随机地选择初始序号。
TCP 采用的是可靠按序的字节流:序号是建立在传送的字节流之上,而不是建立在传送的报文段的序列之上。换句话说,TCP 是以字节为单位来编号的,而不是以报文段为单位来编号。
2)确认号
主机 A 填充进报文段的确认号是主机 A 期望从主机 B 收到的下一字节的序号。换句话说,就是期望从主机 B 收到的下一报文段的序号。
由于每次都传输的是一个字节的数据,因此序号每次只加一。
3)累积确认
TCP 只确认字节流中至第一个丢失字节为止的字节。
主机 A 接收到来自主机 B 的包含字节 0~535 的报文段、字节 900~1000 的报文段,还没有接收到来自主机 B 的包含字节 536~899 的报文段。因此,主机 A 将在下一个发送给主机 B 的报文段中,把确认号字段设置为 536 。
3. 数据偏移/首部长度
该字段指示了以 32bit 为单位(即以 4 字节为单位)的 TCP 首部长度,即 TCP 报文段数据字段的起始处距离 TCP 报文段的起始处有多远。
4. 保留字段
占 6 位,保留为今后使用,但目前应置为 0。
5. 标志字段
3)紧急 URG(URGent)
当 URG=1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。紧急数据放在该报文段数据字段的最前面。
4)确认 ACK(ACKnowledgment)
只有当 ACK=1 时确认号字段的内容才有效;当 ACK=0 时,确认号字段的内容无效。
6)复位 RST(ReSeT)
当 RST=1 时,表明 TCP 连接中出现严重差错(如主机崩溃或其它原因),必须释放连接,然后再重新建立运输连接。
7)同步 SYN(SYNchronize)
当 SYN=1 时,表示这是一个连接请求或连接接受报文。
8)终止 FIN(FINish)
用来释放一个连接。FIN=1 表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
6. 窗口字段
该字段用于流量控制。占 16 位,是让对方设置发送窗口的依据,单位为字节。
7. 检验和
占16 位,在计算检验和时,要在 TCP 报文段前加上 12 字节的伪首部。
- 伪首部
- 首部字段
- 数据字段
8. 紧急数据指针
占 16 位,指出在该报文段中紧急数据共有多少个字节,紧急数据放在该报文段数据字段的最前面。
9. 填充字段
该字段用于使整个首部长度是 4 字节的整数倍。
三、TCP 往返时延的估计和超时
Q:如何设置 TCP 的超时值?
A:显然需要比 RTT 长,但 RTT 是动态变化的,若时间
- 太短:导致不成熟的超时和不必要的重传
- 太长:导致对报文段丢失的响应慢
Q:需要设置几个定时器?
1. 估计往返时间
SampleRTT(样本RTT):测量从报文段发出到收到该报文段的确认信息的时间。
- TCP 不会为重传的报文段计算 SampleRTT
- TCP 仅在某个时刻为某报文段做 SampleRTT 测量,而非每一个
SampleRTT 是变化的,因此需要一个 SampleRTT 的均值,即 EstimatedRTT(均值RTT)
对收到的 SampleRTT 根据以下公式进行均值处理:
EstimatedRTT = (1 - α) * EstimatedRTT + α * SampleRTT
以编程的思想来理解该公式:即每次按公式来更新 EstimatedRTT 的值。
上述均值计算被称为 “指数加权移动平均”,RFC 推荐的 α 取值是 α=0.125 。
2. RTT 估计例子
由图可知,通过计算得到的 EstimatedRTT,我们能够保证有一半的报文段避免不成熟的超时。但是,我们还想要更多的紫线上方的报文段能够避免不成熟的超时,因此引入了 “安全余量”。
3. 估计往返时间的偏差
DevRTT(偏差RTT):用于估算 SampleRTT 一般会偏离 EstimatedRTT 的程度。
与前面类似,SampleRTT-EstimatedRTT 是变化的,因此需要一个 SampleRTT-EstimatedRTT 的均值,即 DevRTT(偏差RTT)
对收到的 SampleRTT-EstimatedRTT 根据以下公式进行均值处理:
DevRTT = (1 - β) * DevRTT + β * |SampleRTT - EstimatedRTT|
RFC 推荐的 β 取值是 α=0.25 。
4. 设置重传超时间隔
根据前面的分析可知,超时间隔应该等于 EstimtedRTT 加上 “安全余量” DevRTT,从而避免不成熟的超时。同时。若 EstimatedRTT 波动较大,则需要加上更大的 “安全余量”。
最终超时间隔的公式为:
TimeoutInterval = EstimatedRTT + 4 * DevRTT
实际应用:
#init
TimeoutInterval = 1
EstimatedRTT = SampleRTT
DevRTT = SampleRTT/2#update
TimeoutInterval = EstimatedRTT + max(G, 4*DevRTT) #G是用户设置的时间粒度
DevRTT = (1 - β) * DevRTT + β * |SampleRTT - EstimatedRTT|
EstimatedRTT = (1 - α) * EstimatedRTT + α * SampleRTT
每次先更新 DevRTT 再更新 EstimatedRTT,否则 DevRTT 使用的就是不是上一次的 EstimatedRTT 了。
相关文章:

DJ3-4 传输层(第四节课)
目录 一、TCP 概述 二、TCP 报文段的首部字段格式 三、TCP 往返时延的估计和超时 1. 估计往返时间 2. RTT 估计例子 3. 估计往返时间的偏差 4. 设置重传超时间隔 一、TCP 概述 全双工服务:允许在同一时间同一连接上,数据能够双向传输。注意&#…...

2023爱分析·商业智能应用解决方案市场厂商评估报告:数聚股份
目录 1. 研究范围定义 2. 商业智能应用解决方案市场分析 3. 厂商评估:数聚股份 4. 入选证书 1. 研究范围定义 商业智能(BI)是在实现数据集成和统一管理的基础上,利用数据存储和处理、分析与展示等技术,满足企…...
Kotlin方法执行顺序
方法的执行顺序 主构造函数init代码块次构造函数...

Ubuntu系统配置SonarQube + cppcheck + Jenkins
SonarQube1. postgresql安装及配置1.1 安装postgresql1.2 创建sonarqube用户1.3 设置数据库2. 安装sonarqube2.1 设置sonarqube2.2 修改sonarqube目录权限2.3 sonar.properties2.4 设置systemd管理sonarqube2.5 web3. 配置sonarscanner3.1 下载3.2 配置4. 配置cppcheck4.1 下载…...
Spring @Valid 不生效 问题记录
校验的简单使用: 在Spring中,我们可以使用Valid注解对实体进行校验。在Controller的方法参数中添加Valid注解,然后在实体类的属性上添加校验注解,例如NotNull、Size等。例如: RestController public class UserContr…...

五步教你如何注册一个公司网站
在今天的数字化时代,每个公司都需要一个强大的线上存在感。注册一个公司网站是实现这一目标的第一步。但是,对于许多公司而言,这个过程可能有些困难。因此,在本文中,我将介绍一个五步计划,让您轻松注册一个…...

CSS绘制气泡对话框样式(有边框)
1、效果图 2、难点和思路 难点:上面那个带边框的小三角不好实现 思路:画两个不同大小的div,使其基本重叠(两个大小不同,不完全重叠,让红色的露出一点边边),让白色div放到最上层&…...

12款 Macmini A1347 跑 Stable Diffusion,20多分钟一张图
设备 2012款 Macmini A1347 12款 mini A1347 跑 Stable Diffusion 要20多分钟一张图 来欣赏一下20分钟画出来的图片 a black and white cat 环境:...

流量控制和拥塞控制的原理和区别
文章目录先介绍下重传机制和滑动窗口超时重传快速重传SACK方法Duplicate SACK滑动窗口发送方缓存窗口接收方缓存窗口流量控制小结拥塞控制慢开始算法拥塞避免算法快重传快恢复先介绍下重传机制和滑动窗口 超时重传 重传机制的其中一个方式,就是发送数据时…...
金融机构断卡行动中外部数据
“断卡行动”,近几年逐渐走入大众视野,是国家在从根源上整治网络及金融犯罪层面的重大举措。相信很多朋友在日常生活中已经有所体会了,比如我们在办理电话卡及银行卡的时候要经过很多审核机制,同时发卡后还会限制卡片的一些转账等…...

携程总监的单元测试是怎么样写的?
大家都知道,开发软件的时候为代码编写单元测试是很好的。但实际上,光有测试还不够,还要编写好的测试,这同样重要。 要做到这一点,考虑遵循一些固执的原则,对测试代码给予一些关爱: 1. 保持测试…...

算法每日一题:P2089 烤鸡 -DFS练习
😚一个不甘平凡的普通人,日更算法学习和打卡,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘 🤗专栏:每日算法学习 💬个人…...
Spring中的循环依赖是什么?如何解决它?
循环依赖是指两个或多个Bean之间相互依赖,导致它们无法被正确地初始化。在Spring中,当两个或多个Bean之间存在循环依赖时,Spring容器无法决定哪个Bean应该先初始化,因此会抛出BeanCurrentlyInCreationException异常,从…...

不良事件报告系统源码,PHP医院安全(不良)事件报告系统源码,在大型医院稳定运行多年
PHP医院安全(不良)事件报告系统源码,不良事件系统源码,有演示,在大型医院稳定运行多年。 系统技术说明 技术架构:前后端分离,仓储模式 开发语言:PHP 开发工具:VSco…...
MySQL 查询常用操作(3)——排序 order by
MySQL中常用的查询操作,首先是能直接从表中直接取出数据,接着能对查询结果做一些简单的处理,比如去重等,然后是根据条件查询数据,包括精准查询、模糊查询以及按照数据的某个范围或者指定多个指标进行查询,值…...
Android Jetpack 从使用到源码深耕【数据库注解Room 从实践到原理 】(二)
上文,我们通过一个简单的sqlite应用实例,引入了Room,知道了Room使用的便捷和好处。然后用Room的方式,重新实现了应用实例中的场景,在这个过程中,我们结合自己已有的知识体系,从使用代码入手,对Room的实现原理,进行了猜想和简单的验证。 Room实现原理,是否真如我们猜想…...

传统企业如何实现数字化转型?
近年来,围绕新产品新模式新业态,国家重点部署了7个方向,包括数字化管理、平台化设计、智能化生产、网络化协同、个性化定制、服务化延伸、新型智能产品等,均为市场价值大、发展潜力深、示范效应强的代表性、引领性领域。 因此&am…...

Linux修改密码报错Authentication token manipulation error的终极解决方法
文章目录报错说明解决思路流程排查特殊权限有没有上锁查看根目录和关闭selinux/etc/pam.d/passwd文件/etc/pam.d/system-auth文件终极办法,手动定义密码passwd: Have exhausted maximum number of retries for servic、ssh用普通用户登录输入密码正确但是登录时却提…...

ROS实践06 自定义消息类型
文章目录运行环境:思路:1.1 定义.msg文件1)功能包下新建 msg 目录,添加文件 Person.msg2)修改package.xml3)修改CMakeLists.txt2.1 自定义消息调用(C)1)编译后修改includePath2)发布方实现2.1修改CMakeLists.txt2.3运行…...

《剑指offer》——从尾到头打印链表
首先,拿到题之后,我们还是先从题目入手,只有掌握题干的意思,才能进行接下来的解题操作。 示例1 输入 : {1,2,3} 返回值:[3,2,1] 示例2 输入 :{67,0,24,58} 返回值:[58,24,0,67] 解题方法…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...