5.6、TCP超时重传时间的选择

超时重传时间的选择是 TCP 最复杂的问题之一


1、超时重传时间RTO的选取

假设主机 A 给主机 B 发送 TCP 数据报文段 0 0 0,并记录下当前的时间

主机 B 收到后,给主机 A 发送相应的确认报文段

主机 A 收到确认报文段后,记录下当前的时间

那么主机 A 记录的这两个时间,它们的差值就是报文段的往返时间 RTT

image-20230106002443175


若把超时重传时间 RTO 的时间设置为比 RTT0 的时间小会怎样呢

很显然,这会引起报文段比必要的重传,是网络负荷增大

image-20230106002644792


若把超时重传时间 RTO 的时间设置远大于i RTT0 的值呢?

很显然,这会使重传推迟的时间增长,使网络的空闲的时间增大,降低了传输效率

image-20230106002822632


综上以上两种情况,超时重传时间 RTO 的值应略大于往返时间 RTT


然而,TCP 下层是复杂的互联网环境

主机 A 所发送的报文段可能只经过一个高速率的局域网,也有可能经过多个低速率的网络

  • 并且,每个 IP 数据报的转发路由还可能不同

如下所示,

image-20230106003412910

显然,RTT1 远大于 RTT0,若超时重传时间 RTO 还是之前所确定的略大于 RTT0 的话

  • 这对数据报文段 1 1 1 是不合适的,会造成该报文段不必要的重传

image-20230106003543796


2、RTO的计算(加权平均往返时间RTTs & RTT 偏差的加权平均 RTTD)

不能直接使用某次测量得到的 RTT 样本来计算超时重传时间 RTO \color{red}不能直接使用某次测量得到的\texttt{RTT}样本来计算超时重传时间 \texttt{RTO} 不能直接使用某次测量得到的RTT样本来计算超时重传时间RTO

利用每次测量得到的 RTT 样本,计算 加权平均往返时间 RTTs \color{red}加权平均往返时间\texttt{RTTs} 加权平均往返时间RTTs(又称为平滑的往返时间)。

当测量到第一个 RTT 样本时,RTTs 的值直接取为第一个 RTT 的值

  • RTT S1 = RTT 1 \color{red}\texttt{RTT}_{\texttt{S1}} = \texttt{RTT}_{\texttt{1}} RTTS1=RTT1

以后每测量一个 RTT 样本时,都按该公式来计算新的 RTTs 的值

  • 新的 RTTs = ( 1 − α ) × 旧的 RTTs + α × 新的 RTT 样本 \color{red}新的 \texttt{RTTs} = (1-\alpha) \times 旧的 \texttt{RTTs} + \alpha \times 新的\texttt{RTT}样本 新的RTTs=(1α)×旧的RTTs+α×新的RTT样本

    在上式中。 0 ≤ α < 1 : 0 \le \alpha < 1: 0α<1:

    ​ 若 α \alpha α 很接近于 0 0 0,则新 RTT 样本对 RTTs 的影响不大

    ​ 若 α \alpha α 很接近于 1 1 1,则新 RTT 样本对 RTTs 的影响较大

    已成为建议标准的 RFC6298 推荐的 α \alpha α 值为 1 / 8 1/8 1/8 ,即 0.125 0.125 0.125

用这种方法得出的加权平均往返时间 RTTs 就比测量出的 RTT 值更加平滑。

显然,超时重传时间 RTO 应略大于加权平均往返时间 RTTs


RFC6298 建议使用下式计算超时重传时间 RTO

  • RTO = RTTs + 4 × RTT D \color{red}\texttt{RTO} = \texttt{RTTs} + 4 \times \texttt{RTT}_{\texttt{D}} RTO=RTTs+4×RTTD

其中 RTT D \texttt{RTT}_{\texttt{D}} RTTD RTT \texttt{RTT} RTT 偏差的加权平均 RTT D \texttt{RTT}_{\texttt{D}} RTTD

  • RTT D1 = RTT 1 / 2 \color{red}\texttt{RTT}_{\texttt{D1}} = \texttt{RTT}_{\texttt{1}} / 2 RTTD1=RTT1/2

新的 RTT D = ( 1 − β ) × 旧的 RTT D + β × ∣ RTTs − 新的 RTT 样本 ∣ \color{red}新的 \texttt{RTT}_{\texttt{D}} = (1-\beta) \times 旧的 \texttt{RTT}_{\texttt{D}} + \beta \times|\texttt{RTTs} -新的\texttt{RTT}样本| 新的RTTD=(1β)×旧的RTTD+β×RTTs新的RTT样本

