0. AIMD算法的简单回顾
(1) 慢开始阶段说明
开始时cwnd为1个最大报文段(MSS), 每当一个MSS收到确认, 则cwn增加1个MSS大小, 过程:
开始 ---> cwnd = 1
经过1个RTT后 ---> cwnd = 2*1 = 2
经过2个RTT后 ---> cwnd = 2*2= 4
经过3个RTT后 ---> cwnd = 4*2 = 8
可见, 慢开始, 实际上是指数增长的, 并不慢. 如果带宽为W,那么经过RTT*log2W时间就可以占满带宽, 但是,这个其实不是无限制的增长。
(2) 拥塞避免阶段(AIMD)
TCP使用了一个叫慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。对于大多数TCP实现来说,ssthresh的值是65536(同样以字节计算)。拥塞避免的主要思想是加法增大(additive increase),也就是cwnd的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确认时,cwnd的大小加1,cwnd的值就随着RTT开始线性增加,这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值.
当出现拥塞的情况时: 把ssthresh降低为cwnd值的一半(multiplicative decrease), 把cwnd重新设置为1, 重新进入慢启动过程。
具体的伪代码如下:
nitially: cwnd = 1; ssthresh = infinite; New ack received: if (cwnd < ssthresh) /* Slow Start*/ cwnd = cwnd + 1; else /* Congestion Avoidance */ cwnd = cwnd + 1/cwnd; Timeout: /* Multiplicative decrease */ ssthresh = cwnd/2; cwnd = 1;
1. 在BDP下, 传统tcp的主要问题
(1) 效率问题: 传统tcp的AIMD的算法, 很难充分的利用带宽. 例子, MSS=1500-byte, RTT=100ms, 要达到10Gbps的带宽,拥塞窗口平均需要达到83333个MSS, 丢包率要达到5,000,000,000个MSS才丢一个, 如果从时间上说,要约1.6小时才丢一个,显然,这不现实。
上面例子的计算:
packet_size = 1500 byte
rtt = 100ms
throughput = 10Gbps
congestion_window=throughput*rtt/packet_size
发送的packet数目=throughput*rtt/packet_size=10*10^9*0.1/8/1500=83,333
根据拥塞窗口和丢包率p的关系: congestion_window=1.2/sqrt(p)
p=(1.2/congestion_window)^2=1/发送的总的包的数目
发送的总的包数=1/p=4,822,492,284 约 5,000,000,000个包才丢一个
发送5,000,000,000的时间5000000000/(83333*10)/3600=1.6h
一些tcp的计算公式:
R=RTT(s)
D=packet_size(bytes)
B=throughput (bps)
W=congestion window
得到:
W=BR/(8D)
W->1.2/sqrt(p)
根据丢包率: 1/p packets才丢一个包, 也就是1/(pW)个rtt才丢一个包(一个rtt可以发送W个)
RTTs Between Losses = 1/(pW)=1/[(1.2/W)^2*W]=W/1.5
也可以直接计算:
W=BR/(8D)
RTTs Between Losses = W/1.5=BR/12D
若R=0.1s, D=1500, 可以计算出一些示例:
TCP Throughput (Mbps) RTTs Between Losses W P
--------------------- ------------------- ---- -----
1 5.5 8.3 0.02
10 55.5 83.3 0.0002
100 555.5 833.3 0.000002
1000 5555.5 8333.3 0.00000002
10000 55555.5 83333.3 0.0000000002
(2) 公平性问题: 由于AIMD算法与RTT是相关的, 因此不可避免的存在不公平性, 即RTT小的链接会抢占更多的带宽.
tcp的性能随着丢包率和RTT的增大, 急剧的下降.
2. 已有的改进方法和缺点
(1) 修改AIMD算法, 使用大一点的增长参数, 小一点的减少参数. 例如: HighSpeed, Scalable, BiC, FAST, H-TCP, L-TCP. 但是这个难以部署, 开源的linux, 也要重新编译才能部署
(2) Parallel TCP, Rate-based reliable UDP, 主要用于私有网络, 其作用是最大可能的利用带宽, 实际使用时, 参数需要根据实际的网络进行调整, 适用场景较少.
3. udt
(1) 应用程序级别, 方便使用, 基于udp实现可靠传输,能充分利用带宽
(2) udt使用新的拥塞控制算法, 更好实现公平性.
相关推荐
UDT协议-基于UDP的可靠数据传输协议
UDT协议-基于UDP的可靠数据传输协议.pdfUDT协议-基于UDP的可靠数据传输协议.pdf
UDT协议-基于UDP的可靠数据传输协议.docxUDT协议-基于UDP的可靠数据传输协议.docx
UDT协议-基于UDP的可靠数据传输协议 (2).pdfUDT协议-基于UDP的可靠数据传输协议 (2).pdf
UDT协议-基于UDP的可靠数据传输协议 (2).docxUDT协议-基于UDP的可靠数据传输协议 (2).docx
UDT被设计为一种用于TCP数据传输协议不能高效运行场合下的替代方案。UDT可有效克服TCP在高带宽延迟(BDP)网络环境中的低效率传输问题,这也是开发UDT的初衷。另一个重要的应用场景是,允许网络研究人员、学生和应用...
UDT协议基于UDP的可靠数据传输协议.pdfUDT协议基于UDP的可靠数据传输协议.pdf
udt-java 可靠UDP传输 源码
UDT协议UDP可靠数据传输协议.pdfUDT协议UDP可靠数据传输协议.pdf
UDT协议UDP可靠数据传输协议.docxUDT协议UDP可靠数据传输协议.docx
Python UDP实现可靠传输 停等协议
基于UDT协议-通过libudt-http://udt.sourceforge.net/ UDT是一种可靠的基于UDP的应用程序级数据传输协议。 UDT是为超高速网络设计的,已用于支持TB级数据集的全局数据传输。 Ne Plus Ultra的构建具有极低的依赖性...
UDT是一种可靠的基于UDP的应用程序级别数据传输协议,用于广域高速网络上的分布式数据密集型应用程序。 UDT使用UDP通过其自己的可靠性控制和拥塞控制机制来传输批量数据。 新协议可以以比TCP更高的速度传输数据。 ...
基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。...
UDT(UDP-based Data Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠...
从能耗角度对比了标准TCP协议、基于TCP协议改进的XCP协议、基于UDP协议改进的Reliable Blast UDP(RBUDP)和UDP-based Data Transport(UDT)协议,进一步分析各协议的拥塞控制策略对能耗的影响。利用ns-2平台进行...
VTCP是虚拟TCP协议缩写,它实现了UDP可开传输,UDP本来是一种不可靠的网络协议,但在有些情况下UDP协议可能会变得非常有用。...因此我们设计出了一种新的可靠UDP协议(VTCP),自动实现UDP数据传输的可靠性。
实现可靠的UDP传输。虽然名字叫UDT,但是和UDT有着本质区别(主要是不想费脑筋取名字),它可以像UDP一样实现多点自由传输,而无需像UDT那样必须建立服务器,然后等待连接然后在传输。 所用原理就是简单的 确认 + 超时...
对udt的研究总结。UDT是基于UDP的互联网数据传输协议,它是面向连接的双向应用层协议。
基于UDP的数据传输协议(英语:UDP-based Data Transfer Protocol,缩写:UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上...