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的拥塞控制机制
前言 计算机网络中的带宽.交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这样的情况就叫做拥塞. 所谓拥塞控制,就 ...
随机推荐
- spark submit参数及调优(转载)
spark submit参数介绍 你可以通过spark-submit --help或者spark-shell --help来查看这些参数. 使用格式: ./bin/spark-submit \ -- ...
- 创龙OMAPL138的NMI中断
1. 不可屏蔽中断部分代码,注册中断函数,6748有几个NMI的引脚? void InterruptInit(void) { // 初始化 DSP 中断控制器 IntDSPINTCInit(); // ...
- 使用Nexus搭建Maven私服问题总结
#业务场景 最近项目要交付给客户了,之前项目开发和测试一直都是使用公司内部的一套环境,项目交付后客户购置了大量服务器,也要将整套测试环境迁移至客户的服务器上,后续的需求变更以及新需求的开发都会在客户服 ...
- 【mysql优化】mysql count(*)、count(1)、count(主键字段)、count(非主键字段)哪个性能最佳
测试结果为:count(*)和count(1)基本相等,count(非主键字段)最耗性能 -- 数据量 708254select count(*) from tmp_test1;-- avg 0.22 ...
- docker制作自己的镜像并上传dockerhub
1.首先注册自己的dockerhub账号,注册地址:https://hub.docker.com 2.在linux服务器登录自己的账号:docker login --username=qiaoyeye ...
- oracle的分号和斜杠/
;是执行语句必须的/是执行语句块必须的 比如执行一个触发器 CREATE OR REPLACE TRIGGER "TRG_1" BEFORE INSERT ON "CAT ...
- hession矩阵的计算与在图像中的应用
参考的一篇博客,文章地址:https://blog.csdn.net/lwzkiller/article/details/55050275 Hessian Matrix,它有着广泛的应用,如在牛顿方法 ...
- Java如何调用shell脚本的
有些时候会碰到这样的场景:java的功能里面要嵌入一个功能点,这个功能是通过是shell脚本实现的.这种时候就需要Java对脚本调用的支持了. 测试环境 Ubuntu16.04 i3-6100,12G ...
- JS对字符串编码的几种方式
函数 描述 encodeURI() 把字符串编码为 URI encodeURIComponent() 把字符串编码为 URI 组件 escape() 对字符串进行编码 上面是查询来自w3school的 ...
- Segments CodeForces 909B (找规律)
Description You are given an integer N. Consider all possible segments (线段,划分)on the coordinate axis ...