在上式中。 0 ≤ β < 1 : 0 \le \beta< 1: 0β<1:

已成为建议标准的 RFC6298 推荐的 β \beta β 值为 1 / 4 1/4 1/4 ,即 0.25 0.25 0.25

image-20230106005549540


从上述发现,不管是 RTTs 还是 RTTD,都是基于所测量到的 RTT 样本测量到的

若所测量到的 RTT 样本不正确,那么所计算出的 RTTsRTTD 自然就不正确

进而所计算出的超时重传时间 RTO 也就不正确


3、往返时间 RTT 的测量

往返时间 RTT 的测量比较复杂

3.1、TCP数据报文段丢失

image-20230106005947310

对于上述所示,主机 A 收到该确认报文段后

  • 无法判断该报文段是对原报文段的确认还是对重传报文段的确认

该报文段实际上是对重传报文段的确认

  • 也就是说正确的 RTT 应该是这一段时间(绿色✔标记)

但是若主机 A 误将该确认当作是对原报文段的确认

  • 也就是误认这段时间 RTT(红色❌标记)

则所计算出的 RTTsRTO 就会偏大,降低了传输效率

image-20230106010350469


3.2、迟到的确认报文段

image-20230106010448158

如上所示:该确认报文段没有在正常时间内到达主机 A,这必然会导致主机 A 对之前所发送的数据报文段的超时重传

主机 A 收到迟到的确认报文段后

  • 无法判断该报文段是对原报文段的确认还是对重传报文段的确认

该报文段实际上是对原报文段的确认

  • 也就是说正确的 RTT 应该是这一段时间(绿色✔标记)

但是若主机 A 误将该确认当作是对重传报文段的确认

  • 也就是误认这段时间 RTT(红色❌标记)

则所计算出的 RTTsRTO 就会偏小,这会导致报文段没有必要的重传,增大网络负荷。

image-20230106010738979


从上述可以看出,当发送方出现超时重传后,收到确认报文段时,是无法判断该报文段是对原报文段的确认还是对重传报文段的确认

  • 也就是无法准确测量 RTT,进而无法正确计算超时重传时间 RTO

4、karn 算法及改进

针对 出现超时重传时无法测准往返时间 RTT \color{blue}出现超时重传时无法测准往返时间\texttt{RTT} 出现超时重传时无法测准往返时间RTT的问题, K a r n \color{red}Karn Karn 提出了一个 算法 \color{red}算法 算法

  • 在计算加权平均往返时间 RTTs 时,只要报文段重传了,就不采用其往返时间 RTT 样本。 \color{red}在计算加权平均往返时间\texttt{RTTs}时,只要报文段重传了,就不采用其往返时间\texttt{RTT}样本。 在计算加权平均往返时间RTTs时,只要报文段重传了,就不采用其往返时间RTT样本。

就是出现重传时,不重新计算 RTTs ,进而超时重传时间 RTO 也不会重新计算。

  • 这又引起了新的问题。设想出现这样的情况:报文段的时延突然增大了很多,并且之后很长一段时间都会保持这种时延。因此在原来得出的重传时间内,不会收到确认报文段。于是就重传报文段。

    但根据 Karn 算法,不考虑重传的报文段的往返时间样本。这样,超时重传时间就无法更新。这会导致报文段反复被重传。

因此,要对 K a r n 算法进行修正 \color{red}Karn算法进行修正 Karn算法进行修正。方法是:

  • 报文段每重传一次,就把超时重传时间 RTO 增大一些 \color{red}报文段每重传一次,就把超时重传时间\texttt{RTO}增大一些 报文段每重传一次,就把超时重传时间RTO增大一些
  • 典型的做法是将新 RTO 的值取为旧 RTO 值的 2 2 2 倍。

5、TCP超时重传时间的计算

image-20230106012322285


image-20230106012429619

6、小结

