TCP往返时延的估计和超时

一、估计往返时间

TCP与之前文章提到的rdt一样,都采用超时/重传机制来处理报文段的丢失问题。那么这时就会有一个新的问题:如何设置TCP超时值呢?
答案肯定是超时间隔必须大于该连接的往返时间(RTT)。但是RTT是变化的。如果超时间隔设置太短会造成不成熟的超时,这就会导致不必要的重传。而时间间隔太长则对数据段丢失响应慢。
既然RTT是变化的,那么问题又来了,如何估计RTT呢:
样本RTT:测量从报文段发送到收到确认的时间,这里不考虑重传的报文段即不为重传的报文段计算样本RTT。
注意:在任意时刻,仅为一个已发送的但目前尚未被确认的报文段估计样本RTT,从而产生一个接近于每个RTT的新样本RTT值。也就是随机抽取一个当作样本值。
但是RTT变化,RTT样本值也会随之变化,因此需要一个样本RTT均值,对收到的样本RTT根据以下公式进行均值处理:
样本RTT均值=(1-a) ∗ * 样本RTT均值+a ∗ * 样本均值。
上述均值计算被称为:指数加权移动平均,典型的:a=0.125。
下图为RTT样本和RTT估计:
在这里插入图片描述

二、设置和管理重传超时间隔

在开口我们就提到,超时间隔要大于样本RTT均值,但又不能大太多。因此超时间隔=样本RTT均值+安全余量。当样本RTT波动大时,安全余量大些,当波动较小时,安全余量小些。
那这个安全余量怎么算呢?
我们先看样本RTT偏离了样本RTT均值多少:
DevRTT=(1-b) ∗ * DevRTT+b ∗ * |样本RTT-样本RTT均值|。
典型的取b=0.25。
然后设置超时时间间隔:
超时时间间隔=样本RTT均值+4 ∗ * DevRTT。
推荐初始的超时时间间隔为1秒。当第一个样本RTT获得后:(1)样本RTT均值=样本RTT
(2)DevRTT=样本RTT/2
(3)超时时间间隔=样本RTT均值+max(G,K ∗ * DevRTT)。这里K=4,G是用户设置的时间粒度。
当出现超时后,超时时间间隔的值将加倍,以免即将被确认的后继报文段过早出现超时。一旦报文段收到并更新样本RTT均值后,超时时间间隔就又会使用上述公式计算。

三、可靠数据传输

TCP在IP不可靠服务之上创建rdt即可靠数据传输服务。
采取的方法主要有:
(1)流水线技术处理报文段。
(2)采用累计确认机制。
(3)TCP使用单个重发定时器。
(4)超时事件和重复确认都会触发重发。
TCP发送方做的事件主要有如下:
(1)从应用程序接收数据:将数据封装在一个报文段中,并把该报文段交给IP。每一个报文段都包含一个序号,序号是数据段中第一个数据字节在字节流中的位置编号;如果没有启动定时器则启动定时器;设置超时间隔。
(2)超时:重发导致超时的数据段;重新开启定时器。
(3)收到确认:来自接收方确认报文段的到答,如果确认了还没有确认的数据段,则更新还没有确认的状态;若还有未完成的数据段,那么重新开始定时器。
下图是一个简化的TCP发送方:
在这里插入图片描述
上图中最后一个事件是一个来自接收方的确认报文段的到达,当该事件发生时,TCP将ACK的值y与它的变量SendBase进行比较。TCP状态变量SendBase是最早未被确认的字节的序号。TCP采用累计确认,所以y确认了字节编号在y之前的所有字节都已经收到。如果y>SendBase,则该ACK是在确认一个或多个先前未被确认的报文段。因此发送方更新它的SendBase变量;如果当前有未被确认的报文段,TCP还要重新启动定时器。

四、TCP重发场景

(1)丢失ACK的情况
在这里插入图片描述
从主机B发往主机A 的确认报文丢失了,这时会发生超时,主机A 会重传相同的报文段。
(2)过早的超时设置
在这里插入图片描述
第二个报文段序号是100,包含20字节的数据。假设两个报文段都完好无损的到达主机B,并且主机B为每一个报文段分别发送一个确认。确认报文序号分别为100、120。现在假设在超时之前这两个报文段中没有一个确认报文到达主机A。当超时事件发生时,主机A重传序号92的第一个报文段,并重启定时器。只要第二个报文段的ACK在新的超时发生以前到达,第二个报文段将不会被重传。
(3)累计ACK的情况
在这里插入图片描述
假设主机A 与在第二种情况中完全一样,发送两个报文段。第一个报文段的确认报文在网络中丢失,但在超时事件发生之前主机A收到一个确认号为120的确认报文。主机A因而知道主机B已经收到了序号119及之前的所有字节;所以主机不会重传这两个报文段中的任何一个。

五、快速重传

超时触发重传存在的问题之一是超时周期可能相对较长。当一个报文段丢失时,这种长超时周期迫使发送方延迟重传丢失的分组,因而增加了端到端时延。幸运的是发送方通常可以在超时事件发生之前通过注意所谓冗余ACK来较好地检测丢包情况。冗余ACK就是再次收到接收方发送地ACK,而发送方之前已收到过对该报文段地确认。
下图为TCP ACK产生产生的几种情况。
在这里插入图片描述
图中第三种情况会发送冗余ACK,如果一个报文段丢失,就很可能引起许多一个接一个的冗余ACK。如果TCP发送方收到3个相同数据的ACK,则说明在这个已经被确认过3次的报文段之后的报文段已丢失。所以一旦收到3个冗余ACK,TCP就进行快速重传即在该报文段的定时器过期之前重传丢失的报文段。下图为采用快速重传的代码:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值