為什么要使用skb_reserve函數(shù)把邊界對(duì)齊
skb_reserve 函數(shù)通常用于網(wǎng)絡(luò)編程中的數(shù)據(jù)包處理,特別是在構(gòu)建自定義協(xié)議?;驍?shù)據(jù)包處理模塊時(shí)。它的作用是為數(shù)據(jù)包的頭部預(yù)留額外的空間,以確保數(shù)據(jù)包的頭部數(shù)據(jù)在內(nèi)存中是對(duì)齊的。
邊界對(duì)齊的概念是因?yàn)樵S多硬件平臺(tái)和網(wǎng)絡(luò)協(xié)議要求數(shù)據(jù)包頭的字節(jié)對(duì)齊。如果數(shù)據(jù)包頭部沒(méi)有按照要求的方式對(duì)齊,可能會(huì)導(dǎo)致性能下降或者出現(xiàn)硬件故障。邊界對(duì)齊通常要求數(shù)據(jù)包頭部的其實(shí)地址是某個(gè)特定字節(jié)的倍數(shù)。
使用 skb_reserve 函數(shù)可以確保數(shù)據(jù)包的頭部在內(nèi)存中正確對(duì)齊。它的工作方式是將預(yù)留的空間添加到skb (socket buffer)結(jié)構(gòu)中,這個(gè)結(jié)構(gòu)用于存儲(chǔ)數(shù)據(jù)包的信息和數(shù)據(jù)。通過(guò)預(yù)留足夠的空間,skb 結(jié)構(gòu)中的數(shù)據(jù)包頭部將被對(duì)齊到所需的字節(jié)邊界。
具體來(lái)說(shuō),skb_reserve函數(shù)作用呢包括:
- 分配足夠的額外內(nèi)存空間,以便在skb 結(jié)構(gòu)中存儲(chǔ)數(shù)據(jù)包頭部。
- 調(diào)整skb 結(jié)構(gòu)的內(nèi)部指針,以確保數(shù)據(jù)包頭部的存儲(chǔ)位置是對(duì)齊的。
這種對(duì)齊對(duì)于網(wǎng)絡(luò)數(shù)據(jù)包的發(fā)送和接收非常重要,因?yàn)椴煌W(wǎng)絡(luò)硬件和協(xié)議可能對(duì)數(shù)據(jù)包頭部的對(duì)齊要求不同。如果不進(jìn)行正確的對(duì)齊,可能會(huì)導(dǎo)致數(shù)據(jù)包被硬件丟棄或解析錯(cuò)誤,從而引發(fā)網(wǎng)絡(luò)問(wèn)題。
總之,使用skb_reserve函數(shù)是一種確保網(wǎng)絡(luò)數(shù)據(jù)包頭部對(duì)齊的常見(jiàn)做法,以提高網(wǎng)絡(luò)數(shù)據(jù)包處理性能和可靠性。
當(dāng)內(nèi)核編譯成支持 IP-over-IP 通道時(shí),就可能有多個(gè)IP報(bào)頭
什么是 IP-over-IP 通道?
IP-over-IP通道是一種網(wǎng)絡(luò)隧道技術(shù),它允許在一個(gè)IP數(shù)據(jù)包的內(nèi)部封裝另一個(gè)IP數(shù)據(jù)包。這意味著一個(gè)IP數(shù)據(jù)包包含了兩個(gè)IP報(bào)頭,其中一個(gè)是外部IP報(bào)頭,另一個(gè)是內(nèi)部IP報(bào)頭。
在IP-over-IP通道中,通常有兩個(gè)端點(diǎn)或者路由器之間的通信,其中一個(gè)端點(diǎn)封裝要傳輸?shù)臄?shù)據(jù)包,而另一個(gè)端點(diǎn)解封裝這些數(shù)據(jù)包。這種技術(shù)的主要應(yīng)用場(chǎng)景包括:
- 虛擬專用網(wǎng)絡(luò)(Virtual Private Network,VPN):VPN是一種安全通信方式,通過(guò)在公共網(wǎng)絡(luò)上創(chuàng)建私有網(wǎng)絡(luò),可以將內(nèi)部流量隔離開(kāi)來(lái)。IP-over-IP通道可以用于構(gòu)建VPN,將內(nèi)部的IP數(shù)據(jù)包封裝在外部的IP數(shù)據(jù)包中,以便通過(guò)公共網(wǎng)絡(luò)傳輸,同時(shí)保持?jǐn)?shù)據(jù)的隱私和安全。
- 隧道協(xié)議:某些網(wǎng)絡(luò)設(shè)備和協(xié)議需要通過(guò)隧道將數(shù)據(jù)包傳輸?shù)竭h(yuǎn)程位置。例如,IPv6到IPv4的轉(zhuǎn)換可以使用IP-over-IP通道,以便在IPv4網(wǎng)絡(luò)上傳輸IPv6數(shù)據(jù)包。
- 隧道加密:有時(shí)候,通信需要額外的安全性。IP-over-IP通道可以與加密技術(shù)結(jié)合使用,以加密內(nèi)部的數(shù)據(jù)包,然后封裝在外部的IP數(shù)據(jù)包中進(jìn)行傳輸。這有助于保護(hù)數(shù)據(jù)的機(jī)密性。
在一個(gè)IP-over-IP通道中,多個(gè)IP報(bào)頭的存在是很常見(jiàn)的。通常,外部IP報(bào)頭用于路由和傳輸外部網(wǎng)絡(luò)中的數(shù)據(jù)包,而內(nèi)部IP報(bào)頭用于路由和傳輸內(nèi)部網(wǎng)絡(luò)中的數(shù)據(jù)包。這兩個(gè)IP報(bào)頭分別具有不同的IP地址、TTL(Time-to-Live,生存時(shí)間)等字段。
總之,IP-over-IP通道是一種將一個(gè)IP數(shù)據(jù)包封裝在另一個(gè)IP數(shù)據(jù)包內(nèi)部的網(wǎng)絡(luò)隧道技術(shù),通常用于實(shí)現(xiàn)網(wǎng)絡(luò)隔離、跨網(wǎng)絡(luò)通信和安全通信等目的。多個(gè)IP報(bào)頭的存在是因?yàn)閿?shù)據(jù)包需要在不同的網(wǎng)絡(luò)層中進(jìn)行路由和傳輸。
什么是隧道?
在計(jì)算機(jī)網(wǎng)絡(luò)中,隧道(Tunnel)是一種將一種網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包封裝在另一種網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包內(nèi)傳輸?shù)募夹g(shù)。隧道的主要目的是允許在兩個(gè)網(wǎng)絡(luò)之間傳輸數(shù)據(jù),盡管這兩個(gè)網(wǎng)絡(luò)使用不同的協(xié)議、拓?fù)浣Y(jié)構(gòu)或地址方案。
隧道的工作方式如下:
- 封裝(Encapsulation): 原始數(shù)據(jù)包被封裝在一個(gè)或多個(gè)新的數(shù)據(jù)包中,通常在新數(shù)據(jù)包的頭部添加額外的信息,以標(biāo)識(shí)原始數(shù)據(jù)包的目標(biāo)和屬性。這個(gè)過(guò)程稱為封裝。
- 傳輸(Transmission):封裝后的數(shù)據(jù)包在隧道內(nèi)傳輸,通過(guò)隧道連接的兩端。這些數(shù)據(jù)包通常通過(guò)公共網(wǎng)絡(luò)傳輸,例如因特網(wǎng)。
- 解封裝(Decapsulation):到達(dá)目的地的數(shù)據(jù)包經(jīng)過(guò)解封裝過(guò)程,將原始數(shù)據(jù)包從封裝中提取出來(lái)。解封裝過(guò)程還可以包括驗(yàn)證數(shù)據(jù)包的完整性和身份驗(yàn)證等操作。
在計(jì)算機(jī)網(wǎng)絡(luò)中,隧道(Tunnel)是一種將一種網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包封裝在另一種網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包內(nèi)傳輸?shù)募夹g(shù)。隧道的主要目的是允許在兩個(gè)網(wǎng)絡(luò)之間傳輸數(shù)據(jù),盡管這兩個(gè)網(wǎng)絡(luò)使用不同的協(xié)議、拓?fù)浣Y(jié)構(gòu)或地址方案。
隧道可以用于多種不同的場(chǎng)景和目的,包括:
- 連接遠(yuǎn)程網(wǎng)絡(luò):隧道允許在兩個(gè)不同地理位置的網(wǎng)絡(luò)之間建立連接,使它們能夠互相通信,就好像它們?cè)谕痪W(wǎng)絡(luò)中一樣。
- 跨越不同協(xié)議的通信:隧道可以用于在不同的網(wǎng)絡(luò)協(xié)議之間傳輸數(shù)據(jù),例如將IPv6數(shù)據(jù)包封裝在IPv4數(shù)據(jù)包中,以便在IPv4網(wǎng)絡(luò)上傳輸。
- 隔離和安全:隧道可以用于創(chuàng)建私有網(wǎng)絡(luò),以隔離和保護(hù)數(shù)據(jù)。例如,虛擬專用網(wǎng)絡(luò)(VPN)使用隧道來(lái)加密和隔離通信,以確保數(shù)據(jù)的安全性。
- 跨越不同拓?fù)浣Y(jié)構(gòu)的通信:隧道可以用于連接不同拓?fù)浣Y(jié)構(gòu)的網(wǎng)絡(luò),例如星型、網(wǎng)狀或環(huán)狀拓?fù)?,以?shí)現(xiàn)數(shù)據(jù)的流動(dòng)。
總之,隧道是一種重要的網(wǎng)絡(luò)技術(shù),用于連接、隔離和傳輸數(shù)據(jù),允許不同網(wǎng)絡(luò)之間的通信和互聯(lián)。隧道的選擇和配置取決于特定的網(wǎng)絡(luò)需求和環(huán)境。
OSI模型算是一種隧道傳輸技術(shù)嗎?
不完全正確。OSI模型(開(kāi)放式系統(tǒng)互聯(lián)模型)是一種網(wǎng)絡(luò)協(xié)議層次結(jié)構(gòu),用于描述和組織計(jì)算機(jī)網(wǎng)絡(luò)中不同層次的通信協(xié)議。它將網(wǎng)絡(luò)通信分為七個(gè)不同的層次,每個(gè)層次都有特定的功能和責(zé)任,從物理層(第一層)到應(yīng)用層(第七層)。
與隧道傳輸技術(shù)不同,OSI模型本身并不是一種具體的網(wǎng)絡(luò)通信技術(shù),而是一種概念性框架,用于理解和組織不同層次的通信協(xié)議。它提供了一種方法來(lái)描述和分解網(wǎng)絡(luò)通信的復(fù)雜性,使不同的網(wǎng)絡(luò)協(xié)議可以獨(dú)立開(kāi)發(fā)和維護(hù),同時(shí)仍然能夠互操作。
隧道傳輸技術(shù),如IP-over-IP隧道、VPN隧道等,是一種特定的網(wǎng)絡(luò)技術(shù),用于將數(shù)據(jù)包從一個(gè)網(wǎng)絡(luò)封裝并傳輸?shù)搅硪粋€(gè)網(wǎng)絡(luò)。這些技術(shù)通常屬于OSI模型中的網(wǎng)絡(luò)層或數(shù)據(jù)鏈路層,用于實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的通信、連接和隔離。它們是在OSI模型的基礎(chǔ)上實(shí)現(xiàn)的,但不是OSI模型本身的一部分。
總之,OSI模型是一種用于描述通信協(xié)議層次結(jié)構(gòu)的概念性框架,而隧道傳輸技術(shù)是一種具體的網(wǎng)絡(luò)技術(shù),用于在不同網(wǎng)絡(luò)之間傳輸數(shù)據(jù)。兩者雖然相關(guān),但是具有不同的目的和作用。
非線性數(shù)據(jù)包處理
skb_is_nonlinear
static inline bool skb_is_nonlinear(const struct sk_buff *skb)
{
return skb->data_len;
}
這段代碼定義了一個(gè)內(nèi)聯(lián)函數(shù) skb_is_nonlinear
,用于檢查給定的 sk_buff
結(jié)構(gòu)是否包含非線性數(shù)據(jù)。
sk_buff
是Linux內(nèi)核中用于表示網(wǎng)絡(luò)數(shù)據(jù)包的數(shù)據(jù)結(jié)構(gòu),而非線性數(shù)據(jù)包是指數(shù)據(jù)包的數(shù)據(jù)存儲(chǔ)在多個(gè)非連續(xù)的緩沖區(qū)中,而不是一個(gè)單一的線性緩沖區(qū)。非線性數(shù)據(jù)包通常需要額外的內(nèi)存和處理,因?yàn)閿?shù)據(jù)分散在多個(gè)緩沖區(qū)中,這可能會(huì)增加處理的復(fù)雜性。
這個(gè) skb_is_nonlinear
函數(shù)的實(shí)現(xiàn)非常簡(jiǎn)單,它檢查 sk_buff
結(jié)構(gòu)中的 data_len
字段是否為非零值。如果 data_len
不為零,說(shuō)明該數(shù)據(jù)包是非線性的,因?yàn)?data_len
字段用于表示非線性數(shù)據(jù)包的長(zhǎng)度。如果 data_len
為零,那么該數(shù)據(jù)包是線性的,因?yàn)榫€性數(shù)據(jù)包的長(zhǎng)度通??梢詮?len
字段中獲得。
這個(gè)函數(shù)的目的是幫助內(nèi)核代碼確定一個(gè) sk_buff
結(jié)構(gòu)是否包含非線性數(shù)據(jù),從而可以采取適當(dāng)?shù)奶幚泶胧H绻?skb_is_nonlinear
返回 true
,那么內(nèi)核可以根據(jù)需要執(zhí)行額外的操作來(lái)處理非線性數(shù)據(jù)包。否則,如果返回 false
,則可以假定數(shù)據(jù)包是線性的,通常更容易處理。
skb_linearize
skb_linearize
是Linux內(nèi)核網(wǎng)絡(luò)數(shù)據(jù)包處理中的一個(gè)函數(shù),用于將非線性數(shù)據(jù)包(non-linear sk_buff)轉(zhuǎn)換為線性數(shù)據(jù)包(linear sk_buff)。在內(nèi)核網(wǎng)絡(luò)數(shù)據(jù)包處理中,數(shù)據(jù)包通常以線性方式存儲(chǔ)在單個(gè)連續(xù)的緩沖區(qū)中,這被稱為線性緩沖區(qū)。然而,某些情況下,數(shù)據(jù)包的數(shù)據(jù)可能分散在多個(gè)非連續(xù)的緩沖區(qū)中,這被稱為非線性數(shù)據(jù)包。
skb_linearize
函數(shù)的主要作用是將非線性數(shù)據(jù)包轉(zhuǎn)換為線性數(shù)據(jù)包,以便于內(nèi)核的處理和傳遞。這個(gè)函數(shù)會(huì)執(zhí)行以下操作:
- 分配新的線性緩沖區(qū):首先,它會(huì)分配一個(gè)新的線性緩沖區(qū),足夠大以容納非線性數(shù)據(jù)包中的所有數(shù)據(jù)。
- 將數(shù)據(jù)拷貝到線性緩沖區(qū):然后,它會(huì)將非線性數(shù)據(jù)包中的數(shù)據(jù)從多個(gè)非連續(xù)的緩沖區(qū)復(fù)制到新的線性緩沖區(qū)中。這樣,數(shù)據(jù)包的所有內(nèi)容都被組合到一個(gè)連續(xù)的緩沖區(qū)中。
-
更新 sk_buff 結(jié)構(gòu):最后,它會(huì)更新相關(guān)的
sk_buff
結(jié)構(gòu),將數(shù)據(jù)包的數(shù)據(jù)指針和長(zhǎng)度等信息更新為新的線性緩沖區(qū)的地址和大小。
這個(gè)操作的目的是為了簡(jiǎn)化數(shù)據(jù)包的處理。許多網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序都更喜歡處理線性數(shù)據(jù)包,因?yàn)樗鼈兊臄?shù)據(jù)存儲(chǔ)方式更加緊湊和可預(yù)測(cè)。當(dāng)收到非線性數(shù)據(jù)包時(shí),內(nèi)核通常會(huì)使用 skb_linearize
將其轉(zhuǎn)換為線性數(shù)據(jù)包,以便更容易地進(jìn)行后續(xù)處理,例如路由、轉(zhuǎn)發(fā)或傳遞給上層協(xié)議棧。
總之,skb_linearize
函數(shù)用于將非線性數(shù)據(jù)包轉(zhuǎn)換為線性數(shù)據(jù)包,以便于內(nèi)核的處理。這是一種數(shù)據(jù)包預(yù)處理操作,旨在簡(jiǎn)化數(shù)據(jù)包的存儲(chǔ)和處理方式。
TCP截?cái)嘈遁d技術(shù)
TCP截?cái)嘈遁d(TCP Segmentation Offload Truncation)和TSO(TCP Segmentation Offload)是兩種網(wǎng)絡(luò)性能優(yōu)化技術(shù),旨在提高網(wǎng)絡(luò)傳輸效率。它們都與TCP數(shù)據(jù)包的分段和傳輸有關(guān),但在一些方面存在差異。
"TCP Segmentation Offload"(TSO) "TCP分段卸載" 或 "TCP分段卸載技術(shù)"。這個(gè)翻譯表達(dá)了TSO技術(shù)的基本含義,即將TCP數(shù)據(jù)包的分段任務(wù)卸載到網(wǎng)絡(luò)適配器上,以減輕主機(jī)CPU的負(fù)載。
- TSO 是一種網(wǎng)絡(luò)性能優(yōu)化技術(shù),旨在減輕主機(jī)CPU的負(fù)載。
- 當(dāng)主機(jī)要發(fā)送一個(gè)大型TCP數(shù)據(jù)包時(shí),傳統(tǒng)的做法是將整個(gè)數(shù)據(jù)包構(gòu)建并發(fā)送到網(wǎng)絡(luò)適配器,然后在適配器上對(duì)數(shù)據(jù)包進(jìn)行分段以適應(yīng)網(wǎng)絡(luò)的最大傳輸單元(MTU)。
- TSO 將這個(gè)任務(wù)卸載到網(wǎng)絡(luò)適配器上,允許適配器在數(shù)據(jù)包發(fā)送之前將大型TCP數(shù)據(jù)包分割成適應(yīng)MTU的小數(shù)據(jù)塊。這減輕了主機(jī)CPU的工作負(fù)擔(dān),因?yàn)镃PU不再需要進(jìn)行數(shù)據(jù)包分段。
- TSO 可以提高網(wǎng)絡(luò)性能,因?yàn)樗怪鳈C(jī)CPU可以更專注于其他任務(wù)。
"TCP Segmentation Offload Truncation" "TCP分段卸載截?cái)? 或 "TCP截?cái)嘈遁d技術(shù)"。反映了TCP截?cái)嘈遁d技術(shù)的特性,即允許網(wǎng)絡(luò)適配器在傳輸之前截?cái)啻笮蚑CP數(shù)據(jù)包的一部分,以減小每個(gè)數(shù)據(jù)包的大小。這有助于提高網(wǎng)絡(luò)的可靠性和性能。
- TCP截?cái)嘈遁d是與TSO相關(guān)但不同的技術(shù)。它關(guān)注的是減小數(shù)據(jù)包的大小,以降低每個(gè)數(shù)據(jù)包的傳輸時(shí)間和網(wǎng)絡(luò)擁塞的風(fēng)險(xiǎn)。
- TCP截?cái)嘈遁d允許網(wǎng)絡(luò)適配器在傳輸之前截?cái)啻笮蚑CP數(shù)據(jù)包的一部分,以降低每個(gè)數(shù)據(jù)包的大小。這可以提高網(wǎng)絡(luò)的可靠性,因?yàn)檩^小的數(shù)據(jù)包更容易在網(wǎng)絡(luò)上傳輸,減少了丟包的可能性。
- 相比之下,TSO主要關(guān)注將大型TCP數(shù)據(jù)包分割以降低CPU負(fù)載。
- TCP截?cái)嘈遁d可以減少網(wǎng)絡(luò)延遲和擁塞,對(duì)實(shí)時(shí)應(yīng)用程序和延遲敏感的流量特別有益。
綜上所述,TSO和TCP截?cái)嘈遁d都是用于優(yōu)化TCP數(shù)據(jù)包傳輸?shù)募夹g(shù),但它們的焦點(diǎn)和目標(biāo)不同。TSO旨在降低主機(jī)CPU的負(fù)載,而TCP截?cái)嘈遁d旨在減小數(shù)據(jù)包的大小以降低網(wǎng)絡(luò)擁塞的風(fēng)險(xiǎn)。這兩種技術(shù)可以在一些情況下協(xié)同工作,以提高網(wǎng)絡(luò)性能和可靠性。但需要注意的是,它們都需要得到支持并在網(wǎng)絡(luò)適配器上適當(dāng)配置。
截?cái)嗪托遁d的含義
- 截?cái)啵═runcation):在網(wǎng)絡(luò)通信中,"截?cái)? 通常指的是將數(shù)據(jù)包的一部分或整個(gè)部分從數(shù)據(jù)流中移除或刪除的操作。這可以用于減小數(shù)據(jù)包的大小或限制傳輸?shù)臄?shù)據(jù)量。在 "TCP截?cái)嘈遁d" 中,"截?cái)? 意味著將大型TCP數(shù)據(jù)包的一部分或整個(gè)部分刪除,以降低數(shù)據(jù)包的大小。
- 卸載(Offload):"卸載" 是指將某些任務(wù)或處理從一個(gè)系統(tǒng)或組件轉(zhuǎn)移到另一個(gè)系統(tǒng)或組件的過(guò)程。在網(wǎng)絡(luò)通信中,"卸載" 通常指的是將數(shù)據(jù)包處理任務(wù)從主機(jī)的CPU卸載到網(wǎng)絡(luò)適配器(NIC)或其他硬件上執(zhí)行。這可以減輕主機(jī)CPU的負(fù)載,提高網(wǎng)絡(luò)性能。
skb_shinfo
#define skb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB)))
這里定義了一個(gè)宏(macro),用于訪問(wèn) Linux 內(nèi)核中的網(wǎng)絡(luò)數(shù)據(jù)包(skb,Socket Buffer)的共享信息(shared info)。宏的名稱是 skb_shinfo
,它接受一個(gè)名為 SKB
的參數(shù),通常是指向網(wǎng)絡(luò)數(shù)據(jù)包的指針(skb)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-710377.html
整個(gè)宏的作用是獲取指向網(wǎng)絡(luò)數(shù)據(jù)包共享信息結(jié)構(gòu)的指針,該結(jié)構(gòu)包含了有關(guān) skb 的一些元數(shù)據(jù)和共享信息,通常用于高性能的數(shù)據(jù)包處理操作。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-710377.html
到了這里,關(guān)于linux內(nèi)核網(wǎng)絡(luò)源碼學(xué)習(xí)(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!