浅谈TCP(2):流量控制与拥塞控制
上文 浅谈TCP(1):状态机与重传机制 介绍了TCP的状态机与重传机制。本文介绍 流量控制 (Flow Control,简称流控)与 拥塞控制 (Congestion Control)。TCP依此保障网络的 QOS (Quality of Service)。
根据前文对TCP超时重传机制的介绍,我们知道Timeout的设置对于重传非常重要:
而且,这个超时时间在不同的网络环境下不同,必须动态设置。为此,TCP引入了 RTT (Round Trip Time,环回时间):一个数据包从发出去到回来的时间。这样,发送端就大约知道正常传输需要多少时间,据此计算 RTO (Retransmission TimeOut,超时重传时间)。 听起来似乎很简单:在发送方发包时记下t0,收到接收方的Ack时记一个t1,于是RTT = t1 – t0。然而,这只是一个采样,不能代表网络环境的普遍情况。
RFC793 中定义了一个 经典算法 :
经典算法描述了RTO计算的基本思路,但还有一个重要问题:RTT的采样取“ 第一次 发Seq+收Ack的时间”,还是“ 重传 Seq+收Ack的时间”?
如图:
问题的本质是: 发送方无法区分收到的Ack对应第一次发的Seq还是重传的Seq (进入网络就都一样了)。针对该问题, Karn / Partridge 算法选择回避重传的问题: 忽略重传的样本,RTT的采样只取未产生重传的样本 。
简单的忽略重传样本也有问题:假设当前的RTO很小,突然发生网络抖动,延时剧增导致要重传所有的包;由于忽略重传样本,RTO不会被更新,于是继续重传使网络更加拥堵;拥堵导致更多的重传,恶性循环直至网络瘫痪。Karn / Partridge算法用了一个取巧的办法: 只要一发生重传,就将现有的RTO值翻倍(指数回退策略),待网络恢复后再仿照经典算法逐渐平滑以降低RTO 。
该算法已经做到可用,然而网络抖动对性能的影响比较大。
前面两种算法均使用加权移动平均算法做平滑,这种方法的最大问题是:很难发现RTT值上的较大波动,因为被平滑掉了(1 - a比较小,即最新RTT的权重小)。针对该问题, Jacobson / Karels 算法引入了最新采样的RTT值和平滑过的SRTT值的差距做因子,即 DevRTT (Deviation RTT,RTT的偏离度),同时考虑SRTT带来的惯性和DevRTT带来的波动:
Linux 26采用该算法计算RTO,默认取α = 0125, β = 025, μ = 1, ∂ = 4(玄学调参,你懂的)。
TCP使用 滑动窗口 (Sliding Window)做流量控制与 乱序重排 。乱序重排在TCP的重传机制中已经介绍,下面介绍流量控制。
TCP头里有一个字段叫Window(或Advertised Window), 用于接收方通知发送方自己还有多少缓冲区可以接收数据 。 发送方根据接收方的处理能力来发送数据,不会导致接收方处理不过来,是谓流量控制 。暂且把Advertised Window当做滑动窗口,更容易理解滑动窗口如何完成流量控制,后面介绍拥塞控制时再说明二者的区别。
观察TCP协议的发送缓冲区和接收缓冲区:
假设位置序号从左向右增长(常见的读、写缓冲区设计),解释一下:
据此在接收方计算 AdvertisedWindow ,在发送方计算 EffectiveWindow :
AdvertisedWindow衡量接收方还能接收的数据量,发送方要根据AdvertisedWindow决定接下来发送的数据量上限,即EffectiveWindow(可能为0)。
由于乱序问题的存在,LastByteRcvd可能指向Seq(LastByteSent),而Seq(LastByteAcked + 1)至Seq(LastByteSent - 1)都还在路上 ,即将到达接收方,最好的情况是不丢包(丢包后会重传), 则LastByteRcvd之后、接收缓冲区边界之前的空间就是发送方下一次发送数据的长度上限 (重传不属于下一次发送),因此, AdvertisedWindow = MaxRcvBuffer – (LastByteRcvd - LastByteRead) 。
LastByteRcvd还可能指向Seq(LastByteAcked)(一个新包都没有收到) ,显然AdvertisedWindow的公式不变, 而Seq(LastByteAcked + 1)至Seq(LastByteSent)都还在路上 ,未来将到达接收方,进入接收缓冲区,则“还在路上的Seq(LastByteAcked + 1)至Seq(LastByteSent)”不应超过接收缓冲区的剩余空间AdvertisedWindow(目前等于MaxRcvBuffer),这要求的是上一次发送满足LastByteSent - LastByteAcked ≤ AdvertisedWindow, 那么LastByteSent之后、接收缓冲区剩余空间边界之前的空间就是发送方窗口内剩余可发送数据的长度上限 ,因此, EffectiveWindow = AdvertisedWindow - (LastByteSent - LastByteAcked) 。
以下是一个发送缓冲区的滑动窗口:
上图分为4个部分:
其中, #2 + #3 组成了滑动窗口,总大小不超过AdvertisedWindow,二者比例受到接收方的处理速度与网络情况的影响(如果丢包严重或处理速度慢于发送速度,则 #2:#3 会越来越大)。
以下是一个AdvertisedWindow的调整过程,EffectiveWindow随之变化:
上图,我们可以看到一个处理缓慢的Server(接收端)是怎么把Client(发送端)的发送窗口size给降成0的。对于接收方来说,此时接收缓冲区确实已经满了,因此令发送方的发送窗口size降为0以暂时禁止发送是合理的。那么,等接收方的接收缓冲区再空出来,怎么通知发送方新的window size呢?
针对这个问题,为TCP设计了ZWP技术(Zero Window Probe,零窗通告):发送方在窗口变成0后,会发ZWP的包给接收方,让接收方来Ack他的Window尺寸;ZWP的重传也遵循指数回退策略,默认重试3次;如果3次后window size还是0,则认为接收方出现异常,发RST重置连接(<font color="red"> 部分文章写的是重试到window size正常??? </font>)。
注意:只要有等待的地方都可能出现DDoS攻击,Zero Window也不例外。一些攻击者会在和服务端建好连接发完GET请求后,就把Window设置为0,于是服务端就只能等待进行ZWP;然后攻击者再大量并发发送ZWP,把服务器端的资源耗尽。(<font color="red"> 客户端等待怎么耗服务端??? </font>)
为什么要进行拥塞控制?假设网络已经出现拥塞,如果不处理拥塞,那么延时增加,出现更多丢包,触发发送方重传数据,加剧拥塞情况,继续恶性循环直至网络瘫痪。可知,拥塞控制与流量控制的适应场景和目的均不同。
拥塞发生前,可避免流量过快增长拖垮网络;拥塞发生时,唯一的选择就是降低流量 。主要使用4种算法完成拥塞控制:
算法1、2适用于拥塞发生前,算法3适用于拥塞发生时,算法4适用于拥塞解决后(相当于拥塞发生前)。
在正式介绍上述算法之前,先补充下 rwnd (Receiver Window,接收者窗口)与 cwnd (Congestion Window,拥塞窗口)的概念:
介绍流量控制时,我们没有考虑cwnd,认为发送方的滑动窗口最大即为rwnd。实际上, 需要同时考虑流量控制与拥塞处理,则发送方窗口的大小不超过 min{rwnd, cwnd} 。下述4种拥塞控制算法只涉及对cwnd的调整,同介绍流量控制时一样,暂且不考虑rwnd,假定滑动窗口最大为cwnd;但读者应明确rwnd、cwnd与发送方窗口大小的关系。
慢启动算法 (Slow Start)作用在拥塞产生之前: 对于刚刚加入网络的连接,要一点一点的提速,不要妄图一步到位 。如下:
因此,如果网速很快的话,Ack返回快,RTT短,那么,这个慢启动就一点也不慢。下图说明了这个过程:
前面说过,当cwnd >= ssthresh(通常ssthresh = 65535)时,就会进入 拥塞避免算法 (Congestion Avoidance): 缓慢增长,小心翼翼的找到最优值 。如下:
慢启动算法主要呈指数增长,粗犷型,速度快(“慢”是相对于一步到位而言的);而拥塞避免算法主要呈线性增长,精细型,速度慢,但更容易在不导致拥塞的情况下,找到网络环境的cwnd最优值。
慢启动与拥塞避免算法作用在拥塞发生前,采取不同的策略增大cwnd;如果已经发生拥塞,则需要采取策略减小cwnd。那么,TCP如何判断当前网络拥塞了呢?很简单, 如果发送方发现有Seq发送失败(表现为“丢包”),就认为网络拥塞了 。
丢包后,有两种重传方式,对应不同的网络情况,也就对应着两种拥塞发生时的控制算法:
可以看到,不管是哪种重传方式,ssthresh都会变成cwnd的一半,仍然是 指数回退,待拥塞消失后再逐渐增长回到新的最优值 ,总体上在最优值(动态)附近震荡。
回退后,根据不同的网络情况,可以选择不同的恢复算法。慢启动已经介绍过了,下面介绍快速恢复算法。
如果触发了快速重传,即发送方收到至少3次相同的Ack,那么TCP认为网络情况不那么糟,也就没必要提心吊胆的,可以适当大胆的恢复。为此设计 快速恢复算法 (Fast Recovery),下面介绍TCP Reno中的实现。
回顾一下,进入快速恢复之前,cwnd和sshthresh已被更新:
然后,进入快速恢复算法:
下面看一个简单的图示,感受拥塞控制过程中的cwnd变化:
流量控制(traffic control)在不同的领域有不同的含义。如航空流量控制,网络流量控制等。
网络流量控制(Network traffic control)是利用软件或硬件方式来实现对网络数据流量进行控制的一种措施。
网络流量控制(Network traffic control)是一种利用软件或硬件方式来实现对电脑网络流量的控制。它的最主要方法,是引入QoS的概念,从通过为不同类型的网络数据包标记,从而决定数据包通行的优先次序。
DTE与DCE速度之间存在很大差异,这样在数据的传送与接收过程当中很可能出现收方来不及接收的情况,这时就需要对发方进行控制,以免数据丢失。
用于控制调制解调器与计算机之间的数据流,具有防止因为计算机和调制解调器之间通信处理速度的不匹配而引起的数据丢失。通常有硬件流量控制(RTS/CTS)和软件流量(XON/XOFF)控制。
DCE: Data Circuit-terminal Equipment,数据端接设备, 直接与信道连接的设备,当信道是模拟信道时,DCE是Modern。当信道是数字信道时,DCE是网桥、交换机、路由器等。[1]
DTE: Data Terminal Equipment数据终端设备)速度是指从本地计算机到Modem的传输速度,如果电话线传输速率(DCE速度)为56000bps,Modem在接收到数据后按V42 bis协议解压缩56000×4=115200bps,然后以此速率传送给计算机,由此可见56K猫(使用V42bis)的DTE速度在理想状态下都应达到115200bps。
流量控制
定义:流量控制用于防止在端口阻塞的情况下丢帧,这种方法是当发送或接收缓冲区开始溢出时通过将阻塞信号发送回源地址实现的。流量控制可以有效的防止由于网络中瞬间的大量数据对网络带来的冲击,保证用户网络高效而稳定的运行。
两种控制流量的方式:
1, 在半双工方式下,流量控制是通过反向压力(backpressure)即我们通常说的背压计数实现的,这种计数是通过向发送源发送jamming信号使得信息源降低发送速度。
2, 在全双工方式下,流量控制一般遵循IEEE 8023X标准,是由交换机向信息源发送“pause”帧令其暂停发送。
有的交换机的流量控制会阻塞整个lan的输入,这样大大降低了网络性能;高性能的交换机仅仅阻塞向交换机拥塞端口输入帧的端口。采用流量控制,使传送和接受节点间数据流量得到控制,可以防止数据包丢失。
航班流量编辑
空中交通管制(英文:Airtrafficcontrol,缩写:ATC)是指由在地面的空中交通管制员协调和指导空域或机场内不同航空器的航行路线和飞航模式以防止飞航器在地面或者空中发生意外和确保他们均可以运作畅顺,达至最大效率。除此之外,空中交通管制的系统还会提供例如天气、航空交通流量、NOTAM和机场特别安排等的资料以协助飞行员和航空公司等作出相应的安排。踏入21世纪,随着和航空活动有关的恐怖袭击的增加,空中交通管制系统还担当领空防卫和保护国土安全的角色,有些国家甚至是由空军来运作空中交通管制系统(例如巴西空军)。飞机在没有空中交通管制的情况下仍可以飞行,但管制的存在能有效确保飞行器的在空飞行安全。
简称流控。流量控制是指通过限制单位时间内进入某空中交通管制节点的航空器的数量,来维持空中安全的交通流。就是飞机在机坪或空中一架一架的排队等候放行起飞或下降落地指令。就像您办理登机手续时,为了飞行安全,需要一个一个排队依次过安检一样。
\
缘由:为了确保飞行、旅客生命财产的安全,可能起飞机场、途经的航路、目的机场天气不好(例如:夏季的雷雨、台风,冬季的雪、冰冻),或该地区有军演,或突发事件,或在某段时间内起飞降落该空域的飞机架次过多而采取的航班流量限制(空中不像地面车堵,可以停停走走,飞机在空中不能停留,因此一旦飞行架次超过一定数量,为了安全必须采取的措施)。
目的:飞行安全、旅客生命财产安全、飞行顺畅等等。
数据流量编辑
又可以理解为一种流量整形,是一个计算机网络的网络交通管理技术,从而延缓部分或所有数据包,使之符合人们所需的网络交通规则,速率限制的其中一种主要形式。
网络流量控制是用来优化或保证性能,改善延迟,和/或增加某些类型的数据包延迟满足某些条件下的可用带宽。如果某一个环节趋于饱和点,网络延迟可能大幅上升。因此,网络流量控制可以利用以防止这种情况发生,并保持延迟性检查。
网络流量控制提供了一种手段来控制在指定时间内(带宽限制),被发送到网络中的数据量,或者是最大速率的数据流量发送。这种控制可以实现的途径有很多,但是通常情况下,网络流量控制总是利用拖延发包来实现的,一般应用在网络边缘,以控制进入网络的流量,但也可直接应用于数据源(例如,计算机或网卡),或是网络中的一个元素。
网络流控编辑
控制实现
随着网络技术的快速发展,基于网络的应用越来越多、越来越复杂。种类繁多的应用正在吞噬着越来越多的网络资源网络作为一种新的传媒载体,也正在遭受媒体的冲击。尤其是网络视频、个人媒体、传统电视等媒体向互联网的渗入是的网络中的流量急剧上升,这使得运营商的运营和管理成本大幅度增长。运营商可以应用限流的方法控制网络流量,但这同时也限制了网络媒体的发展,最终不利于互联网的进一步发展。于是开发一种新的技术来控制网络流量成为一个研究热点。
现阶段互联网上的流量主要由P2P和HTTP产生,据估计这两种流量已经占到全部流量的70%以上,并且仍呈上升趋势。因此流量控制的重点是P2P和HTTP,降低这两种协议产生的流量将有效降低网络整体流量。通过对多种网络流量控制系统的比较,然后采用一种最优的系统。将系统部署在网络出口来缓存P2P和HTTP流量,对同一种资源的后续请求将有缓存来响应,从而降低网络流量、节省带宽并提高用户体验。
特点
(1)基于内容进行会话识别可以通过高速的深层协议分析,识别每一个网络会话所属的应用,可以针对某种协议进行拦截或者制定相应的带宽分配策略,而传统的路由器和防火墙等网络设备只能根据端口进行最初级的识别。
(2)智能的带宽调节功能可以根据网络负载智能调节网内的终端带宽分配方式,例如:如果网络负载较重则自动限制那此流量较大的终端,保证多数用户的网络应用能够正常、快速的得到响应;当网络负载较轻时,则采用宽松的带宽处理策略,以便网络的带宽能得到充分的利用。
(3) 基 于 终端的资源控制仅需设定一条规则,即可限定每台终端的带宽使用上限,同时可以设定每台终端的会话数量,防止由一病毒等原囚造成的网络资源耗尽,
(4) 带 宽 的按需动态分配由于HTTD带宽管理系统能看懂网络从第二到第七的协议层乃至会话间的关联,它能自动地分辨各种不同的协议、服务和应用深层速率控制技术
(DeeperRateControl)、可根据1P地址、子网、服务器地点、协议、应用端口、应用类型等基本特点及应用的关联性分析将这个信息流和其他信息流区分开来再根据不同的需要给予适当或应有的带宽级别(Privilege)和带宽政策(Policy),带宽级别和带宽政策可以按区间划分,实施方式是硬性或弹性的,根据不同的灵活实施,可以确保广域网有限资源的按需动态分配。
在广东等地区,由于AD线路有DNS与HTTP的连接数限制,当DNS请求量过多,会造成AD网络不稳定,对我们的客户造成诸多不便。
神行者路由因此开发了DNS缓存功能(在配置界面里叫"DNS代理"),旨在减少内网用户向外网请求DNS的连接,降低AD网络不稳定机率,同时减小DNS请求延时,使网络更顺畅。
开启 DNS缓存(代理)功能的方法如下图:
一般只需要填 “1”,然后保存即可。
朋友们一定很好奇,为什么上图说明里表明也可以填一个指定的DNS服务器IP地址?
请看下面解答:
我们为了降低上网用户的配置难度,当上网用户绑定DNS到 内网线路IP 上时,我们必须要在神行者流控上开启"DNS代理",否则用户将无法正常解析DNS。如果填114114114114,神行者则代理用户到114114114114 上请求DNS; 如果填 1,神行者则根据 外网线路 上的DNS IP 出去代理DNS请求。
如何查看 DNS缓存命中效果? 很简单,方法如下图:
在外网管理里点击线路名称,则可以看到在该线路上的DNS缓存命中情况。
特殊情况:
有少部分用户问:为什么我把 DNS代理开启后,DNS缓存命中率一直为0?
如果出现上面问题,请检查一下 DNS管控里是否存在类似如下策略:
由于DNS管控优先于 DNS缓存命中,如果DNS管控策略存在 任意 域名策略,那么 DNS缓存命中率则为0。
你说的这些设备我没接触过,但是流量控制与权限方式多种多样,有的管理是路由器就可以做到,但是一般比较贵,市场价在1800~45000不等(价格看需要承载负荷量与性能);我们公司用的是H3C的交换机,数据流通性比较稳定,寿命还不确定
如果想做到价格低,功能强大,建议自己架构一台panabitl流控服务器,200台以下的客户端控制差不多800元的电脑主机就可以承载了架构一台费用也花不了多少钱200~350元左右
设备通过对网络的关键点处的流量和报文内容进行检测分析,可以根据事先定义的策略对检测流量进行过滤控制,能完成所在链路的业务精细化识别、业务流量流向分析、业务流量占比统计、业务占比整形、以及应用层拒绝服务攻击、对病毒、木马进行过滤和滥用P2P的控制等功能。
统一DPI指一套DPI设备对链路上的流量进行采集与识别,并将满足其它系统所需的流量或分析统计数据分发给各第三方应用系统服务器。网络中各类流量管理相关的应用系统,如网间流控、Web Cache、非法VoIP检测、上网日志留存等,主要由DPI设备和应用服务器组成。
其中, DPI设备负责数据采集、流量分析统计、日志合成,应用服务器主要完成对数据的进一步分析处理,合理组织和存储数据,并进行呈现。统一DPI整合了多个第三方应用系统的DPI设备,通过DPI复用为多个系统提供DPI能力。
扩展资料例如:鼠标的DPI,指的是鼠标在桌面上移动1英寸(254mm),鼠标指针在屏幕上移动的像素点数量,如果你的鼠标设置为900DPI,那么你的鼠标在桌面上每移动1英寸——也就是约25厘米——长度的时候,鼠标指针在屏幕上将会移动900个像素点。
针对最普遍的1080p分辨率显示器来看,你需要将鼠标在桌子上移动1920/900254约541mm的长度才可以将鼠标指针从屏幕左侧水平移动到屏幕右侧。
以鼠标DPI为900计算,鼠标移动范围为24/900254=068mm,短边为22/900254=062mm,面积为068062=042平方毫米,夸张一点比喻,大约是一个小米米粒的大小。
对比一下400DPI的鼠标,(24/400254)(22/400254)=213平方毫米。
0条评论