Token Bucket 令牌桶算法
令牌桶算法是網絡流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法。典型情況下,令牌桶算法用來控制發送到網絡上的數據的數目,并允許突發數據的發送。
令牌桶這種控制機制基于令牌桶中是否存在令牌來指示什么時候可以發送流量。令牌桶中的每一個令牌都代表一個字節。如果令牌桶中存在令牌,則允許發送流量;而如果令牌桶中不存在令牌,則不允許發送流量。因此,如果突發門限被合理地配置并且令牌桶中有足夠的令牌,那么流量就可以以峰值速率發送。
?
令牌桶算法可以在概念上理解如下:
- 若用戶配置的平均發送速率為r,每?秒令牌都會添加到存儲桶中。
- 桶最多可以容納令牌。如果令牌在存儲桶已滿時到達,則將其丟棄。
- 當n個字節的包(網絡層PDU)到達時,
- 如果存儲桶中至少有n個令牌,則從存儲桶中刪除n個令牌,并將數據包發送到網絡。
- 如果可用的令牌少于n個,則不會從存儲桶中刪除令牌,并且該包在流量限制之外。
該算法的實施者在平臺上缺乏每次向桶中添加單個令牌所需的時鐘分辨率?秒可能想要考慮另一種配方。鑒于能夠每S毫秒更新令牌桶,每S毫秒增加一個令牌數=。
平均費率[?編輯]
從長遠來看,符合數據包的輸出受令牌速率的限制,?{\ displaystyle r}。
突發大小[?編輯]
讓?{\ displaystyle M}?是最大可能的傳輸速率,以字節/秒為單位。
然后?是最大突發時間,即速率的時間?{\ displaystyle M}?充分利用。
因此,最大突發大小?
?
算法允許最長b個字節的突發,但從長期運行結果看,數據包的速率被限制成常量r。對于在流量限制外的數據包可以以不同的方式處理:
它們可以被丟棄;?
它們可以排放在隊列中以便當令牌桶中累積了足夠多的令牌時再傳輸;?
它們可以繼續發送,但需要做特殊標記,網絡過載的時候將這些特殊標記的包丟棄。?
注意:令牌桶算法不能與另外一種常見算法“漏桶算法(leaky?Bucket)”相混淆。這兩種算法的主要區別在于“漏桶算法”能夠強行限制數據的傳輸速率,而“令牌桶算法”在能夠限制數據的平均傳輸數據外,還允許某種程度的突發傳輸。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允許突發地傳輸數據直到達到用戶配置的門限,因此它適合于具有突發特性的流量。
詳解
?
QoS中的流量監管(Traffic Policing)就是對流量進行控制,通過監督進入網絡端口的流量速率,對超出部分的流量進行“懲罰”(這個懲罰可以是丟棄、也可是延遲發送),使進入端口的流量被限制在一個合理的范圍之內。例如可以限制HTTP報文不能占用超過50%的網絡帶寬,否則QoS流量監管功能可以選擇丟棄報文,或重新配置報文的優先級
QoS流量監管功能是采用令牌桶(Token-Bucket)機制進行的。這里的“令牌桶”是指網絡設備的內部存儲池,而“令牌”則是指以給定速率填充令牌桶的虛擬信息包。可以這么簡單理解,“令牌桶”可以理解為一個水桶,而“令牌”則可以理解為通過一根水管流到水桶中的水。
交換機在接收每個幀時都將添加一個令牌到令牌桶中,但這個令牌桶底部有一個孔,不斷地按你指定作為平均通信速率(單位為b/s)的速度領出令牌(也就是從桶中刪除令牌的意思)。相當于一個水桶的上邊連接一根進水的水管,而下邊又連接一根連接到用水的地方的出水管。在每次向令牌桶中添加新的令牌包時,交換機都會檢查令牌桶中是否有足夠容量(也就是在要向桶水加水前,先要檢查是桶內否已滿了),如果沒有足夠的空間,包將被標記為不符規定的包,這時在包上將發生指定監管器中規定的行為(丟棄或標記),就相當于如果當前水桶滿了,但上邊水管的水還是來了,這時要么就是讓這些水白白流到桶外,要么把這些水用其它容器先裝起來,等水桶中不再滿水時再倒進去,供用戶使用。整個令牌桶的基本工作原理可以用上圖來表示
令牌桶填滿的時間長短是由令牌桶深度(也就是容量,單位為bit,類似于水桶的的深度)、令牌漏出速率(類似桶下邊接的水管的水速)和超過平均速率的突發通信流(類似于上桶上邊水管突發的急速水流)持續的時間三個方面共同決定的。 令牌桶的大小利用突發時長上限乘以點對點傳輸時的幀數限制得出(也就類似突發水流持續的時間*突發水流的流速)。如果突發時間比較短,令牌桶不會溢出,在通信流上不會發生行為。但是,如果突發時間比較長,并且速率比較高,令牌桶將溢出,這時將對突發過程中的幀采取相應的流監管策略行為(也就是在水桶滿水后對溢出的水的處理方法)。
在令牌桶處理包的行為方面,RFC中定義了兩種令牌桶算法——單速率三色標記(single rate threecolor marker,srTCM)算法和雙速率三色標記(two rate threecolor marker,trTCM)算法,其評估結果都是為包打上紅、黃、綠三色標記(所以稱為“三色標記”,有關這些顏色的具體含義將在具體算法中介紹)。QoS會根據包的顏色,設置包的丟棄優先級,其中單速率三色標記比較關心包尺寸的突發,而雙速率三色標記則關注速率上的突發,兩種算法都可工作于色盲模式和非色盲模式(具體在下面介紹)。下面分別介紹這兩種算法原理。
1. 單速率三色標記
這里首先要理解“單速率”是什么意思,那就是算法中的兩個令牌桶有同樣的承諾信息速率(CIR),也就是具有相同平均訪問速率。這兩個令牌桶分別是正常使用的令牌桶(也就是下面將要說到的C桶)和超出令牌桶容量的突發令牌桶(也就是下面將要說到的E桶),可以理解為兩個水桶,一個是正常使用的水桶,另一個是用來當正常使用的水桶滿后裝多余的水的水桶。下面具體解釋單速率三色標記算法原理。
單速率三色標記(srTCM)算法關注的是數據包的突發尺寸,數據包的色標記評估依據以下3個參數:承諾信息速率(CommittedInformation Rate,CIR)、承諾突發尺寸(Committed BurstSize,CBS)和超額突發尺寸(Excess Burst Size,EBS)。CIR是指向令牌桶中填充令牌的平均速率,即允許的通信流平均速度;CBS是指每次突發所允許的最大的流量尺寸,也相當于允許的最大取令牌的速率,等于桶的容量(最大時就是一個包就可以全部領取桶中的全部令牌)。EBS是指每次突發允許超出CBS的最大流量尺寸。CBS和EBS的單位都是bit(位)。
單速率三色機制采用雙桶結構:C桶和E桶(之所以用這兩個字母來表示,為的就是與前面說的CBS和EBS兩種速率的頭個字母一致,便于描述),且兩個令牌桶的CIR一樣。C令牌桶中任何未用的令牌都被放入E令牌桶中,用做以后臨時超過CIR的突發流量的令牌;另外,當C令牌桶滿時,超出的令牌也都會放在E令牌桶中。
Tc和Te分別表示C令牌桶和E令牌桶中的令牌數,也就是桶中當前的容量(單位也為bit),兩桶的總容量分別為CBS和EBS,也就是對應前面介紹的承諾突發尺寸和超額突發尺寸,最初它們都是滿的,即Tc和Te初始值分別等于CBS和EBS。正常情況下,不會使用第二個令牌桶(也就是E桶),而是把任何CBS(也就是C桶)中未使用的令牌都放入E桶中,只有當C令牌桶滿后,后面來的令牌才放到E令牌桶中,為可能出現的突發數據提供信用令牌(也就是經過允許的令牌)。
在這種單速率三色標記算法中,兩個令牌桶中令牌的添加是按照相同的CIR速率進行的。即每隔1/CIR時間添加一個令牌。添加的順序是先添加C桶再添加E桶,當兩個令牌桶中的令牌都滿時,再產生的令牌就會被丟棄。至于在發送數據包時,令牌的使用IEEE又定義了三種顏色(分別為紅色、黃色和綠色)以及兩種模式:色盲(color-blind)模式和感色(color-aware)模式,默認為色盲模式。三種顏色的功能與我們日常生活中的交通指示燈中的三種顏色類似,紅色表示違規數據,直接丟棄,黃色表示數據包雖然違法,但不直接丟棄,而是延遲發送,綠爭為合法數據包,直接發送。
在色盲(color-blind)模式下是假設包都是沒有經過“著色”處理的(不辨別包中原來標記的顏色),是根據包長度來確定包被標記的顏色。現假設到達的包長度為B(單位為bit)。若包長度B小于C桶中的令牌數Tc(也就是C桶中的令牌數足夠該包發送所需),則包被標記為綠色,表示包符合要求,包發送后C桶中的令牌數Tc減少B。如果TcTe,標記為紅色,表示是違反規定的包,直接丟棄,兩令牌桶中的總令牌數都不減少。
在感色(color-aware)模式下是假設包在此之前已經過“著色”處理(會辨別包中原來標記的顏色),如果包已被標記為綠色,或包長度BTe,則包被標記為紅色,Tc和Te都不減少。
2. 雙速率三色算法
這里同樣首先要稿清楚“雙速率”是什么意思,它是指該算法中兩個令牌桶中的CIR速率不同,存在兩個令牌填充速率。
IETF的雙速率三色標記(trTCM)算法主要是根據四種流量參數來評估:CIR、CBS、峰值信息速率(Peak InformationRate,PIR),峰值突發尺寸(Peak Burst Size,PBS)。CIR和CBS參數與單速率三色算法中的含義相同,PIR就是允許的最大突發信息傳輸速率,當然它的值肯定不會小于CIR的;PBS是允許的最大突發信息尺寸,它的值也不會小于CBS。
與單速率三色標記算法不同,雙速率三色標記算法中的兩個令牌桶是C桶和P桶(不是C桶和E桶),但它們的令牌填充速率是不同的,C桶填充速率為CIR,P桶為PIR;兩桶的容量分別為CBS和PBS(之所以用C桶和P桶表示也是基于方便描述,因為表示不同速率的參數與對應桶的容量參數相同,第一個字母對應為C,或者P)。用Tc和Tp表示兩桶中的令牌數目,初始狀態時兩桶是滿的,即Tc和Tp初始值分別等于CBS和PBS。
雙速率三色標記算法關注的是速率的突發,但它不像單速率三色標記算法那樣把第一個桶中未使用的令牌放到第二個桶中,而是使用兩個獨立的令牌桶。第一個令牌桶為PIR,大小為PBS,第二個令牌桶為CIR,大小為CBS。數據的測量是先比較PIR,然后再比較CIR。也就是在雙速率三色標記中,首先判斷的是數據發送速率是否符合規定的突發要求,而不是正常情況下的色標方法。
雙速率三色標記算法也有色盲模式和感色模式兩種。
在色盲模式下,當包速率大于PIR,此時未超過Tp+Tc部分的包會分別從P桶和C桶中獲取令牌,而且從P桶中獲取令牌的部分包被標記為黃色,從C桶中獲取令牌的部分包被標記為綠色,超過Tp+Tc部分無法得到令牌的包被標記為紅色;當包速率小于PIR,而大于CIR時,包可以得到令牌,但超過Tc部分的包將從P桶中獲取令牌,此時這部分包都被標記為黃色,而從C桶中獲取令牌的包被標記為綠色;當包速率小于CIR時,包所需令牌數不會超過Tc,只需從C桶中獲取令牌,包被標記為綠色。
在感色模式下,如果包已被標記為紅色,或者超過Tp+Tc部分無法得到令牌的包,被標記為紅色;如果標記為黃色,或者超過Tc但未超過Tp部分包記為黃色;如果包被標記為綠,或者未超過Tc部分包,被標記為綠色。
?
參考維基百科與互動百科與https://blog.csdn.net/laoj1228/article/details/53809334
總結
以上是生活随笔為你收集整理的Token Bucket 令牌桶算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法 2.二进制加法
- 下一篇: Android9显示模糊,app进入后台