TCP的拥塞控制 (一)
拥塞控制不同于流量控制,拥塞控制是在拥塞发生时,发送方根据一定的反馈,主动调节自己的发送速率,以防止拥塞恶化的行为。
1. 网络拥塞
路由器是网络中的关键组件,其内部有一定量的缓冲区,用于缓存来不及转发(forward,或称transmit)出去的packet。如果将网络看成一个整体,那么一个网络的链路容量(link capacity)就取决于网络中的路由器的缓冲区大小。链路容量越大,整个网络可容纳的outstanding(即在网络中propagate)的packet就越多。
当网络中的packet较少时,每个packet进入路由器,会较快被转发出去,几乎没有延迟。而当网络中的packet过多时,路由器来不及转发,大量的packet就会在路由器中排队,等待转发(FIFO),此时packet就有较长的延迟,当缓冲区满时,后进来的packet甚至会被丢弃(lost packet)。这就是拥塞现象(congestion)。
2. Duplicate ACK
由TCP的Acknowledgement机制可知,receiver期待能按序地(in sequence)接受下一个packet。当out-of-order packet(乱序包)发生时,receiver(虽然会缓存乱序包)不会将错就错地回复乱序的包,而是坚持请求之前期待的包。receiver会在对应的ACK中指明未接受的packet中序号最小的一个(也就是一直期待的packet),而不是与错误的packet的相邻的下一个。这样以来,receiver每收到一个乱序包,都会发送一个与上一个ACK内容相同的ACK,直到收到所期待的packet为止,这就形成了重复ACK(duplicate ACK)。
重复ACK是网络拥塞情况的一个体现,当重复ACK出现时,说明出现了乱序包或者丢包,而乱序包和丢包又是网络拥塞所导致的,因此重复ACK越频繁,网络拥塞越严重。
在对网络拥塞的影响程度上,乱序包和丢包是不同的。前者仅仅意味着packet不是按序到达receiver,被跳过的packet很可能会在后面陆续到达,而后者意味着packet不会再到达了,因为已经在网络上被丢弃了。
可以看出,对于乱序包,sender是不需要做任何处理的,而对于丢包,sender需要负责重传丢失的packet。sender为了有针对性地处理两种情况,首先要采取一定的机制区分两种情况。统计发现,乱序包造成的重复ACK一般都是1~2个,而丢包造成的重复ACK则是3个及以上。因此,sender可以根据收到的重复ACK的个数,判断是否发生了乱序包或者丢包。
3. Retransmission Timeout
TCP可靠传输的核心是重传机制。当一个packet没有被receiver接收到时,sender需要重传该packet,直到receiver接收到packet为止。
触发重传有两种情况,且都与ACK有关。最经典的触发重传的情况是超时。当sender发送一个packet之后,即开启timer,等待对应的ACK,如果在timer结束前收到ACK,则认为paceket发送成功,否则认为发送失败,继而进行重传。可以看出timer的超时时间(RTO, Retransmission Timeout)是触发重传的关键,那么sender是如何合理地设置RTO的呢?很显然,RTO是与当前网络环境相关的一个变量,需要实时计算得到。联想到RTT,可以猜测RTO与RTT存在一定的联系,事实上RTO就是基于SRTT(smoothed RTT)计算得到的,两者存在线性关系。每当发送一个新的packet时,timer就被设置为当前RTO,之后每隔500ms更新一次,当收到相应的ACK时,timer就被停止,否则直到timer递减到0并触发重传。计算RTO的具体算法参考RFC6298。
4. 拥塞控制
Congestion Control不同于Flow Control,Congestion Control是在拥塞发生时,sender根据一定的反馈,主动调节自己的发送速率,以防止拥塞恶化的行为。
sender会根据两种现象探测拥塞的发生:
如果收到来自receiver的3个重复ACK(算上原始ACK,实际上有4个相同的ACK),则认为发生了拥塞,并且知道ACK中指明的即为lost packet。
如果ACK超时(超过RTO仍未收到ACK),也认为发生了拥塞,并且这种情况说明拥塞更加严重(因为连重复ACK都没收到)。
TCP引入了两个变量:rwnd和cwnd,用于拥塞控制。rwnd是receiver的接收窗口(receive window)的大小,也是它所建议的sender的发送窗口的大小,此变量最初目的是用于flow control中,协调双方的发送/接收速率。cwnd是sender的拥塞窗口的大小,sender所能发送的packet被限制在该窗口内,考虑到Flow Control里的发送窗口,sender最终的发送窗口被定义为min{cwnd, rwnd},因此LastByteSent – LastByteAcked <= min{cwnd, rwnd}.
cwnd和rwnd的单位是MSS(maximum segment size),表示TCP允许的最大单个报文的长度,不包括TCP头部信息。
可以粗略地认为发送窗口的大小就是cwnd。TCP一般在一个 RTT内,将发送窗口里的packet全部发送出去,因此发送速率为cwnd/RTT。因此,sender调节自己的发送速率实际上就是调整cwnd的大小。
TCP的拥塞控制 (一)的更多相关文章
- 计算机网络(10)-----TCP的拥塞控制
TCP的拥塞控制 拥塞(congestion) 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏. 拥塞控制 拥塞控制就是防止过多的数据注入到网络中,这样可以使网 ...
- TCP网络拥塞控制
拥塞控制过程 数据吞吐量 TCP窗口大小,窗口流量控制,慢启动对TCP的成块数据传输综合作用,可能对TCP的数据传输有意想不到的影响. RTT(Round-Trip Time) :往返时间.是指一个报 ...
- TCP/IP拥塞控制
TCP/IP拥塞控制包括:慢启动和拥塞避免.其操作流程如下所述: 初始化.拥塞窗口cwnd = 1,慢启动门限ssthresh = 65535 如果没有发生拥塞 若 cwnd < ssthres ...
- TCP的拥塞控制
1.引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止 ...
- TCP的拥塞控制(转载)
1.引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止 ...
- [转]TCP的拥塞控制
1.引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止 ...
- [计算机网络] TCP的拥塞控制
引言 计算机网络中的带宽.交换结点中的缓存和处理机等,都是网络的资源.在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏.这种情况就叫做拥塞. 拥塞控制就是防止过多 ...
- 【TCP】拥塞控制
TCP拥塞控制 出现拥塞 ∑对资源的需求 > ∑可用资源 拥塞控制是防止过多的数据注入到网络中,使网络中的路由器或链路不过载,这是一个全局性的. 流量控制是点对点的通信量的控 ...
- 【网络协议】TCP的拥塞控制机制
前言 计算机网络中的带宽.交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这样的情况就叫做拥塞. 所谓拥塞控制,就 ...
随机推荐
- 3060 抓住那头奶牛 USACO
3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛的位置,想要立即抓住它, ...
- 用php实现简单的自制计算器
存档: <!DOCTYPE html> <html> <head> <title>PHP实现计算器</title> </head> ...
- Python接口测试实战1(下)- 接口测试工具的使用
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- 第七章移动互联网与移动IP
第七章移动互联网与移动IP 本章延续前几章节,对该章节内容进行归纳总结. 文章中的Why表示产生的背景,也就是说为什么会产生该技术,What表示该技术是什么,How表示该技术是如何使用的.以下将用字母 ...
- Your funds transfer has been delayed
Hello from Amazon. Your funds transfer in the amount of 9,422.88 USD has been delayed because the cr ...
- ios程序后台继续运行
1.图标右上角显示消息个数 if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { UIUserNotificati ...
- 安装cocoa pods
1.移除现有Ruby默认源 $gem sources --remove https://rubygems.org/ 2.使用新的源 $gem sources -a https://ruby.taoba ...
- 404_NOTE_Foung_软工6
目录 NABCD分析引用 N(Need,需求): A(Approach,做法): B(Benefit,好处): C(Competitors,竞争): D(Delivery,交付): 初期 中期 个人贡 ...
- TCP系列43—拥塞控制—6、Congestion Window Validation(CWV)
一.概述 在RFC2861中,区分了TCP连接数据传输的三种状态 After sending a data segment: If tcpnow - T_last >= RTO ...
- Varnish是一款高性能的开源HTTP加速器
如何衡量缓存系统的优劣性 1:缓存命中率: 在memcached服务器中,get_hits的值表示缓存命中的次数,get_misses的值表示没有命中的次数,那么命中率的计算公式就是:命中率=get_ ...