《TCP/IP详解》读书笔记(21章)-TCP的超时与重传

TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认,它就重传该数据。

对于实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率。

TCP管理4种不同的定时器:

  • 重传定时器:当希望收到另一端的确认时使用。
  • 坚持定时器:使窗口信息保持不断流动,即使另一端关闭了其接收窗口。
  • 保活定时器:检测一个空闲连接的另一端何时崩溃或重启。
  • 2MSL定时器:测量一个连接处于TIME_WATI状态的时间。

指数退避:书中检查连续重传之间不同的时间差,它们取整后分别是1、3、6、12、24、48和多个64秒,其中第一次发送后设置的超时时间设置为1.5秒。(2的N次方*1.5秒)

1.往返时间测量

RTT(往返时间):指发送端发送TCP报文段开始到接收到对方的确定所使用的时间。

TCP超时与重传中最重要的部分就是对一个给定连接的往返时间的测试。由于路由器和网络流量均会变化,因此我们认为这个时间可能经常会发生变化,TCP应该跟踪这些变化并相应地改变其超时时间。

RTO(超时重传时间):发送端发送TCP报文段后,在RTO时间内没有收到对方确定,即重传该报文段。

最早的TCP曾经用了一个非常简单的公式来估计当前网络的状况,如下:

R<-aR+(1-a)MRTP=Rb

其中a是一个经验系数为0.9,称为平滑因子,b通常为2。这个数值是可以被修改的。这个公式是说用旧的RTT(R)和新的RTT(M)综合到一起来考虑新的RTT(R)的大小。每次进行新测量时,这个被平滑的RTT将得到更新。每个新估计的90%来自前一个估计,而10%则取自新的测试。

但是,在RTT变化范围很大时,使用这个方法无法跟上这种变化,从而引起不必要的重传。当网络已经处于饱和状态时,不必要的和重传会增加网络的负载,对网络而言就像在火上浇油。于是就有下面的修正公式:

Err=M-AA<-A+gErrD<-D+h(|Err|-D)RTO=A+4D

  • A 平滑的RTT(均值估计器)
  • D 平滑的方差
  • g 增量
  • h 方差的增益

RTO值基于RTT的均值和方差,这更好的响应了RTT的变化。

karn算法(重传多义性)

假如发送一个分组,当发生超时,RTO指数退避,重传该分组,然后收到ACK。此时但并不能确定这个ACK是针对第一个分组还是重传分组,这就是重传多义性问题。

karn算法针对这个问题

(1)对于超时重传的数据报的确认,不更新RTT。
(2)要注意的是:重传的情况下,RTO不用上面的公式计算,而采用一种叫做“指数退避”的方式。RTO指数退避,下一次传送就使用这个RTO值。
(3)重传数据确认之后,再次发送的数据如果正常被确定,恢复Jacobson 1988公式,更新RTO和RTT。

2.拥塞避免算法

该算法假定由于分组受到损坏引起的丢失是非常少的,因此分组丢失就意味着源主机和目的主机之间的某处网络上发生了拥塞。有两种分组丢失的指示:

  • 发生超时
  • 接收到重复的确认

数据在传输的时候不能只使用一个窗口协议,我们还需要有一个拥塞窗口来控制数据的流量,使得数据不会一下子都跑到网路中引起“拥塞”。也曾经提到过,拥塞窗口最初使用指数增长的速度来增加自身的窗口,直到发生超时重传,再进行一次微调。但是没有提到,如何进行微调,拥塞避免算法和慢启动门限就是为此而生。

所谓的慢启动门限就是说,当拥塞窗口超过这个门限的时候,就使用拥塞避免算法,而在门限以内就采用慢启动算法。所以这个标准才叫做门限,通常,拥塞窗口记做cwnd,慢启动门限记做ssthresh。下面我们来看看拥塞避免和慢启动是怎么一起工作的。

拥塞避免算法和慢启动算法是两个目的不同、独立的算法。我们希望降低分组进入网络的传输速率,于是可以调用慢启动来作到这一点,拥塞避免算法和慢启动算法通常一起使用:
每个连接维持两个变量: 拥塞窗口( cwnd )  慢启动门限( ssthresh )

