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 了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/9619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高效办公——Excel表格-02篇(if函数常见用法 + 条件格式的使用)

高效办公——Excel表格-02篇(if函数常见用法 条件格式的使用)1. if单条件简单用法1.1 简单需求1.2 实现方法2. if多条件使用(if-else的情况)3. if多条件使用(if(A && B)的情况)3.1 简单需求3.2 实现需求4. if多条件使用(if(A || B)的情况)5. 条…

解决macOS IntelliJ IDEA 卡顿问题

写在前面的话1:我在撰写这篇博客时候,所用的IntelliJ IDEA版本是IntelliJ IDEA 2022.3.3 (Ultimate Edition),你需要知道可能对于不同的IntelliJ IDEA版本会有一定的差异 写在前面的话2:如果我这篇博客可以帮助到你,请…

突发!ChatGPT疯了!

‍数据智能产业创新服务媒体——聚焦数智 改变商业今天,笔者正常登录ChatGPT,试图调戏一下他。但是,突然震惊的发现,ChatGPT居然疯了。之所以说他是疯了,而不是崩溃了,是因为他还能回复我,但回…

Jvm学习笔记(一)内存模型

JVM内存模型 java不需要用户手动去管理内存的释放,这大大解放了程序员的心智负担,jvm运行的核心绕不开他的内存模型,本章着重于jvm的内存模型分析。 程序计数器 程序计数器是一块较小的内存区域,主要作用是确定下一条需要执行的…

强大到让人无法想象的ChatGPT-5即将发布,上千名人士却紧急叫停

目录 【ChatGPT 5简介】 【ChatGPT 5的潜在应用】 【ChatGPT 5的潜在危险】 ChatGPT4还没有好好体验,比GPT4强大1000倍的ChatGPT5又即将发布!届时将彻底改变人工智能领域,并改变我们现有的世界 【ChatGPT 5简介】 OpenAI计划在2023年12月发…

mybatis plus同时使用逻辑删除和唯一索引的问题及解决办法

1 问题背景 在开发中,我们经常会有逻辑删除和唯一索引同时使用的情况。但当使用mybatis plus时,如果同时使用逻辑删除和唯一索引,会报数据重复Duplicate entry的问题。 举例来说,有表user,建立唯一索引(us…

亚马逊云科技赋能数据分析,完成最后一块拼图

Serverless时代已经到来!企业的技术架构,总是伴随着不断增长的数据与日趋复杂的业务持续演进。如何通过构建更易用的技术架构来聚焦在业务本身,而不必在底层基础设施的管理上投入过多的精力,是数据驱动型企业需要思考的重要议题。…

【Linux】之nc命令(连接与扫描指定端口、监测服务端口的使用情况)解析、详解实例、邮件告警

🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录nc命令简介nc命令的安装nc命令语法格式…

腾讯38K测试良心分享,熬夜整理10万字详细软件测试面试笔记

国内的互联网面试,恐怕是现存的、最接近科举考试的制度。 这是由于互联网IT行业的求职者太多了,如果考察的是清一溜的算法题和设计题,那么会要求面试官有极高的技术水平,还要花大量的时间成本和精力。 所以,八股文面…

git查看历史提交记录

本文来说下git如何查看历史的提交记录 文章目录git查看历史提交记录git查看历史提交记录 本文来说下在idea编辑器中如何查看git的历史提交记录 右键选择 查看历史的git提交记录

基于深度学习的火焰检测系统(YOLOv5清新界面版,Python代码)

摘要:火焰检测系统用于检测日常是否出现火情,支持图片、视频、摄像头等多方式检测火焰、实现火灾警报功能,提供了登录注册界面。在介绍系统实现原理的同时,给出部分Python的实现代码以及PyQt的UI界面。火焰检测系统主要用于日常生…

【go-zero Drone】通过Drone完成go-zero的CI第一篇 初探:go-zero api接入drone pipeline

一、Drone 安装部分就不在这里赘述了,大家可以自行百度去找找 Drone的官网网址:https://www.drone.io/ 为什么选择了Drone没有选择Jenkins 对比dronejenkins内存很小几十兆内存上G的内存占用pipeline通过yamlgrovvy 增加学习成本配置十分简单上手十分复杂版本控制pipeline的y…

【Python实战】Python采集二手车数据——超详细讲解

前言 今天,我们将采集某二手车数据,通过这个案例,加深我们对xpath的理解。通过爬取数据后数据分析能够直观的看到二手车市场中某一品牌的相对数据,能够了解到现在的二手车市场情况,通过分析数据看到二手车的走势&#…

4. 【动手学深度学习v2】数据操作 + 数据预处理

4. 数据操作 + 数据预处理【动手学深度学习v2】 李沐 B站:https://space.bilibili.com/1567748478/channel/seriesdetail?sid=358497 课程主页:https://courses.d2l.ai/zh-v2/ 教材:https://zh-v2.d2l.ai/ 课件:https://courses.d2l.ai/zh-v2/assets/pdfs/part-0_4.pdf Gi…

Mybatis-plus学习2

一、Mybatis-plus分页操作 1.配置拦截器即可 //分页插件Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor();} 2.直接使用Page对象 //测试分页查询Testpublic void testPage(){//参数一:当前页//参数二:页面…

k8s v1.26.2 安装部署步骤

准备 开通端口 master需要开通的端口: TCP: 6443 2379 2380 10250 10259 10257 ,10250 30000~30010(应用) node需要开通的端口: TCP: 10250 30000~30010(应用) master加端口 firewall-cmd --permanent --add-port6443/tcp firewall-cmd --permanent --add-port2379/tcp fir…

[论文笔记] Efficient and Scalable Graph Pattern Mining on GPUs

Efficient and Scalable Graph Pattern Mining on GPUs GPU 上高效可扩展的图模式挖掘 [Paper] [Code] OSDI’22 摘要 提出了第一个可以在多 GPU 上高效运行的图模式挖掘框架(Graph Pattern Mining, GPM), G2Miner. 使用模式图感知(pattern-aware), 输入感知(input-aware)以…

学会吊打面试官之set

小白:大牛,我最近在学习C的STL容器,发现set好像是一种比较特殊的容器,可以帮我简单介绍一下吗? 大牛:没问题,set是一种关联式容器,它的主要特点是不允许有重复元素,并且…

人工智能前沿——「全域全知全能」人类新宇宙ChatGPT

🚀🚀🚀OpenAI聊天机器人ChatGPT——「全域全知全能」人类全宇宙大爆炸!!🔥🔥🔥 一、什么是ChatGPT?🍀🍀 ChatGPT是生成型预训练变换模型(Chat G…

【C++】stack

目录 一、stack的介绍与使用 二、stack的模拟实现 1、deque 2、deque的迭代器 一、stack的介绍与使用 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器被实现…
最新文章