1. 程式人生 > >Token Bucket 令牌桶演算法

Token Bucket 令牌桶演算法

令牌桶演算法是網路流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種演算法。典型情況下,令牌桶演算法用來控制傳送到網路上的資料的數目,並允許突發資料的傳送。

令牌桶這種控制機制基於令牌桶中是否存在令牌來指示什麼時候可以傳送流量。令牌桶中的每一個令牌都代表一個位元組。如果令牌桶中存在令牌,則允許傳送流量;而如果令牌桶中不存在令牌,則不允許傳送流量。因此,如果突發門限被合理地配置並且令牌桶中有足夠的令牌,那麼流量就可以以峰值速率傳送。

 

令牌桶演算法可以在概念上理解如下:

  • 若使用者配置的平均傳送速率為r,每1 / R 秒令牌都會新增到儲存桶中。
  • 桶最多可以容納b令牌。如果令牌在儲存桶已滿時到達,則將其丟棄。
  • n個位元組的包(網路層PDU)到達時,
    • 如果儲存桶中至少有n個令牌,則從儲存桶中刪除n個令牌,並將資料包傳送到網路。
    • 如果可用的令牌少於n個,則不會從儲存桶中刪除令牌,並且該包在流量限制之外。



該演算法的實施者在平臺上缺乏每次向桶中新增單個令牌所需的時鐘解析度 1 / R秒可能想要考慮另一種配方。鑑於能夠每S毫秒更新令牌桶,每S毫秒增加一個令牌數=(R * S)/ 1000

平均費率編輯]

從長遠來看,符合資料包的輸出受令牌速率的限制, {\ displaystyle r}[R

突發大小編輯]

讓 {\ displaystyle M}中號 是最大可能的傳輸速率,以位元組/秒為單位。

然後T _ {{\ text {max}}} = {\ begin {cases} b /(Mr)&{\ text {if}} r <M \\\ infty&{\ text {otherwise}} \ end {cases} } 是最大突發時間,即速率的時間 {\ displaystyle M}中號 充分利用。

因此,最大突發大小 {\ displaystyle B _ {\ text {max}} = T _ {\ text {max}} * 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