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