TCP的超时和重传
引言
TCP提供的可靠传输在数据丢失时依靠超时和重传机制,如何决定超时间隔、如何确定重传频率是其关键之处。 超时依赖定时器的实现,对于每个连接,TCP管理4个不同的定时器:
- 重传定时器,希望收到另一端的确认
- 坚持定时器,获取窗口大小信息
- 保活定时器,检测另一端是否崩溃或重启
- 2MSL定时器,测量一个连接处于TIME_WAIT状态的时间
超时与重传的简单例子
在一个tcp建立连接后,拔掉接收端的网线,观察tcpdump输出。 重传了13次,时间间隔指数增加,总耗时9分钟。
往返时间测量
根据RTT,计算平滑平滑RTT估计器,计算出重传超时时间RTO。 之后改进法又依赖其RTT的方差,使之对于往返时间变化起伏大的网络也能适用。
往返时间RTT的例子
图21.4显示出测量的RTT与TCP计算的RTO之间的关系
拥塞举例
图21-7显示了中间传输过程中报文丢失并重传的过程
拥塞避免算法
当拥塞发生时,ssthresh值为当前windowsize的一半,且如果是超时引起的拥塞,直接将cwin置为1,即慢启动。(如果是重复ack引起的拥塞,则执行拥塞避免?) 当收到新数据的ack回复时,增加cwnd,但增加的方式取决于当前是慢启动还是拥塞避免。
当cwnd小于门限值,使用启动,否则使用拥塞避免。 即慢启动一直持续到拥塞发生时窗口的一半,接着执行拥塞避免。
快重传与快恢复
由于我们不知道一个重复的 A C K是由一个丢失的报文段引起的,还是由于仅仅出现了几 个报文段的重新排序,因此我们等待少量重复的 A C K到来。假如这只是一些报文段的重新排 序,则在重新排序的报文段被处理并产生一个新的 A C K之前,只可能产生1 ~ 2个重复的A C K。 当收到三个失序报文后,接下来执行拥塞避免算法,而不是慢启动算法。
ICMP的差错
一个接收到的主机不可达或网络不可达实际上都被忽略,因为这两个差错都被认为是短暂现象, 不会引起TCP链接的关闭。 这有可能是由于中间路由器被关闭而导致选路协议要花费数分钟才能稳定 到另一个替换路由。在这个过程中就可能发生这两个 I C M P差错中的一个,但是连接 并不必被关闭。相反, T C P试图发送引起该差错的数据,尽管最终有可能会超时(回 想图 2 1 - 1中T C P在9分钟内没有放弃的情况)。当前基于伯克利的实现记录发生的 I C M P差错,如果连接超时, I C M P差错被转换为一个更合适的的差错码而不是“连接 超时”。
重新分组
当T C P超时并重传时,它不一定要重传同样的报文段。相反, T C P允许进行重新分组而发 送一个较大的报文段,这将有助于提高性能(当然,这个较大的报文段不能够超过接收方声 明的M S S)。在协议中这是允许的,因为 T C P是使用字节序号而不是报文段序号来进行识别它 所要发送的数据和进行确认。
小结
本章提供了对T C P超时和重传机制的详细研究。使用的第 1个例子是一个丢失的建立连接 的S Y N,并观察了在随后的重传和超时中怎样使用指数退避方式。 T C P计算往返时间并使用这些测量结果来维护一个被平滑的 RT T估计器和被平滑的均值偏 差估计器。这两个估计器用来计算下一个重传时间。许多实现对每个窗口仅测量一次 RT T。 K a r n算法在分组丢失时可以不测量 RT T就能解决重传的二义性问题。 详细例子包括3个丢失的分组,使我们看到 T C P的许多实际算法:慢启动、拥塞避免、快 速重传和快速恢复。我们也能够使用拥塞窗口和慢启动门限来手工计算 TCP RT T估计器,并 将这些值与跟踪输出的实际数据进行比较。 以多种I C M P差错对 T C P连接的影响以及 T C P怎样允许对数据进行重新分组来结束本章。 我们观察到“软”的 I C M P差错没有引起T C P连接终止,但这些差错被保存以便在连接非正常 中止时能够报告这些软差错。
重点
- 超时重传的几种类型
- 超时时间的确定,基于RTT取值的均值和方差,并实现指数规避
- 拥塞避免算法和慢启动的结合使用,什么时候指数增加,什么时候线性增加
- 快重传和快恢复的结合使用,新门限值的取值,发生快重传的时机
|