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的拥塞控制机制
前言 计算机网络中的带宽.交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这样的情况就叫做拥塞. 所谓拥塞控制,就 ...
随机推荐
- 【洛谷P4178】Tree
题面 题解 感觉和\(CDQ\)分治一样套路啊 首先,构建出点分树 对于每一层分治重心,求出它到子树中任意点的距离 然后\(two-pointers\)计算满足小于等于\(K\)的点对数目,加入答案 ...
- ELKStack入门篇(一)之ELK部署和使用
一.ELKStack简介 1.ELK介绍 中文指南:https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details ELK Stack包 ...
- dotnet core在Task中使用依赖注入的Service/EFContext
C#:在Task中使用依赖注入的Service/EFContext dotnet core时代,依赖注入基本已经成为标配了,这就不多说了. 前几天在做某个功能的时候遇到在Task中使用EF DbCon ...
- 解析hdr图像文件的python实现
如题 import cv2 import numpy as np def rgbe2float(rgbe): res = np.zeros((rgbe.shape[0],rgbe.shape[1],3 ...
- WPF RegisterAttached ListBoxItem(附加属性传递到Item)
/// <summary> /// Controls的附加属性 /// </summary> public class ControlsAttached : Dependenc ...
- 自动化之UI(autoit)
自动化 说到自动化,我真的很不喜欢UI这层去做实践.前置条件要求比较严谨,如果不满足特定的前置条件,那么成本实在太大了. 投入与产出差过大,效果打折扣.从互联网来说,UI自动化是入门门槛很低的一种实践 ...
- php文章tag标签的增删
<?php session_start(); if($_POST){ $_SESSION['old']=array('one','two','three','four', ...
- html的背景样式图片
背景图片 如果背景图片小于当前的div的情况下 默认的是将平铺充满元素 background-image 设置背景图片. background-repeat 设置是否及如何重复背景图片. repeat ...
- 论文笔记:Visual Object Tracking based on Adaptive Siamese and Motion Estimation Network
Visual Object Tracking based on Adaptive Siamese and Motion Estimation 本文提出一种利用上一帧目标位置坐标,在本帧中找出目标可能出 ...
- lintcode-203-线段树的修改
203-线段树的修改 对于一棵 最大线段树, 每个节点包含一个额外的 max 属性,用于存储该节点所代表区间的最大值. 设计一个 modify 的方法,接受三个参数 root. index 和 val ...