从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • 计算机简史

  • 数字电路

  • 计算机组成原理

  • 操作系统

  • Linux

  • 计算机网络

    • 计算机网络微课堂

      • 课程概述
      • 1-1 计算机网络在信息时代的作用
      • 1-2 因特网概述
      • 1-3 三种交换方式
      • 1-4 计算机网络的定义和分类
      • 1-5 计算机网络的性能指标
      • 1-6 计算机体系结构
      • 2-1 物理层的基本概念
      • 2-2 物理层下面的传输媒体
      • 2-3 传输方式
      • 2-4 编码与调制
      • 2-5 信道的极限容量
      • 3-1 概述
      • 3-2 封装成帧
      • 3-3 差错检测
      • 3-4 可靠传输
      • 3-5 点对点协议 PPP
      • 3-6 媒体接入控制的基本概念
      • 3-7 MAC 地址
      • 3-7 IP 地址
      • 3-7 ARP 协议
      • 3-8 集线器与交换机的区别
      • 3-9 以太网交换机自学习和转发帧的流程
      • 3-10 以太网交换机的生成树协议 STP
      • 3-11 虚拟局域网 VLAN
      • 4-1 网络层概述
      • 4-2 网络层提供的两种服务
      • 4-3 IPv4 地址
      • 4-4 IP 数据报的发送和转发过程
      • 4-5 静态路由配置及其可能产生的路由环路问题
      • 4-6 路由选择
      • 4-7 IPv4 数据报的首部格式
      • 4-8 网际控制报文协议 ICMP
      • 4-9 虚拟专用网 VPN 与网络地址转换 NAT
      • 5-1 运输层概述
      • 5-2 运输层端口号、复用与分用的概念
      • 5-3 UDP 和 TCP 的对比
      • 5-4 TCP 的流量控制
      • 5-5 TCP 的拥塞控制
      • 5.6 TCP 超时重传时间的选择
      • 5-7 TCP 可靠传输的实现
      • 5-8 TCP 的运输连接管理
      • 5-9 TCP 报文段的首部格式
      • 6-1 应用层概述
      • 6-2 客户—服务器方式和对等方式
      • 6-3 动态主机配置协议 DHCP
      • 6-4 域名系统 DNS
      • 6-5 文件传送协议 FTP
      • 6-6 电子邮件
      • 6-7 万维网 WWW
    • 计算机网络微课堂-实验手册

    • 从零开始学计算机网络

  • 数据库

  • 编程工具

  • 装机

  • 计算机基础
  • 计算机网络
  • 计算机网络微课堂
2023-11-16

5.6 TCP 超时重传时间的选择

# 560.5-6 TCP超时重传时间的选择

本节课我们介绍 TCP 超时重传时间的选择,超时重传时间的选择是 TCP 最复杂的问题之一。

‍

我们来举例说明,假设主机 A 和 B 是因特网上的两台主机,他们之间已经建立了 TCP 连接,纵坐标为时间,现在主机 A 给主机 B 发送 TCP 数据报文段 0,并记录下当前的时间。

主机 B 收到后给主机 A 发送相应的确认报文段。主机 A 收到确认报文段后,记录下当前的时间。

那么主机 A 记录下的这两个时间,它们的差值,就是报文段的往返时间 RTT 由于这是第 0 个报文段的 RTT,我们就用 RTT0 来表示。试想一下,如果我们将超时重穿时间,RTO 的值设置的比 RTT0 的值小,会出现怎样的情况?很显然这会引起报文段不必要的重传,使网络负荷增大。

​​

那么如果将超时重传时间,RTO 的值设置的远大于 RTT0 的值,又会出现怎样的情况?很显然这会使重传推迟的时间太长,使网络的空闲时间增大,降低了传输效率。

​​

综合上述两种情况,我们可以得出这样的结论,超时重传时间 RTO 的值应该设置为略大于报文段往返时间 RTT 的值。至此同学们可能会觉得超时重传时间的选择也并不是很复杂,然而 TCP 下层是复杂的互联网环境,主机 A 所发送的报文段可能只经过一个高速率的局域网,也有可能经过多个低速率的网络,并且每个 IP 数据报的转发路由还可能不同。

例如现在主机 A 给主机 B 发送 TCP 数据报文段 1,主机 B 收到后,给主机 A 发送相应的确认报文段,主机 A 这次测得的报文段往返时间 RTT 一如图所示,显然 RTT1 远大于 RTT0,如果超时重装时间 RTO 还是我们之前所确定的略大于 RTT0 的话,这对于数据报文段 1 是不合适的,会造成该报文段不必要的重传。

​​

这样看来超时重传时间的选择确实不那么简单了,我们不能直接使用某次测量得到的 RTT 样本来计算超时重装时间 RTO,但是我们可以利用每次测量得到的 RTT 样本,计算加权平均往返时间 RTTS,这样可以得到比较平滑的往返时间。当测量到第一个 RTT 样本时,RTTS 的值直接取为第一个 RTT 样本的值,以后每测量到一个 RTT 样本时,都按该公式来计算新的 RTT S 值。

在上式中阿尔法的取值大于等于 0,且小于一,若阿尔法很接近于零,则新 RTT 样本对 RTTS 的影响不大,若阿尔法很接近于一则新 RTT 样本,对 RTTS 的影响较大,已成为建议标准的 RFC6298,推荐的阿尔法值为 1/8,即 0.125,用这种方法得出的加权平均往返时间 RTTS 的值就要比测量出的 RTT 的值更加平滑。

