Linux QoS egress处理流程
在傳統(tǒng)的TCP/IP網(wǎng)絡(luò)的路由器中,所有的IP數(shù)據(jù)包的傳輸都是采用FIFO(先進先出),盡最大努力傳輸?shù)奶幚頇C制。在早期網(wǎng)絡(luò)數(shù)據(jù)量和關(guān)鍵業(yè)務(wù)數(shù)據(jù)不多的時候,并沒有體現(xiàn)出非常大的缺點,路由器簡單的把數(shù)據(jù)報丟棄來處理擁塞。但是隨著計算機網(wǎng)絡(luò)的發(fā)展, 數(shù)據(jù)量的急劇增長,以及多媒體,VOIP數(shù)據(jù)等對延時要求高的應(yīng)用的增加。路由器簡單丟棄數(shù)據(jù)包的處理方法已經(jīng)不再適合當(dāng)前的網(wǎng)絡(luò)。單純的增加網(wǎng)絡(luò)帶寬也不能從根本上解決問題。所以網(wǎng)絡(luò)的開發(fā)者們提出了服務(wù)質(zhì)量的概念。概括的說:就是針對各種不同需求,提供不同服務(wù)質(zhì)量的網(wǎng)絡(luò)服務(wù)功能。提供QoS能力將是對未來IP網(wǎng)絡(luò)的基本要求。
Linux中的QOS分為入口(Ingress)部分和出口(Egress)部分,入口部分主要用于進行入口流量限速(policing),出口部分的QOS用于隊列調(diào)度(queuing scheduling)。
在 Linux 里面,對這個功能模塊的稱呼是 Traffic Control ,簡稱 TC。
這篇文章介紹Egress。
?
數(shù)據(jù)包的發(fā)送流程(Egress):
調(diào)用__dev_xmit_skb發(fā)送一個數(shù)據(jù)包,如果出口流控對象為空,直接調(diào)用sch_direct_xmit()發(fā)送數(shù)據(jù)包。(流控對象為空表示對象中沒有數(shù)據(jù)包)
如果出口流控對象非空,執(zhí)行流控。
調(diào)用q->enqueue(skb, q)將數(shù)據(jù)包入隊。
調(diào)用qdisc_run(struct Qdisc *q)運行出口流控對象,也就是,調(diào)用對象的出隊函數(shù)選擇一個數(shù)據(jù)包,并發(fā)送這個數(shù)據(jù)包,如果時間允許就循環(huán)執(zhí)行這個過程,直到流控對象為空。注意:如果已經(jīng)有其他內(nèi)核路徑正在運行隊列,函數(shù)將不做任何事情,并提前返回。
本流控對象運行時間太長了,停止本對象運行,并且將本流控對象加入軟中斷服務(wù)NET_TX_SOFTIRQ的output_queue鏈表頭。(即持續(xù)發(fā)送的數(shù)據(jù)包大于64個,也即發(fā)送時間太長)
當(dāng)執(zhí)行軟中斷服務(wù)線程NET_TX_SOFTIRQ時,將從output_queue鏈表頭開始順序運行鏈表中的所有流控對象。
?
Linux QoS egress處理函數(shù)調(diào)用圖:
總結(jié)
以上是生活随笔為你收集整理的Linux QoS egress处理流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux QoS ingress处理流
- 下一篇: Linux ping的原理与实现