XDP技術(shù)——Linux網(wǎng)絡(luò)處理的高速公路

XDP及相關(guān)技術(shù)簡(jiǎn)介

運(yùn)行的XDP程序可以通過(guò)XDP動(dòng)作碼來(lái)指定驅(qū)動(dòng)對(duì)網(wǎng)絡(luò)數(shù)據(jù)包的后續(xù)動(dòng)作:
? XDP_ABORTED意味著程序錯(cuò)誤,會(huì)將數(shù)據(jù)包丟掉,與XDP_DROP不同之處在于XDP_ABORTED會(huì)用trace_xdp_exception記錄錯(cuò)誤行為。
? XDP_DROP會(huì)在網(wǎng)卡驅(qū)動(dòng)層直接將該數(shù)據(jù)包丟掉,無(wú)需再進(jìn)一步處理,也就是無(wú)需再耗費(fèi)任何額外的資源。在收到DDoS攻擊時(shí),這種特性可以瓦解DDoS的根本目標(biāo)——占滿被攻擊主機(jī)的CPU資源使得其他正常流量無(wú)法被處理,因?yàn)閄DP丟包不會(huì)再動(dòng)用額外的CPU資源。
? XDP_PASS會(huì)將該數(shù)據(jù)包繼續(xù)送往內(nèi)核的網(wǎng)絡(luò)協(xié)議棧,和傳統(tǒng)的處理方式一致。這也使得XDP可以在有需要的時(shí)候方便地使用傳統(tǒng)的內(nèi)核協(xié)議棧進(jìn)行處理。
? XDP_TX會(huì)將該數(shù)據(jù)包從同一塊網(wǎng)卡返回。
? XDP_REDIRECT則是將數(shù)據(jù)包重定向到其他的網(wǎng)卡或CPU,結(jié)合AF_XDP可以將數(shù)據(jù)包直接送往用戶空間。
XDP具有三種運(yùn)行模式:
??原生模式:
即驅(qū)動(dòng)模式,在該模式下的XDP程序運(yùn)行在網(wǎng)絡(luò)驅(qū)動(dòng)程序的早期路徑,需要網(wǎng)卡驅(qū)動(dòng)程序的支持,而10G及以上速率的大多數(shù)網(wǎng)卡基本都是支持的;
??卸載模式:
該模式會(huì)直接將XDP程序卸載到網(wǎng)卡上,從而徹底釋放主機(jī)CPU資源,相較于原生模式,具有更高的性能。目前支持的網(wǎng)卡似乎只有Netronome智能網(wǎng)卡。
??通用模式:
該模式下的XDP程序運(yùn)行于驅(qū)動(dòng)之后的位置,無(wú)需驅(qū)動(dòng)支持,但性能較差,一般用于測(cè)試。
使用XDP技術(shù)進(jìn)行快速的包處理具有如下優(yōu)勢(shì):
??是Linux內(nèi)核的一部分。這是一個(gè)長(zhǎng)期的解決架構(gòu)方案,由Linux內(nèi)核社區(qū)維護(hù),如同內(nèi)核的其他部分,具有穩(wěn)定的API,無(wú)需修改內(nèi)核,無(wú)需增加額外的軟件框架。
??使用與內(nèi)核協(xié)同,而非完全內(nèi)核旁路的方式。XDP可重用所有Linux上游的網(wǎng)絡(luò)工具和驅(qū)動(dòng),能夠復(fù)用內(nèi)核訪問(wèn)硬件的安全模型。而DPDK等技術(shù)則需要使用其專(zhuān)屬的網(wǎng)絡(luò)和安全工具。
??安全性。由于eBPF驗(yàn)證器(verifier)的存在,一些不安全的指令會(huì)被內(nèi)核拒絕加載。
??無(wú)需獨(dú)占CPU資源。即便是在空負(fù)載的情況下,DPDK也需要使用忙輪詢(xún)來(lái)進(jìn)行收包檢查,分配的CPU核永遠(yuǎn)是打滿的。而XDP可以始終運(yùn)行,只有在負(fù)載升高時(shí)才會(huì)開(kāi)始占用CPU。同時(shí)XDP程序也是可以運(yùn)行在多個(gè)CPU之上的,這進(jìn)一步提高了其性能。
??動(dòng)態(tài)注入。eBPF程序可以隨時(shí)重新掛載和更新。
??無(wú)需分配巨頁(yè)。
??適用性強(qiáng)。高于4.8版本的內(nèi)核和絕大多數(shù)高速網(wǎng)卡都是支持XDP的,無(wú)需專(zhuān)有硬件的支持。
??……
XDP技術(shù)的使用
結(jié)? 語(yǔ)
有收獲,點(diǎn)個(gè)在看?


