日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux网络 IP/TCP校验和、checksum、伪首部相关问题

發布時間:2023/12/8 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux网络 IP/TCP校验和、checksum、伪首部相关问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、校驗和作用

校驗和是為防止報文在信道傳輸出現誤碼導致報文錯誤,或者傳輸過程中間網絡設備錯誤造成報文錯誤等,并不保證報文被他人惡意篡改。防君子不防小人,而已修改報文內容重新計算校驗和是無法檢測的。

2、校驗內容

網絡報文校驗和包括3層校驗和4層校驗,
3層校驗:僅校驗3層頭(網絡層ip頭,ipv6協議中沒有三層校驗和,僅指ipv4);
csum(ip頭)

4層校驗:需要校驗 偽頭部+4層頭+4層負載(應用層負載)。
csum(ip頭)+csum(ip負載)=csum(ip頭+ip負載)

3、計算方式

校驗和的計算方法是統一的,即所有2字節數據的二進制反碼求和。內核實現是以四字節求和取反得到校驗和。

發送方填充校驗和:
將校驗和的2byte置0,計算校驗和,將計算結果填充到校驗和位置。

接收方驗證校驗和:
驗證時按照同樣的計算方式,如果計算結果為0則表示校驗和正確,否則表示報錯已出錯。

幾個關鍵點:
1、先取反再求和與先求和再取反結果一致;為了效率內核使用先求和再取反方式計算;
2、按16bit與32bit結果一致;內核使用32bit以減少運算次數;
3、計算過程中二進制溢出進位時,將進位加到低位,循環計算,直到高位為0;
//詳細過程可閱讀內核源碼。反碼求和邏輯比較復雜,自行研究。

4、偽首部相關問題

偽首部并非TCP&UDP數據報中實際的有效成分。偽首部是一個虛擬的數據結構,其中的信息是從數據報所在IP分組頭的分組頭中提取的,既不向下傳送也不向上遞交,而僅僅是為計算校驗和。這樣的校驗和,既校驗了TCP&UDP用戶數據的源端口號和目的端口號以及TCP&UDP用戶數據報的數據部分,又檢驗了IP數據報的源IP地址和目的地址。偽報頭保證TCP&UDP數據單元到達正確的目的地址。

Q:已經有了ip頭校驗,為什么還需要在tcp層再次校驗ip相關信息?
A:網絡報文傳輸需要進過很多中間網絡設備,一般為路由器,rt會操作修改ip頭信息(ttl等內容),然后重新計算ip校驗和。比如,如果傳輸過程中由于軟硬件異常導致ip頭的目的地址錯誤將報文發送到了非正確的目的地,接收方檢查ip頭時未發現異常,此時上送到tcp層處理時,如果不檢查ip頭相關信息就無法檢測出此報文是錯誤的。

Q:偽首部可以直接使用整個ip頭嗎?
A:不合理,ip頭的部分自帶經過路由器時會修改變化的,如果使用完整的ip頭,中間設備每次都要重新計算tcp層校驗和。并且完整的頭也增加了計算量。

5、linux內核校驗和

計算校驗和需要遍歷每個字節,對性能影響還是很大的,所以linux對校驗和的計算做了很多優化處理
1、按需分多部計算,采用先求和最后取反的計算方式,可以將計算過程分多個步驟,包括報文分片時可以每片單獨計算sum,最后再同一相加區分。
2、借助硬件加速,將校驗和計算工作留給網卡硬件處理(接收發送都可以),但需要硬件支持此特性。

skb->ip_summed表明L3和L4的計算結果,區分接收和發送:

1、接收過程

skb->csum可能包含L4一部分校驗和;
skb->ip_summed字段代表:設備驅動告訴L4軟件當前校驗和的狀態,各取值含義如下:

(1) CHECKSUM_NONE:
skb->csum中的校驗和無效,可能是硬件沒有提供校驗和(硬件不支持、未開啟此功能等),此時將ip_summed設為CHECKSUM_NONE,讓L4軟件層重新校驗;

(2) CHECKSUM_COMPLETE:
硬件已經校驗了L4報頭和其payload部分,并且校驗和保存在了skb->csum中,L4軟件只需要再計算偽報頭然后檢查校驗結果即可。硬件計算稍復雜的偽頭部比較好性能,因為偽頭部需要提取ip頭的信息。
偽頭部包含ip信息、報文長度信息等,需要解析提取一些字段,此類工作對硬件來說比較復雜, 所以偽首部仍然交由軟件計算。

(3) CHECKSUM_UNNECESSARY:
硬件已經進行了完整的校驗,無需軟件再進行檢查,L4收到數據包后如果檢查ip_summed是這種情況,就可以跳過校驗過程;

(4) CHECKSUM_PARTIAL:
虛擬化環境同宿主機不同vm通信時收包會有此種情況(如virtio網卡),此時認為數據雖然未校驗,但認為可靠,不過tcp頭的校驗和字段是錯誤的。tcp協議棧檢查校驗和時此種情況不會檢查。

* CHECKSUM_PARTIAL:** A checksum is set up to be offloaded to a device as described in the* output description for CHECKSUM_PARTIAL. This may occur on a packet* received directly from another Linux OS, e.g., a virtualized Linux kernel* on the same host, or it may be set in the input path in GRO or remote* checksum offload. For the purposes of checksum verification, the checksum* referred to by skb->csum_start + skb->csum_offset and any preceding* checksums in the packet are considered verified. Any checksums in the* packet that are after the checksum being offloaded are not considered to* be verified.

2、發送過程

skb->ip_summed字段包含了L4軟件告訴設備驅動程序當前校驗和的狀態,各取值含義如下:
(1) CHECKSUM_NONE:L4軟件已經進行了校驗,硬件無需做任何事情;

(2) CHECKSUM_PARTIAL:L4軟件計算了偽報頭,并且將值保存在了tcp/udp首部的check字段中,硬件需要計算其余部分的校驗和。硬件適合做簡單的++操作,偽頭部稍復雜交給cpu。
(對應網卡驅動程序會設置描述符相應字段,硬件來處理)

參考:
https://blog.csdn.net/qy532846454/article/details/7010852
https://blog.csdn.net/weixin_39631017/article/details/111845098
https://blog.csdn.net/zhangwenxinzck/article/details/107574202
https://blog.csdn.net/weixin_29159127/article/details/116691805

總結

以上是生活随笔為你收集整理的Linux网络 IP/TCP校验和、checksum、伪首部相关问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。