linux核心中如何修改skb報文

2021-10-08 05:34:09 字數 1491 閱讀 8781

-核心**中有許多用於計算校驗和的api,下面是linux網路技術內幕相關api的截圖

sk_buf中的csum欄位

sk_buf中的ip_summed欄位

ip_summed欄位表示l4層的校驗和狀態。根據報文的不同(輸入報文和輸出報文),ip_summed會有不同的取值。

當資料報為輸入報文:

#define checksum_none 0

#define checksum_unnecessary 1

#define checksum_complete 2

skb->csum:存放硬體或者軟體計算的payload的checksum不包括偽頭,但是是否有意義由skb->ip_summed的值決定。

checksum_none表示csum域中的校驗值是無意義的,需要l4層自己校驗payload和偽頭。有可能是硬體檢驗出錯或者硬體沒有校驗功能,協議棧軟體更改如pskb_trim_rcsum函式。

checksum_unnecessary表示網絡卡或者協議棧已經計算和驗證了l4層的頭和校驗值。也就是計算了tcp udp的偽頭。還有一種情況就是回環,因為在回環中錯誤發生的概率太低了,因此就不需要計算校驗來節省cpu事件。

checksum_complete表示網絡卡已經計算了l4層payload的校驗,並且csum已經被賦值,此時l4層的接收者只需要加偽頭並驗證校驗結果。

· 1) 在l4層發現如果udp->check位段被設為0,那麼skb->ip_summed直接設為checksum_unnecessary,放行該報文。

· 2) 如果skb->ip_summed為checksum_complete,則把skb->csum加上偽頭進行校驗,成功則將skb->ip_summed設為checksum_unnecessary, 放行該資料報。

· 3) 通過上述後skb->ip_summed還不是checksum_unnecessary,那麼重新計算偽頭賦給skb->csum。

· 4) 將還不是checksum_unnecessary的資料報文的payload加上skb->csum進行checksum計算,成功將設為checksum_unnecessary並放行,失敗則丟棄。

ip頭部中的check欄位

static

void

__tcp_v4_send_check

(struct sk_buff *skb,

__be32 saddr, __be32 daddr)

else

}

在linux核心中修改TCP MSS值

mtu maxitum transmission unit 最大傳輸單元 mss maxitum segment size 最大分段大小 mss最大傳輸大小的縮寫,是tcp協議裡面的乙個概念。mss就是 tcp資料報每次能夠傳輸的最大資料分段。為了達到最佳的傳輸效能tcp協議在建立連線的時候通常要協...

如何在Linux核心中設定斷點

function q1 alias sq1 ssh p 8000 127.0.0.1 用如上命令q1啟動虛擬機器,注意加了 s選項。vncviewer 1進入vnc介面後按ctrl alt 2,進入了所謂的qemu monitor console,輸入 gdbserver tcp 1234在物理機上...

如何在linux核心中讀寫檔案

在vfs的支援下,使用者態程序讀寫任何型別的檔案系統都可以使用read和write著兩個系統呼叫,但是在linux核心中沒有這樣的系統呼叫我們如何操作檔案呢?我們知道read和write在進入核心態之後,實際執行的是sys read 和sys write,但是檢視核心源 發現這些操作檔案的函式都沒有...