tcp协议系列文章(3):TLP算法

news/2024/5/17 17:27:44 标签: tlp, tcp

一、起因

近日在用物理损伤仪对公司无线网络相机进行测试时抓到一个数据包,包含有如下的tcp交互过程:



抓包命令为tcpdump -i any -vv -w p.pcap

因为抓的是所有网卡,未做任何过滤,且tcpdump也没有dropped packet。因此上面的抓包是完整的。

从图中可以看到,交互双方是192.168.139.50和1.2.3.4(用以指代对端ip)。在192.168.139.50未发送sack,也没有达到默认的超时重传超时时间,但是1.2.3.4却发送了一个重传包。而且发生这种重传的实际也不固定,没有规律可循。


于是在网上搜索了一番,发现了一个叫做TLP的算法。简单介绍一下。

下面内容的原文在http://perthcharles.github.io/2015/10/31/wiki-network-tcp-tlp/ 对原作者表示感谢。

关于TLP的RFC文档可在https://tools.ietf.org/html/draft-dukkipati-tcpm-tcp-loss-probe-01 下载到。该算法有两个版本,这个连接是较新的版本。


二、TLP算法

TLP全称是TCP Tail Loss Probe。

Early Retransmit机制解决了dupack较少,无法触发快速重传的问题。但是如果发生了尾丢包,由于尾包后面没有更多的数据包,也就没有办法触发任何的dupack。为解决这种尾丢包的问题,Google的几位大神提出了TLP算法。通过TLP算法,发送一个loss probe包,来产生足够的SACK/FACK的信息来触发RF。根据Google的测试,TLP能够有效的避免较长的RTO超时,进而提高TCP性能。


TLP基本策略


TLP算法会在TCP还是Open状态的时候,设置一个Probe TimeOut (PTO)。
当链路中有未被确认的数据包,同时在PTO时间内未收到任何ACK,则会触发PTO超时处理机制。
TLP会选择传输序号最大的一个数据包作为tail loss probe包,这个序号最大的包可能是一个可以发送的新的数据包,也可能是一个重传包。
TLP通过这样一个tail loss probe包,如果能够收到相应的ACK,则会触发FR机制,而不是RTO机制。

触发超时机制的常见场景
这些case还是用大神们的原文描述比较准确:)

a. Drop tail at the end of transactions.
b. Mid-transaction loss of an entire window of data or ACKs.
c. Insufficient number of duplicate ACKs to trigger fast recovery at sender.
    -- 基本被Eearly Retransmit机制解决了
d. An unexpectedly long round-trip time(RTT), such that the ACKs arrive after
   the RTO timer expires.
    -- F-RTO机制通过检测spurious retransmission,能够尽量的undo RTO造成的影响

Google Web servers上面,将近70%的重传是RTO超时重传,只有30%是Fast Recovery重传。
同时还有数据表明,96%的RTO超时重传是在没有收到任何dupack的情况下发生的。
没有到任何dupack就意味着FR和ER机制都是无法生效的。

(笔者注:换句话说,TLP算法最初的构想来自于统计数据!)


RTO与RTT的比值分布


Googler们还收集RTO/RTT的分布,来了解RTO值到底比RTT值大多少。下面是统计结果

Percentile      RTO/RTT
50%             4.3
75%             11.3
90%             28.9
95%             53.9
99%             214

根据这个数据,显然这是一个CDF的统计。也就是说,50%的流,RTO/RTT小于4.3,75%的流,RTO/RTT小于11.3
不过反过来看,有50%的流RTO/RTT超过4.3,25%的流RTO/RTT超过11.3。
不过这个数据Googler并没有进一步的解释,有很多疑问在里面。
RTO的min值默认是200ms,这数据里面的是多少?这个数据里面是否同时包含了internet-face流和local-face流。
比如说,local-face流的rtt一般很小,常见值就是1.875ms,而min RTO值200ms的话,显然RTO/RTT很容易超过100
不过话说回来,数据来看,local-face的流应该没有包括,但是min RTO就不清楚了。


Googler认为”Such large RTOs make a huge contribution to the long tail on the latency statistics of short flows.”
这点如果结合TLP考虑的情景,推断确实合理。


那将RTO的计算值设置的较小一点如何?可能会造成两个问题:
a. spurious retransmission
b. 更多的RTO => cwnd=1


TLP试图解决的方式是将”尾丢包+RTO”这种case转换为”尾丢包+尾探测+FR”。




http://www.niftyadmin.cn/n/1648148.html

相关文章

docker 网络的几种模式

docker 网络分为单机和多机,我们来了解一下docker的单机网络 docker单机网络分为以下几种: 1)bridge NetWork,使用--netbridge指定,默认设置。2)Host NetWork ,使用--nethost指定。3&#xff09…

tcp协议系列文章(4):TCP带宽,时延和RTT等的关系

原文来自网络,出处不可考。对原作者表示感谢。 一、概念 窗口: TCP是一个滑动窗口协议,即一个TCP连接的发送端在某个时刻能发多少数据是由滑动窗口控制的,而滑动窗口的大小实际上是由两个窗口共同决定的,一…

tcp协议系列文章(5):select:同步I/O复用

本次讲下select函数。 近日在维护公司旧项目代码时,发现了两个跟select有关的问题:一个是select()的nfds传0,第二个是timeout值while外面赋值、而while内每次select()时没有重新赋值。 这两个问题是select()手册中特地提出的两个要警惕的点。…

windows自带性能监视器的使用

性能指标的来源包括从需求文档中获得、和业务分析师的沟通中获得。 性能测试指标标准: 1、业务指标。包括tps、rt等 指标含义throughtput吞吐量TPSKB/sec数据传输量,每秒事务流量Average平均响应时间Std.Dev.响应时间的标准偏差90% Line90%事务响应时间范…

CF1129E Legendary Tree 构造

传送门 神树可还行 我们令\(1\)为树根,那么如果要询问\(x\)是否在\(y\)子树中,就令\(S \{1\} , T \{x\} , u y\),询问一下就可以知道了。 那么考虑先构造出一个这样的序列\(a_i\):对于树上的每一个节点\(u\),它的父…

postgreSQL记录

postgreSQL11.2安装以及postGIS安装 本文使用版本为postgresql-11.2-1-windows-x64 安装时会依次询问安装路径、端口号、密码,以及三个其他询问(具体忘了,默认选择上), 在弹出Stack Build中Spatial extensions选择postGIS,路径可以与之前相同…

tcp协议系列文章(7):send()的数据大小与可用的发送缓冲区大小的关系

笔者这里要指出的是,man send 手册上说的或许与send()的版本有关。详细的,可以查看笔者的另一篇博客,上面有就send()的行为的详细说法。 tcp协议系列文章(6):send 下面的博客内容,其实验证的…

NAT的四种类型及类型检测

本文转载自http://www.cnblogs.com/my_life/articles/1908552.html,不知是否为原始出处。对原作者表示感谢! 考虑到UDP的无状态特性,目前针对其的NAT实现大致可分为Full Cone、Restricted Cone、Port Restricted Cone和Symmetric NAT四种。值…