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