簡單來說就是針對不同封包提供不同的服務等級。
你可以想像成航空公司針對不同客層的通關服務,例如可能有外交官等級免查行李跟護照,VVIP等級最快速度處理登機免排隊等等,其他則用不同票種艙等提供不同的服務。
所以要探討的部分是順序依次是
Classification and Marking : 封包如何分類
Policing and Shaping : QoS如何提供服務
Congestion Management : queue發生壅塞時如何處理
左圖可視為整體QoS的架構 :
要對封包提供不同服務,必須先知道封包上標頭的分類或是對封包標頭打上戳章進行分類。QoS的不同服務又分成Layer 2跟Layer 3,Layer 2的QoS設定在VLAN Tag之中的PCP(Priority code point)為3個bit,在VLAN Trunk中才會用到,Layer 3設定在IP Header中8個bits的DS field。
先介紹Layer 3用來分類服務等級的DS Field。
DS field的用途就是用來告訴封包途經的網路設備應該如何針對這些封包做處理,誰可以走VIP通道,誰要排比較長的隊,你可以想像成機票的艙種分等。
DS Field : (differentiated services field)
包含DSCP跟ECN,位於IP Header中,兩個組合起來 8 bits。
DSCP : differentiated services code point (6 bits)
又細分為Class Selector(前 3 bits)和Drop Precedence(後 3 bits)。DSCP用來標示封包傳輸的優先順序。
ECN : Explicit Congestion Notification (2 bits)
ECN則用於壅塞控制但要看終端設備是否支援使用。
針對DSCP繼續說明
常見封包透過DSCP分類出來的傳輸優先順序如左下圖所示,數字越小越往下代表封包或應用越不重要,傳輸優先度低,數字越大越往上則代表傳輸優先度越高。例如網路設備之間的控制封包是最優先的,例如Router跟Router之間的OSPF協定或是AS之間的BGP協定封包,一定要最優先處理,另外Voice over IP跟Video streaming優先度也很前面。優先度最低的Best effor就不太在意延遲問題了。
DSCP傳輸優先順序分類
圖片來源 : CiscoDSCP前 3 bits Class Selector定義
因為有3個bits,故可分為八類優先順序,搭配後面3個bits的Drop Precedence則共可分成64種。
左上圖提到的CS、AF、EF縮寫又分別是什麼意思呢 ?
CS : Class Selector,DSCP的前3個bits。CS的數字越大代表優先順序越高,封包越先傳遞。
AF : Assured Forwarding 確保轉發。會搭配不同的Drop Precedence來決定封包丟棄的機率是低/中/高。
EF : Expedited Forwarding 加急轉發。
RFC解釋其應用在 low loss, low latency, low jitter, assured bandwidth的地方,如圖中的VoIP應用。
上圖詳細排列了CS1 ~ CS7的常用分類
上面講完了封包的分類(機票艙等),下面來談談服務(機上服務)
Policing and Shaping :
這兩個功能基本上就是在對頻寬做限制,但兩者有些微的不同,Policing會把超過Threshold的封包丟掉,Shaping不會。
Shaping暗示著目前有queue且有足夠的queue buffer放封包,shaping是outbound / Egress概念,policing則是inbound和outbound都可以。shaping也會用到scheduling來安排那些被延遲的封包放到不同的shaping queue,例如CBWFQ或LLQ等演算法(繼續往下看等等會談到)。
Shaping跟Policing都會用到token bucket的機制,只是Policing用的是Leaky token bucket,Shaping用token bucket。
Only policing can be applied to inbound traffic on an interface. Ensure that you have sufficient memory when enabling shaping.
Policing超過Threshold(bucket size)的封包會被丟棄
Shaping代表把封包先queue起來慢點再轉發出去,所以有burst的地方會變得比較平滑
Token bucket :
想像一下,現在queue中的某一個封包想要被轉發出去,此時需要bucket中有對應數量的token,假設這個封包是122 bytes的大小,那現在bucket中就需要有122個token,若此時token不夠多就沒有辦法轉發,要等到下一個時間(per refresh cycle)新增完固定數量的token(r Byte/s)到bucket之後,看看這些累積的token數目是否多於122個,若有才能將封包送出,這per refresh cycle 新增的token數目其實就是你設定的Egress rate轉換過來的。
另外桶子可以裝的token數目(b Bytes)至少會大於封包MTU。
Token bucket :
Leaky bucket :
HW Queue爆滿就要將封包放到SW Queue,SW Queue就要透過Scheduling考慮誰可以優先放到HW queue那邊。
詳見 https://www.jannet.hk/zh-Hant/post/quality-of-service-qos-router/AQM(Active Queue Management) :
AQM泛指一系列用來管理資源和egress queues的壅塞管理。
SP(Strict Priority) :
假設有好幾個不同優先度的queue,在SP中,一定要優先度最高的queue空了,才會去拿優先度次之的queue,依此類推一直到優先度最低的queue。
PFC(priority flow control) :
在L2上做壅塞控制,PFC源自802.1p是802.1q(VLAN)的擴展。
PFC在IEEE 802.3x上用PAUSE control frame,當receiver的buffer超過threshold,receiver可以產生MAC control frame向sender送出PAUSE請求。在收到暫停請求後,sender停止傳輸任何新封包,直到receiver通知sender它有足夠的buffer來再次接收它們。使用PFC的缺點是它在整個L2上運行,有些流量不需要在L2上進行流量控制。
WFQ(Weighted Fair Queuing) :
HW queue爆滿時,封包會依照不同的Flow被分到不同的SW queue之中,分Flow的方法是用Hash,無法自己定義,之後scheduler從SW queue依照權重大小將封包放到HW queue
CBWFQ(Class Based Weighted Fair Queuing) :
Allows users to configure the minimum bandwidth of a certain type of traffic.
WFQ自動建立queue,CBWFQ可以自己決定怎麼分SW queue,也就是根據自己的分類規則分類並在不同SW queue上設定頻寬
LLQ(Low Latency Queuing) :
The algorithm combination of PQ, CQ and WFQ. LLQ is usually used in voice and interactive video. During configuration, all the applications of LLQ type can occupy no more than 33% of the total bandwidth.
LLQ相當於CBWFQ加上一個嚴格優先級queue,該queue優先級別高於其他所有queue
LLQ最大優勢是可以為latency和 jitter要求高的應用流量提供一個或多個有頻寬保證的嚴格優先queue
Dynamic Queue Memory Allocation :
queue共用shared-resource pool
DWRR(Deficit Weight Round Robin) :
多個queue可以設定不同頻寬,queue用輪詢的方式送出封包。
要設定DWRR權重和SP,封包先經過DWRR分類再進到SP分類。
下面是一個例子,假設此DWRR有3個queue,queue1 = 50%,queue2 = 25%,queue3 = 25%。每隔一段時間,不同queue的DefictCounter會加上quatum的數量,而DefictCounter數目就是該queue可以egress的封包大小。
Time = t 時,
Queue1的DefictCounter加上1000(Quantum[1]數目。
此時queue1中可以讓2個封包出去,1000 > (600+300=900)。
Time = t+1 時,
queue1剩下封包400 Bytes和DefictCounter = 100。
queue2的DefictCounter加上500(Quantum[2]數目。
此時queue2中可以讓1個封包出去,500 > 400,剩下2個封包還在queue內。
Time = t+2 時,
queue2剩下封包(300+400) Bytes和DefictCounter = 100。
queue3的DefictCounter加上500(Quantum[3]數目。
此時queue3中可以讓0個封包出去,500 < 600。
Time = t+3 時,
queue1剩下封包400 Bytes和DefictCounter = 100,DefictCounter加上1000(Quantum[1]數目。
此時queue1中可以讓1個封包出去,1100 > 400,queue1清空,DefictCounter歸零。
Time = t+4 時,
queue2 DefictCouner = 100+500,600 > 300,可以讓1個封包出去,剩1個封包。
Time = t+5 時,
queue3 DefictCouner = 500+500,1000 > 600+300,可以讓2個封包出去,剩1個封包。
Time = t+6 時,
queue2 DefictCouner = 300+500,800 > 400,可以讓1個封包出去,queue2清空,DefictCounter歸零。
Tail Drop :
網路設備內enqueue buffer大小是有限的,如果封包滿了怎麼辦 ? 一個方法是將還沒進queue buffer的封包通通丟掉,這個方法就是Tail drop,下面有一個例子。
假設threshold被設定成100 pages,而在T秒時已經有90個pages被enqueue了,當在下一個時間T+1秒有個11 pages大小的封包想要enqueue,會因為已經超過threshold,AQM不讓這個封包被enqueue。此處 1 page = 1 byte。比較好的switch per port / per queue 都支援 Tail Drop。
如圖 Tail Drop當buffer queue滿了需要丟掉想進queue的封包,當TCP封包被丟掉時,需要1個RTT時間TCP session handler才會知道封包沒被收到需要進入cwnd TCP window resize,所以圖就在說那1~2RTT時間內丟掉的封包會造成過多頻寬使用率下降。
多個不同的TCP Session最後會同步稱為TCP Global synchronization,多TCP session的window會同步resize造成slow start,導致頻寬無法有效利用。
RED : Random Early Detection。
Enqueue深度快要超過threshold的時候,隨機丟棄封包,如此再利用TCP Window Slow Start的特性可有效減速。
WRED : Weighted Random Early Detection。RED的延伸。
是AQM的一種配置,用來早期偵測和解決enqueue壅塞問題,避免TCP Global synchronization的現象使流量平順化。在enqueue階段開始的時候就根據DSCP的封包優先度分類來隨機丟棄封包或將封包mark為特定的速度,會隨平均enqueue長度變長而線性增加封包丟棄比例,當超過threshold則丟封包全丟掉或設定ECN。
超過20pkt開始隨機drop,越接近45pkt丟越多(0~25%),超過45pkt全丟。
可以根據IP Precedence或DSCP針對不同優先度的封包來處理。此圖先丟紅線3的封包比藍線5丟得更早更頻繁。
上圖為WRED處理的順序
0. Classify : 封包進來後先根據DSCP分類
1.計算平均queue深度 (Queue buffer depth)
2.平均queue深度 < Minimum queue threshold,進來的封包被Enqueued
3. Discard test : 當Minimum queue threshold < 平均queue深度 < Maximum queue threshold時,依照DSCP分類和平均queue深度兩個條件來決定進來的封包有多少機率會被丟棄,沒被丟的封包就進到Enqueued。
4. 平均queue深度 > Maximum queue threshold,進來的封包全數丟棄。