算法概要:

  1. 对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。
  2. TCP输出例程的输出不能超过cwnd和接收方通告窗口的大小。拥塞避免是发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。
  3. 当拥塞发生时(超时或收到重复确认),ssthresh被设置为当前窗口大小的一半(cwnd 和接收方通告窗口大小的最小值,但最少为2个报文段)。此外,如果是超时引起了拥塞,则 cwnd被设置为1个报文段(这就是慢启动)。
  4. 当新的数据被对方确认时,就增加cwnd,但增加的方法依赖于我们是否正在进行慢启 动或拥塞避免。如果cwnd小于或等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。 慢启动一直持续到我们回到当拥塞发生时所处位置的半时候才停止(因为我们记录了在步骤2 中给我们制造麻烦的窗口大小的一半),然后转为执行拥塞避免。


cwnd增加方式
慢启动初始cwnd为1,每收到一个确定就加1,成指数增长。
拥塞避免算法在每个RTT内增加 1/cwnd 个报文,成线性增长。
慢启动根据收到的ACK次数增加cwnd,而拥塞避免算法在一个RTT不管收有多少ACK也只增加一次。

3.快速重传和快速恢复算法

如果收到3个重复ACK,可认为该报文段已经丢失,此时无需等待超时定时器溢出,直接重传丢失的包,这就叫快速重传算法.而接下来执行的不是慢启动而是拥塞避免算法,这就叫快速恢复算法.
(1)当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半,重传丢失的报文段,设置cwnd为ssthresh加上3倍的报文段大小。
(2)每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送1个分组(如果新的cwnd允许发送)。
(3)当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个ACK也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。


4.ICMP差错

TCP能够遇到的最常见的ICMP差错就是源站抑制、主机不可达和网络不可达。

(1)源站抑制的ICMP将拥塞窗口cwnd置为1个报文段,并发起慢启动,慢启动门限ssthresh不变,窗口将打开直至开放了所有的通路(受窗口大小和往返时间的限制)或者发生了拥塞。

(2)主机不可达或网络不可达的ICMP将被忽略,因为这两上差错都被认为是短暂现象。

5.重新分组

当TCP超时并重传时,它不一定需要重传同样的报文段。相反,TCP允许进行重新分组而发送一个较大的报文段,这将有助于提高性能(当然,这个较大的报文段不能够超过接收方声明的MSS)

作者原创,转载请标明原处:http://blog.csdn.net/xifeijian/article/details/44261821

时间: 2024-10-07 19:03:29

《TCP/IP详解》读书笔记(21章)-TCP的超时与重传的相关文章

TCP/IP卷2 - 读书笔记(1) 存储管理

最近在看TCP/IP的BSD实现.首先是它的存储管理,主要是通过mbuf这个结构体来管理缓存.看了一部分,觉得设计的很好,把大块的数据拆成小块存储,这样能很方便的写回收池.之前在写流媒体服务器时,一直苦恼对应帧数据大内存管理,分配的内存之后,该怎么回收,最后是模仿nginx的内存池,再每块固定大小的内存块前面加上了引用计数,再把这块内存分块分配,最后引用计数为0时再回收到池. 看了TCP/IP的缓存管理,觉得把帧数据打散存在固定大小的mbuf里,最后统一回收这块固定大小的结构块就可以了,也是一种

TCP/IP网络编程读书笔记-简单的套接字编程(1)

在linux和windows下都是通过套接字编程进行网络编程.不同的系统上通信有部分差别,现在刚开始学习,给自己学习的时候一个总结. 一,socket函数的套接字步骤 第一,linux网络编程中接受连接请求(服务器端)套接字的四个步骤: 1)调用socket函数创建套接字 2)调用bind函数分配IP地址和端口号 3)调用listen函数转为可接收请求状态 4)调用accept函数受理连接请求 第二,linux网络编程中请求连接(客户端)套接字的两个步骤: 1)调用socket函数创建套接字 2

TCP/IP知识总结(TCP/IP协议族读书笔记二)

