`

TCP的超时和重传

 
阅读更多

 

 

对于每连接,TCP管理4个不同的定时器:

1.重传定时器适用于当希望收到另一端的确认

2.坚持(persist)定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口

3.keepalive定时器可检测到一个空闲连接的另一端何时崩溃或重启

4.2ML定时器测量一个连接处于TIME_WAIT状态的时间

当TCL发送端检查到一段时间没有收到ACK,就会重新发送这个报文段。


 

 

 

RTT测量

RTT(Round Trip Time)是指一个数据包从发送到确认的时间,也就是发送的时间t1,接收到ACK的时间t2,然后t2-t1就得到了RTT时间

之后TCP会跟踪每个发送的数据包,如果超时了就会重发

RTO(Retransmission TimeOut)超时重传,由于网络环境不同,这个值是动态计算的,但如果计算时间短了就会频繁的重发,导致网络更多的拥塞;如果时间设置长了导致丢失很长时间才重发效率下降。

RTT的时间一般用定时器做计算,每500毫秒算一次(一个滴答),比如经过了550毫秒就算两个滴答,就计算为1000毫秒,如果是1.061秒就算作3个滴答。 

 

RTO的经典算法如下:

1)先采样RTT,记下最近好几次的RTT值。

2)然后做平滑计算SRTT(Smoothed RTT)。公式为:(其中的 α 取值在0.8 到 0.9之间,这个算法英文叫Exponential weighted moving average,中文叫:加权移动平均)

SRTT = ( α * SRTT ) + ((1- α) * RTT)

3)开始计算RTO。公式如下:

RTO = min [ UBOUND,  max [ LBOUND,   (β * SRTT) ]  ]

其中:

UBOUND是最大的timeout时间,上限值

LBOUND是最小的timeout时间,下限值

β 值一般在1.3到2.0之间。

 

Karn算法

使用经典算法会碰到一些问题,假设发生了超时重传,那么

1.使用第一次发送的时间和收到的ACK作为RTT

2.使用重传的时间和收到的ACK作为RTT


很明显这里会存在问题,左边的情况,当发生重传了,如果使用第一次发送的时间后收到的ACK时间那么RTT时间就会变长;右边的情况,虽然发生了重传,但是对方其实已经收到了第一次的数据只是ACK回来慢了,此时如果使用第二次重传的时间和收到的ACK时间那么RTT的时间又短了。 

Karn算法规定忽略重传,不把重传的RTT作为采样

但是这样一来又会有一个新的问题,如果此时网络突然拥塞导致数据丢包结果重传,但是此时RTO很小不会被更新,这样就出现问题了。Karn算法增加了一个条件如果出现重传则RTO时间翻倍,也就是说为的

Exponential backoff,但这样对要求比较精准的RTT则不合适。

 

Jacobson算法

前面两种算法用的都是“加权移动平均”,这种方法最大的毛病就是如果RTT有一个大的波动的话,很难被发现,因为被平滑掉了。最新的RTT的采样和平滑过的SRTT的差距做因子来计算。 公式如下:(其中的DevRTT是Deviation RTT的意思)

SRTT = SRTT + α (RTT – SRTT)  —— 计算平滑RTT

DevRTT = (1-β)*DevRTT + β*(|RTT-SRTT|) ——计算平滑RTT和真实的差距(加权移动平均)

RTO= µ * SRTT + ∂ *DevRTT —— 最终值

在Linux下,α = 0.125,β = 0.25, μ = 1,∂ = 4

这个算法在被用在今天的TCP协议中

 

 

 

乘积带宽延迟

Round-Trip Time(RTT)往返时间

Retransmission TimeOut(RTO)重传超时

计算通道的容量为:

capacity(bit) = bandwidth(b/s) * round-trip time(s)

RTT加倍可使管道容量增加一倍,也就是可以多发一倍的数据

带宽加倍可使容量增加一倍,同样也是可以多发一倍的数据

 

 

 

慢启动和拥塞控制

慢启动为发送方的TCP增加了一个窗口:拥塞窗口(congestion window),记做 cwnd

当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每

收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增

加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。

拥塞窗口是发送方使用的流量控制

滑动窗口是接收方使用的流量控制

慢启动的时间流逝图如下(使用指数增加的方式,慢慢的增加,如果网速很快,增长的也会很快)


拥塞避免算法和慢启动算法需要对每个连接维持两个变量: 一个拥塞窗口cwnd和一个慢启动门限ssthresh,这样得到的算法工作过程如下:

1.对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。

2.TCP输出列程的输出不能超过cwnd和接收方通告窗口的大小。

3.当拥塞发生时(超时或者受到重复确认),ssthresh被设置为当前窗口大小的一般(cwnd和接收方通告窗口大小的最小值,但最少为2个报文段)。此外如果是超时引起了拥塞,则cwnd被设置为1个报文段。

4.当新的数据被对方确认没增加cwnd,但增加的方法依赖于我们是否进行慢启动或拥塞避免。如果cwnd小于或等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。

 

对于慢启动的计算方式:

1.初始的cwnd=1,此时可以发送1个字节的MSS

2.每收到一个ACK,cwnd++,也就是线性增长

3.每经过一个RTT,也就是指数增长

4.当cwnd>=ssthresh时,就会进入 拥塞避免 算法

 

拥塞避免的计算方式:(慢启动阀值slow start threshold)

当cwnd>=ssthresh时,就进入拥塞避免状态

1.每收到一个ACK时,cwnd = cwnd + 1/cwnd

2.每过一个RTT时,cwnd = cwnd + 1

所以这是一个线性增长的算法

 

拥塞恢复算法:

1.设置sshthresh =  cwnd /2

2.设置cwnd 重置为 1

3.进入慢启动过程

 

快速恢复算法:

1.设置cwnd = cwnd /2

2.设置sshthresh = cwnd

3.cwnd = sshthresh  + 3 * MSS (3的意思是确认有3个数据包被收到了)

4.重传Duplicated ACKs指定的数据包

5.如果再收到 duplicated Acks,那么cwnd = cwnd +1

6.如果收到了新的Ack,那么,cwnd = sshthresh ,然后就进入了拥塞避免的算法了。

但是快速恢复算法依赖于三个重复的ACK,但是收到3个重复的ACK可能不止丢一个包可能就很多,而那些需要等到RTO超时才会重传

 

 

 

 

ICMP差错和重新分组

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

1.一个接收到的源站抑制引起拥塞窗口cwnd被设置为1个报文段大小来发起慢启动,但是慢启动门限ssthresh没有变化,所以窗口将打开直至它或者开放了所有的通路(受窗口大小和往返时间的限制)或者发生了拥塞。

2.一个接收到的主机不可达或者网络不可达实际上都被忽略,因为这两个差错都被认为是短暂现象,这有可能是由于中间路由器被关闭而导致选录协议要花费数分钟才能稳定到另一个替换路由。

对端可能会因为不可达而由路由器返回ICMP差错,发送方经过N次重试后最终放弃。

 

当发送一个报文段A,没有成功(可能网络暂时故障),之后又发送了一个B,此时网络恢复可以发送了,TCP可能会将A和B合并成一个报文段一起发送

 

 

参考:

TCP的那些事儿

RTO经典算法

Karn算法

Jacobson算法

拥塞控制论文

TCP的拥塞控制算法

 

 

  • 大小: 50.6 KB
  • 大小: 44.4 KB
  • 大小: 26.7 KB
分享到:
评论

相关推荐

    TCP超时和重传机制之停等协议ARQ

    在深入探讨TCP超时和重传机制之停等协议ARQ前,我们首先明确几个核心概念,以便于后续的理解和分析。TCP(Transmission Control Protocol),即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议,用于...

    传输层--TCP的超时重传、流量控制和拥塞控制1

    快速重传和快速恢复则在检测到部分数据丢失时,更快地调整发送速率以适应网络状态。 总之,TCP通过这些复杂而精细的机制,确保了网络数据传输的可靠性、高效性和稳定性。这些机制协同工作,使得TCP成为互联网上广泛...

    TCP重传计时器浅析

    5. TCP代码分析:从给定内容中的Linux内核TCP代码片段可以得知,和重传相关的定时器只有一个,这进一步验证了在TCP连接中只有一个重传计时器的观点。这些代码段展示了如何初始化重传计时器以及如何在发送新数据时...

    TCP-TIMEOUT.rar_ tcp timeo_CFG TCP/IP TIMEOUT_TCP 超时_超时三次

    这是TCP的快速重传和快速恢复算法的一部分,旨在快速识别并解决网络问题。 综上所述,TCP/IP协议中的TCP超时和三次握手是保障数据传输可靠性的关键机制。理解并适当地配置这些参数对于优化网络性能、提高通信质量至...

    hellokangning#dev-notes#21、TCP的超时与重传1

    最初的TCP规范使TCP使用低通过滤器来更新一个被平滑的RTT估计器:Karn算法:当一个超时和重传发生时,在重传数据的确认最后到达之前,不能更新RTT估计器,

    论文研究-一种基于动态阈值的TCP超时重传策略.pdf

    针对传统的TCP拥塞控制算法在发生超时后存在恢复时间长、收敛性差、网络抖动剧烈等问题,在超时重传策略的基础上提出一种基于动态阈值的超时重传算法。该算法不仅使得网络拥塞处理更为平滑,同时可显著提高数据传输...

    STM32F750实现TCP网络通信【支持STM32F7系列单片机_寄存器库驱动】.zip

    为了提高性能和降低功耗,你可能还需要对TCP连接进行优化,例如使用TCP连接池、优化内存分配策略、合理设置TCP超时和重传参数等。 在项目调试和移植过程中,需要确保STM32F750的时钟系统、存储器配置以及中断优先级...

    tcp数据传输与重传过程

    TCP 数据传输与重传过程 ...TCP 协议的数据传输与重传过程是一个复杂的过程,涉及到三次握手、数据传输、确认机制、重传机制和超时时间等方面。理解这些机制对于确保数据的正确传输和可靠性非常重要。

    TCP封闭类TCP封闭类

    此外,优化TCP封闭类的过程也是提高网络性能的一个方面,例如,可以通过设置合适的TCP超时和重传策略来减少因网络延迟或丢包导致的连接关闭延迟。另外,有些情况下可能需要使用半关闭状态(一方停止发送,但继续接收...

    亲身尝试稳定好用LWIP..

    使用LWIP的一个关键步骤是正确配置选项,例如设置内存池大小、选择启用哪些协议、调整TCP超时和重传策略等。配置文件通常包含在项目源码中,可以根据实际需求进行定制。 在压缩包文件列表中看到的`lwip-contrib-...

    tcp协议如何处理链接超时

    然后创建一个TCP套接字`cClient`,并设置它的属性,例如设置发送和接收超时,这里使用`setsockopt`函数,参数`SO_SNDTIMEO`和`SO_RCVTIMEO`分别对应发送和接收超时。 接着,将套接字设置为非阻塞模式,这可以通过`...

    C++ TCP客户端非阻塞连接超时测试源码

    如果连接尚未建立,客户端将重新发送连接请求,这就是TCP重传(Retransmission)的概念。 "ConsoleApplication2"源码很可能包含了一个简单的C++客户端程序,它利用非阻塞模式尝试连接到指定的服务器,并在连接失败...

    p164 - p198 TCP重传 滑动窗口 流量控制 拥塞控制

    其中超时重传是TCP重传机制的一种方式,即在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对端的ACK确认应答报文,就会重发该数据。超时重传时间的设定非常重要,应该略大于报文往返时间RTT的值。 RTT...

    11.1.1 TCP 重传 - Wireshark 数据包分析实战(第 3 版) - 知乎书店1

    当预期的ACK未到达时,出现了重传数据包,Wireshark的Packet List面板会显示[TCP Retransmission]标记,同时在Packet Details和Packet Bytes面板中可以对比原始数据包和重传数据包的差异,除了IP identification和...

    tcp发消息续传文件

    这可以减少不必要的延迟,因为TCP的超时重传机制可能在较长的时间后才触发。 5. **流量控制**:在传输过程中,TCP的滑动窗口机制能够自动调整发送速率,避免因网络拥堵而频繁重传。在续传文件时,这一特性尤为重要...

    Linux中通过Socket文件描述符寻找连接状态介绍.docx

    6. `tr`、`tm->when`、`retrnsmt`:与TCP超时和重传相关的参数。 7. `uid`:拥有该连接的用户ID。 8. `timeout`:连接超时时间。 9. `inode`:与Socket关联的inode号。 在`/proc/net/tcp`的输出中,我们可以看到一...

    六、TCP重传、滑动窗口、流量控制、拥塞控制1

    TCP 使用慢启动、拥塞避免、快速重传和快速恢复算法来应对网络拥塞。 - **慢启动**:TCP 连接建立初期,通过逐渐增大发送窗口来探测网络容量。 - **拥塞避免**:当检测到网络拥塞迹象时,TCP 会进入拥塞避免阶段,...

    LabVIEW TCP 通讯 自动连接 掉线自动重连

    通过以上这些知识点,你可以理解如何在LabVIEW中实现TCP/IP通信,以及如何构建一个具备自动连接和重连功能的系统。记住,理解和掌握这些概念对于构建稳定、可靠的网络通信系统至关重要。在实际项目中,还需要根据...

    Tcpclient连接服务器连接超时设置

    在使用C#的`System.Net.Sockets`命名空间中的`TcpClient`类进行TCP连接时,可能会遇到连接超时的问题。本篇文章将深入探讨如何设置`TcpClient`的连接超时功能。 首先,我们需要了解`TcpClient`类的基本用法。`...

    linux下使用libevent实现断网重连的tcp客户端

    linux下使用libevent实现断网重连的tcp客户端,自动检测tcp连接断开,断开后能自动重连;如果连不上服务器,则一直尝试连接服务器,直至连接成功。

Global site tag (gtag.js) - Google Analytics