linux kernel --- checksum相关ip_summed和feature字段解释
一、引言
1、linux kernel中要保證IP/TCP/UDP數(shù)據(jù)的正確性,就要對數(shù)據(jù)進(jìn)行校驗(yàn)。校驗(yàn)方法,簡單來說,就是對要計(jì)算的數(shù)據(jù),以16bit為單元進(jìn)行累加,取反。
2、由于目前很多網(wǎng)卡設(shè)備是支持對L4層(傳輸層 tcp/udp層)數(shù)據(jù)包進(jìn)行checksum的計(jì)算和驗(yàn)證的,所以在L4協(xié)議軟件的實(shí)現(xiàn)中,會(huì)根據(jù)網(wǎng)卡的支持情況作不同的處理,為此內(nèi)核在struct sk_buff結(jié)構(gòu)和struct net_device中增加了校驗(yàn)和相關(guān)的參數(shù),如下:
二、struct sk_buff 結(jié)構(gòu)
struct sk_buff 中與checksum有關(guān)的字段如下:
struct sk_buff {...__u8 ip_summed:2;...union {__wsum csum;struct {__u16 csum_start;__u16 csum_offset;};};... } #define CHECKSUM_NONE 0 #define CHECKSUM_UNNECESSARY 1 #define CHECKSUM_COMPLETE 2 #define CHECKSUM_PARTIAL 3上述聯(lián)合體中哪個(gè)成員有效取決于ip_summed的值,ip_summed共兩個(gè)bit,可取四個(gè)標(biāo)志,而且在發(fā)送和接收時(shí)的含義還有所不同。
1、接收過程
skb->csum可能包含L4一部分校驗(yàn)和;
skb->ip_summed字段代表:設(shè)備驅(qū)動(dòng)告訴L4, 軟件當(dāng)前校驗(yàn)和的狀態(tài),各取值含義如下:
(1) CHECKSUM_NONE:
skb->csum中的校驗(yàn)和無效,可能是硬件沒有提供校驗(yàn)和,可能是硬件不支持,也可能是硬件校驗(yàn)出錯(cuò)但是并未丟棄數(shù)據(jù)包,此時(shí)將ip_summed設(shè)為CHECKSUM_NONE,讓L4軟件重新校驗(yàn);
(2) CHECKSUM_UNNECESSARY:
硬件已經(jīng)進(jìn)行了完整的校驗(yàn),無需軟件再進(jìn)行檢查,L4收到數(shù)據(jù)包后如果檢查ip_summed是這種情況,就可以跳過校驗(yàn)過程;
(3) CHECKSUM_COMPLETE:
硬件已經(jīng)校驗(yàn)了L4報(bào)頭和其payload部分,并且校驗(yàn)和保存在了skb->csum中,L4軟件只需要再計(jì)算偽報(bào)頭然后檢查校驗(yàn)結(jié)果即可。
2、發(fā)送過程
skb->ip_summed字段包含了L4軟件告訴設(shè)備驅(qū)動(dòng)程序當(dāng)前校驗(yàn)和的狀態(tài),各取值含義如下:
(1) CHECKSUM_NONE:L4軟件已經(jīng)進(jìn)行了校驗(yàn),硬件無需做任何事情;
(2) CHECKSUM_PARTIAL:L4軟件計(jì)算了偽報(bào)頭,并且將值保存在了tcp/udp首部的check字段中,硬件需要計(jì)算其余部分的校驗(yàn)和。
三、struct net_device 結(jié)構(gòu)
net_device結(jié)構(gòu)中的feature字段中定義了如下和校驗(yàn)和相關(guān)的字段,這些字段表明了硬件計(jì)算校驗(yàn)和的能力。
NETIF_F_NO_CSUM:該設(shè)備非常可靠,無需L4執(zhí)行任何校驗(yàn),環(huán)回設(shè)備一般設(shè)置該標(biāo)記
NETIF_F_IP_CSUM:設(shè)備可以對基于IPv4的TCP和UDP數(shù)據(jù)包進(jìn)行校驗(yàn)
NETIF_F_IPV6_CSUM:設(shè)備可以對基于IPv6的TCP和UDP數(shù)據(jù)包進(jìn)行校驗(yàn)
NETIF_F_HW_CSUM: 設(shè)備可以對任何L4協(xié)議的數(shù)據(jù)包進(jìn)行校驗(yàn)
四、參考
(1)UDP之?dāng)?shù)據(jù)報(bào)校驗(yàn)和:https://blog.csdn.net/xiaoyu_750516366/article/details/83422212
(2)Checksum in Linux Kernel:http://hustcat.github.io/checksum-in-kernel/
總結(jié)
以上是生活随笔為你收集整理的linux kernel --- checksum相关ip_summed和feature字段解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 自动生成word文档,用
- 下一篇: Linux操作提示:“Cant open