Linux SKB结构体中各个长度字段的含义(len, data_len, headlen, pagelen)
結(jié)構(gòu)體sk_buff是Linux內(nèi)核網(wǎng)絡(luò)子系統(tǒng)的一個(gè)基本結(jié)構(gòu)體,關(guān)于它的長(zhǎng)度有很多定義和操作,非常容易弄混,這里給出一個(gè)簡(jiǎn)單的說(shuō)明。
下面這幅圖是《深入理解Linux網(wǎng)絡(luò)技術(shù)內(nèi)幕》里面的圖,一個(gè)skb用于存儲(chǔ)一個(gè)報(bào)文,如果一個(gè)報(bào)文特別大的話,線性存儲(chǔ)區(qū)放不下就需要多個(gè)skb來(lái)存儲(chǔ),這就是下面frag_list的作用,保存連續(xù)的skb,但是如果內(nèi)核支持分散聚集技術(shù)的話,并且報(bào)文長(zhǎng)度剛好又不大于mtu,就不必重新分配一個(gè)skb來(lái)存儲(chǔ),可以使用一些內(nèi)存碎片來(lái)存儲(chǔ),就是下面的frags數(shù)組表示的內(nèi)存頁(yè)面片段。舉一個(gè)恰當(dāng)?shù)睦?#xff0c;一幫弟兄去湊份子,湊份子起點(diǎn)比較高,大哥錢不夠,這時(shí)候如果有小弟(內(nèi)核支持分散聚集)并且小弟有錢的話就拿上小弟的錢來(lái)湊,但是如果加上小弟的錢也不夠的話,大哥就只好去找兄弟去了⊙﹏⊙‖∣。份子錢就好比報(bào)文大小,大哥不夠小弟來(lái)湊,沒(méi)有小弟(不支持分散聚集)或者小弟錢也不夠就只好去找兄弟了,這里需要注意的一點(diǎn)是大哥和小弟的總錢數(shù)不能大于MTU,如果大于MTU的話,多出的部分就必須重新分配一個(gè)skb來(lái)存儲(chǔ)(總不能一直找小弟吧)。
skb->len //大哥、小弟和兄弟的總和,即data的總長(zhǎng)度,線性和非線性的總和。 skb->data_len //小弟和兄弟的總和,即大哥缺少的份額,非線性數(shù)據(jù)長(zhǎng)度。 skb_headlen() //即大哥長(zhǎng)度,線性長(zhǎng)度。和skb_headroom()不一樣,這個(gè)是只頭部空間剩余長(zhǎng)度。 skb_pagelen() //大哥和小弟的總和,即線性數(shù)據(jù)長(zhǎng)度和頁(yè)面碎片的長(zhǎng)度,不包括分片skb隊(duì)列長(zhǎng)度。?
總結(jié)
以上是生活随笔為你收集整理的Linux SKB结构体中各个长度字段的含义(len, data_len, headlen, pagelen)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 贵阳清镇丹山别苑,一共有多少套房子?
- 下一篇: skb_shinfo(skb)-data