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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

【Linux 网络】IP校验和计算相关

發(fā)布時間:2023/12/8 linux 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux 网络】IP校验和计算相关 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

校驗和只是為防止報文在信道傳輸出現(xiàn)誤碼導(dǎo)致報文錯誤,并不保證報文被他人惡意篡改。

轉(zhuǎn)發(fā)報文相關(guān)的校驗和包括3層校驗和4層校驗,2中的校驗和的計算公式的入?yún)⒉煌?#xff1a;3層校驗僅僅校驗3層頭;4層校驗需要校驗偽頭部+4層頭+4層負載。

所有校驗和的計算方法是統(tǒng)一的,即所有2字節(jié)數(shù)據(jù)相加,結(jié)果的進位再次與2字節(jié)數(shù)據(jù)相加,對最終結(jié)果取反。還有一種是4字節(jié)相加,然后再2字節(jié)折疊,進位再與2字節(jié)相加,最終取反。

根據(jù)以上計算方式有推論:

csum(ip頭)+csum(ip負載)=csum(ip頭+ip負載)

一、IP校驗和

unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl);

iph:ip頭指針

ihl:ip頭長度,4字節(jié)長度的數(shù)目。

采用4字節(jié)進位累加,最終再2字節(jié)折疊進位累加。

?

? ? ? ? ?該函數(shù)發(fā)包計算和收包校驗都可以。發(fā)包計算虛將ip->check字段清0;收包校驗不用將check清0,直接對整個ip頭計算結(jié)果如果為0則認(rèn)為校驗成功(因為校驗和字段存的是反碼,如果將校驗和結(jié)果也納入校驗和計算公式,相當(dāng)于正碼+反碼=0)。

二、TCP、UDP校驗和計算

偽頭部=saddr + daddr + len(tcp頭+tcp負載) + protocol(L4)

L4校驗和=csum(偽頭部+tcp頭+tcp負載),計算之前需將頭里校驗和字段清0.

增加偽頭部的校驗進一步增加校驗內(nèi)容,為保證L3和L4的一致(防君子不防小人)

csum_tcpudp_magic()的sum參數(shù)就是tcp頭+tcp負載的校驗和

?

?如:

?三、其他校驗和函數(shù)

1、csum_partial()

從buff開始的len長度的內(nèi)存計算校驗和,并且對sum增量計算。簡單說將len對4補齊計算32bit校驗和,但沒有取反。

2、csum_fold()

將32bit數(shù)字折疊成16bit校驗和,并取反。以4字節(jié)計算校驗和方式的接口最終都會調(diào)用該接口獲取最終結(jié)果。

一般校驗和計算都是統(tǒng)一對數(shù)據(jù)進行++操作后如skb_csum()、csum_partial()函數(shù)等等,最終調(diào)用csum_fold()函數(shù)對結(jié)算結(jié)果進程折疊并取反,得出最終的校驗和結(jié)果。

四、skb中校驗和相關(guān)字段

ip_summed表明L3和L4的計算結(jié)果,區(qū)分接收和發(fā)送。

1、接收過程
skb->csum可能包含L4一部分校驗和;
skb->ip_summed字段代表:設(shè)備驅(qū)動告訴L4, 軟件當(dāng)前校驗和的狀態(tài),各取值含義如下:
(1) CHECKSUM_NONE:
skb->csum中的校驗和無效,可能是硬件沒有提供校驗和,可能是硬件不支持,也可能是硬件校驗出錯但是并未丟棄數(shù)據(jù)包,此時將ip_summed設(shè)為CHECKSUM_NONE,讓L4軟件重新校驗;

(2) CHECKSUM_COMPLETE:
硬件已經(jīng)校驗了L4報頭和其payload部分,并且校驗和保存在了skb->csum中,L4軟件只需要再計算偽報頭然后檢查校驗結(jié)果即可。硬件計算稍復(fù)雜的偽頭部比較好性能,因為偽頭部需要提取ip頭的信息。
(3) CHECKSUM_UNNECESSARY:
硬件已經(jīng)進行了完整的校驗,無需軟件再進行檢查,L4收到數(shù)據(jù)包后如果檢查ip_summed是這種情況,就可以跳過校驗過程;

2、發(fā)送過程
skb->ip_summed字段包含了L4軟件告訴設(shè)備驅(qū)動程序當(dāng)前校驗和的狀態(tài),各取值含義如下:
(1) CHECKSUM_NONE:L4軟件已經(jīng)進行了校驗,硬件無需做任何事情;
(2) CHECKSUM_PARTIAL:L4軟件計算了偽報頭,并且將值保存在了tcp/udp首部的check字段中,硬件需要計算其余部分的校驗和。硬件適合做簡單的++操作,偽頭部稍復(fù)雜交給cpu。
?

總結(jié)

以上是生活随笔為你收集整理的【Linux 网络】IP校验和计算相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。