显然超时重传时间,RTO 的值应略大于加权平均往返时间 RTTS 的值。

​​

下面我们给出 RFC6298 建议使用的超时重传时间 RTO 的计算公式,该公式中的 RTTS 是加权平均往返时间,我们刚刚介绍过它的计算方法,RTTD 是 RTT 偏差的加权平均,计算方法如下,当测量到第一个 RTT 样本时,RTTD 的值取为该样本值的一半,以后每测量到一个 RTT 样本时,都按该公式来计算新的 RTTD 的值。

在上式中贝塔的取值大于等于 0 且小于 1,已成为建议标准的 RFC6298 推荐的贝塔值为 1/4,即 0.25。我们可以发现不管是 RTTS 还是 RTTD 都是基于所测量到的 RTT 样本进行计算的。如果所测量到的 RTT 样本不正确,那么所计算出的 RTTS 和 RTTD 自然就要不正确,进而所计算出的超时重穿时间 RTO 也就不正确。

​​

然而往返时间 RTT 的测量确实是比较复杂的。我们来举例说明,主机 A 给主机 B 发送 TCP 数据报文段,但该报文段在传输过程中丢失了,当超时重传计时器超时后,主机 A 就重传该报文段,主机 B 收到后给主机 A 发送确认报文段。现在问题来了,主机 A 收到该确认报文段后,无法判断该报文段是对原报文段的确认,还是对重传报文段的确认。

该报文段实际上是对重传报文段的确认,也就是说正确的 RTT 应该是这一段时间。但是如果主机 A 误将该确认当做是对原报文段的确认,也就是误认为这段时间是 RTT 则所计算出的 RTTS 和 RTO 就会偏大,降低了传输效率。

再来看另一种情况,主机 A 给主机 B 发送 TCP 数据报文段,主机 B 收到后给主机 A 发送确认报文段,由于某种原因,该确认报文段没有在正常时间内到达主机 A 这必然会导致主机 A 对之前所发送的数据报文段的超时重传。现在问题又来了,主机 A 收到迟到的确认报文段后,无法判断该报文段是对原报文段的确认,还是对重传报文段的确认。

该报文段实际上是对原报文段的确认,也就是说正确的 RTT 应该是这一段时间。但是如果主机 A 误将该确认当做是对重传报文段的确认,也就是误认为这段时间是 RTT,则所计算出的 RTTS 和 RTO 就会偏小,这会导致报文段没有必要的重传,增大网络负荷。

​​

通过这两个例子可以看出,当发送方出现超时重传后,收到确认报文段时,是无法判断出该确认到底是对原报文段的确认,还是对重传报文段的确认,也就是无法准确测量出 RTT,进而无法正确计算超时重传时间 RTO。

因此针对出现超时重传时,无法测准往返时间 RTT 的问题,Karn 提出了一个算法,在计算加权平均往返时间 RTTS 时,只要报文段重传了,就要不采用其往返时间 RTT 样本,也就是出现重传时,不重新计算 RTTS,进而超时重传时间 RTO 也不会重新计算。然而这要引起了新的问题,设想出现这样的情况,报文段的时延突然增大了很多,并且之后很长一段时间内都会保持这种时延,因此在原来得出的重传时间内,不会收到确认报文段,于是就重传报文段。

根据 Karn 算法,不考虑重传的报文段的往返时间样本,这样超时重传时间就要无法更新,这会导致报文段反复被重传。因此要对 Karn 算法进行修正,方法是报文段每重传一次,就把超时重传时间 RTO 增大一些,典型的做法是将新 RTO 的值取为旧 RTO 值的两倍。

接下来我们举例说明,TCP 超时重传时间的计算,这是测量得到的第一个 RTT 样本 RTT1。根据 RTTS1 的计算公式可知 RTTS1 的值.根据 RTTDE 的计算公式,可知 RTTD1 的值在根据 IPO 的计算公式可计算出 RTO1 的值,这是测量得到的第二个 RTT2,根据 RTTS2 的计算公式和阿尔法的值和写出计算 RTTS2 的表达式,将之前计算出的 RTTS1 的值和本次测量得到的 RTT2 的值代入干涉,可计算出 RTTS2 的值。根据 RTTD 的计算公式和贝塔的值,可写出计算 RTTD2 的表达式,将之前计算出的 RTTD1,RTTS,1 以及本次测量得到的 RTT2 的值,代入该式,可计算出 RTTD2 的值。再根据 RTO 的计算公式,可计算出 RTO2 的值。

假设这是测量得到的第 3 个和第 4 个 RTT 样本。计算一下 RTO3 和 RTO4 的值分别是多少?答案如图所示,相信大家都能正确解答。假设这是测量得到的第 5 个 RTT 样本,但是根据 RTO4 的值可知,在收到确认之前就会产生超时重传。我们之前介绍过,若出现超时重传,则不采用上述公式计算 RTO,而是将新 RTO 的值取为旧 RTO 值的两倍。因此 RTO5 的值取为两倍的 RTO4 的值。

​​

本节课的内容小结如下:

​​

上次更新: 2025/6/3 09:31:54
5-5 TCP 的拥塞控制
5-7 TCP 可靠传输的实现

← 5-5 TCP 的拥塞控制 5-7 TCP 可靠传输的实现→

最近更新
01
学点统计学:轻松识破一本正经的胡说八道
06-05
02
2025 年 5 月记
05-31
03
《贫穷的本质》很棒,但可能不适合你
05-27
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式