接下来,总结一下网络层的协议,IP,ARP,RARP,ICMP,IGMP.当我们在网络传输的过程中,把分组交付到主机或路由器需要两级地址:物理地址和逻辑地址.而且我们需要能够把物理地址映射成为相应的逻辑地址,反过来的映射也是必要的. 这时候就涉及两个概念:静态映射与动态映射. 静态映射就是创建一个表,将逻辑地址与物理地址关联起来,这个表存储在网络的每一个机器上.可是存在于网络中的机器的物理地址是经常会发生改变的(更换网卡),这样静态映射表就得时常更新,影响网络的性能. 动态映射就是每当机器知道其

TCP/IP知识总结(TCP/IP协议族读书笔记四)

参考:http://blog.chinaunix.net/uid-26275986-id-4109679.html 继续!TCP的流量控制和拥塞控制. TCP相对UDP可靠的地方在于它的拥塞控制.流量控制. 一.流量控制: 如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失.所谓流量控制就是把发送方的发送速率不要太快,要让接收方来得及接收.利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制.主要的方式就是返回ACK中会包含自己的接受窗口的大小,并且利用大小来控

TCP/IP具体解释学习笔记--TCP数据流

1.TCP的交互数据流 (1)基本概念 所谓交互数据流,其对TCP而言,就是他们所产生的大多数的TCP报文段中所包括的数据不超过10个字节.比如聊天等telnet的软件的TCP数据流就属于TCP交互数据流 (2)经受时延的确认 TCP收到数据时并不会立即发送数据.相反它会推迟数据的发送,以便让ack和该方向要发送的数据一起发送(搭个便车.不然ack就得自己自己组成一个数据段发送,这样有可能造成网络发生拥塞),可是假设此方向一直没数据发送,那么ack就得一直等下去?当然不会,系统会给其定一个最长等

TCP/IP具体解释学习笔记——地址解析协议ARP

一 概述 我们知道,IP协议是用来在不同的物理网络之间数据传输的.要在不同的网络之间数据传输,至少须要将IP协议所用的地址转换成特定网络所使用的物理地址. 一般来说.就是将IPv4地址转换为mac地址.要想与一个特定的设备进行数据交换,光知道它的IP地址是不够的.还须要知道它的物理地址. 而地址解析协议(ARP)就是来完毕这个工作的,它能将IPv4地址转换为设备的硬件地址.须要注意的是.ARP仅仅能转换IPv4的地址.IPv6须要使用另外的协议进行转换. 另外须要说明的是,网络层和数据链路层地址

TCP/IP具体解释学习笔记--TCP的坚持和保活定时器

TCP的坚持定时器 1.基本概念 TCP的接收方指名希望从发送方接收的数据字节(窗体大小)来进行流量控制,假设窗体大小为0.那么放送方就会阻止发送数据,直到接收方发来一个已跟新窗体大小的ACK为止,那么假设接收方发送的这个ACK中途丢失了呢(这样的可能性是有的)?此时发送方收不到信息,就默认窗体大小还为0,那它就继续堵塞在那,这样就造成了死锁. 那么怎样解决此类问题呢,解决方式就是我此片博文的题目.TCP的坚持定时器.为了防止上述死锁的发生.TCP的发送方使用了一个坚持定时器.来周期性的向接收方

TCP/IP 网络编程 (抄书笔记 1) -- TCP

TCP/IP 网络编程 (抄书笔记 1) – TCP TCP/IP 网络编程 (抄书笔记 1) – TCP Table of Contents server client 更好的 client 端实现 来源: <TCP/IP 网络编程> 抄书: 通信的双方都各自 拥有 输入缓存和输出缓存 socket 的 write 函数并不是立即传输数据, 而是写到输出缓存区, 到达另一端的输入缓存区 socket 的 read 函数调用的瞬间, 就从输入缓存区中读取数据 TCP 协议中的滑动窗口会保证 数

TCP/IP详解学习笔记

TCP/IP详解学习笔记(1)-基本概念 TCP/IP详解学习笔记(2)-数据链路层 TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议 TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute TCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节 TCP/IP详解学习笔记(6)-UDP协议 TCP/IP详解学习笔记(7)-广播和多播,IGMP协议 TCP/IP详解学习笔记(8)-DNS域名系统 TCP/IP详解学习笔记(9)-TCP协议概述 TCP

《TCP/IP详解卷1:协议》第19章 TCP的交互数据流-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协