Linux中的封包傳輸
當資料包裝成網路上傳輸的封包,便會加入對應裝置的佇列中,最後從佇列中被提取並交給driver要求NIC將資料送出。處理這些動作的函式依序為 dev_queue_xmit -> dev_qdisc_enqueue -> qdisc_run -> qdisc_restart -> dev_qdisc_dequeue -> dev_hard_start_xmit。
由上述函式可知,封包在進出佇列均受到queue discipline(qdisc)的控管。在沒有設定掛載任何queue discipline時,系統便預設以FIFO方式處理封包的enqueue和dequeue。當以tc指令在NIC掛載上特定的queue discipline後,該NIC便以設定的queuing演算法處理enqueue和dequeue,而達成管理頻寬的功能。
若設定掛載的qdisc是CBQ、HTB或Prio這類Classful qdisc,則封包enqueue和dequeue需要更複雜的機制去實作,也就是透過filter分類到對應class,再依各class被分配的頻寬大小決定封包enqueue和dequeue的順序與頻率。
當classful qdisc作用時,封包會被依序送到各個filter作比對,直到找到對應的class,沒有符合的class時,便依qdisc的設定分類到defualt class。同一類的封包會先以該class掛載的qdisc作queuing,root qdisc再對各class作queuing。
Classful qdisc的運作
filter是隸屬在root qdisc之下,對應到各個class;而多個filter可以對應到同一個class。封包進入root qdisc後,以各filter的priority為依據,依序交由各filter作比對。符合條件即進入對應的class,不再交給之後的filter。
分類完成後再由該class的qdisc作enqueue,進入佇列。
當要取出封包交給driver時,封包由最底層的queue沿class往root qdisc的路徑逐步被送到root qdisc,最後由root qdisc作dequeue交給driver。
概念上,整個qdisc和class的關係是一個tree結構,封包要進入佇列時是由root qdisc逐步往leaf qdisc行進(traverse);離開佇列則是由leaf qdisc逐步往root qdisc行進。
Recommend to Front page
瑣碎雜記(4)

Comment Permissions: Allow commenting