image-20230106012448661

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章简介....................................................................................................................................3 1.1 计算机网络,分组报文和协议........................................................................................3 1.2 关于地址............................................................................................................................6 1.3 关于名字............................................................................................................................8 1.4 客户端和服务器................................................................................................................8 1.5 什么是套接字....................................................................................................................9 1.6 练习..................................................................................................................................10 第2章基本套接字......................................................................................................................10 2.1 套接字地址......................................................................................................................10 2.2 TCP套接字.......................................................................................................................17 2.2.1 TCP客户端............................................................................................................17 2.2.2 TCP服务器端........................................................................................................22 2.2.3 输入输出流...........................................................................................................26 2.3 UDP套接字......................................................................................................................28 2.3.1 DatagramPacket类...............................................................................................28 2.3.2 UDP客户端...........................................................................................................30 2.3.3 UDP服务器端.......................................................................................................36 2.3.4 使用UDP套接字发送和接收信息......................................................................38 2.4 练习..................................................................................................................................40 第3章发送和接收数据...............................................................................................................41 3.1 信息编码..........................................................................................................................42 3.1.1 基本整型...............................................................................................................42 3.1.2 字符串和文本.......................................................................................................48 3.1.3 位操作:布尔值编码...........................................................................................50 3.2 组合输入输出流..............................................................................................................51 3.3 成帧与解析......................................................................................................................52 3.4 Java特定编码...................................................................................................................58 3.5 构建和解析协议消息......................................................................................................59 3.5.1 基于文本的表示方法...........................................................................................62 3.5.2 二进制表示方法...................................................................................................65 3.5.3 发送和接收...........................................................................................................67 3.6 结束..................................................................................................................................76 3.7 练习..................................................................................................................................76 第4章进阶..................................................................................................................................77 4.1 多任务处理......................................................................................................................77 4.1.1 Java 多线程..........................................................................................................78 4.1.2 服务器协议...........................................................................................................80 4.1.3 一客户一线程.......................................................................................................84 4.1.4 线程池...................................................................................................................86 4.1.5 系统管理调度:Executor接口...........................................................................89 4.2 阻塞和超时......................................................................................................................91 4.2.1 accept(),read()和receive()....................................................................................91 4.2.2 连接和写数据.......................................................................................................92 4.2.3 限制每个客户端的时间.......................................................................................92 4.3 多接收者..........................................................................................................................94 4.3.1 广播.......................................................................................................................94 4.3.2 多播.......................................................................................................................95 4.4 控制默认行为................................................................................................................100 4.4.1 Keep-Alive...........................................................................................................100 4.4.2 发送和接收缓存区的大小.................................................................................101 4.4.3 超时.....................................................................................................................101 4.4.4 地址重用.............................................................................................................102 4.4.5 消除缓冲延迟.....................................................................................................102 4.4.6 紧急数据.............................................................................................................103 4.4.7 关闭后停留.........................................................................................................103 4.4.8 广播许可.............................................................................................................103 4.4.9 通信等级.............................................................................................................104 4.4.10 基于性能的协议选择.......................................................................................104 4.5 关闭连接........................................................................................................................104 4.6 Applets...........................................................................................................................111 4.7 结束................................................................................................................................112 4.8 练习................................................................................................................................112 第5章 NIO.................................................................................................................................112 5.1 为什么需要NIO?........................................................................................................113 5.2 与Buffer一起使用Channel..........................................................................................115 5.3 Selector...........................................................................................................................118 5.4 Buffer详解.....................................................................................................................125 5.4.1 Buffer索引...........................................................................................................125 5.4.2 创建Buffer..........................................................................................................126 5.4.3 存储和接收数据.................................................................................................128 5.4.4 准备Buffer:clear(),flip(),和rewind()........................................................130 5.4.5 压缩Buffer中的数据..........................................................................................132 5.4.6 Buffer透视:duplicate(),slice()等..................................................................134 5.4.7 字符编码.............................................................................................................136 5.5 流(TCP)信道详解....................................................................................................136 5.6 Selector详解...................................................................................................................139 5.6.1 在信道中注册.....................................................................................................139 5.6.2 选取和识别准备就绪的信道.............................................................................141 5.6.3 信道附件.............................................................................................................143 5.6.4 Selector小结........................................................................................................144 5.7 数据报(UDP)信道...................................................................................................144 5.8 练习................................................................................................................................149 1. 使用定长的写缓冲区改写TCPEchoClientNonblocking.java。....................................149 2.使用Buffer和DatagramChannel编写一个回显客户端。................................................149 第6章深入剖析........................................................................................................................149 6.1 缓冲和TCP....................................................................................................................152 6.2 死锁风险........................................................................................................................155 6.3 性能相关........................................................................................................................158 6.4 TCP套接字的生存周期.................................................................................................158 6.4.1 连接.....................................................................................................................158 6.4.2 关闭TCP连接.....................................................................................................164 6.5 解调多路复用揭秘........................................................................................................167 6.6 练习................................................................................................................................169

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值