亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 網絡協議 > 正文

IP、ICMP、UDP、TCP 校驗和算法分享

2020-02-18 18:57:38
字體:
來源:轉載
供稿:網友
這篇文章主要是為探索一下這個校驗和算法具體怎么實現的,需要的朋友可以參考下
 
 

以前看計算機網絡相關的書,每次看到IP或者UDP報頭校驗和時,都一瞥而過,以為相當簡單,不就是16bit數據的相加嗎。最近在研究《TCP/IP詳解 卷1:協議》這本書,看到校驗和是16bit字的二進制反碼和(暈,以前都沒注意原來是反碼和,看來以前看書不仔細??!罪過,罪過~~),覺得很奇怪,為什么會用反碼和,而不是直接求和呢?(因為我認為TCP/IP協議里面的算法和思想一般都是非常經典的,人家這么做一定有原因的)下面就來探索一下這個校驗和算法具體怎么實現的。

 首先,IP、ICMP、UDP和TCP報文頭部都有校驗和字段,大小都是16bit,算法也基本一樣:

 在發送數據時,為了計算數據包的校驗和。應該按如下步驟:

(1)把校驗和字段置為0;   
(2)把需校驗的數據看成以16位為單位的數字組成,依次進行二進制反碼求和;   
(3)把得到的結果存入校驗和字段中。   

在接收數據時,計算數據包的校驗和相對簡單,按如下步驟:   
(1)把首部看成以16位為單位的數字組成,依次進行二進制反碼求和,包括校驗和字段;   
(2)檢查計算出的校驗和的結果是否為0;   
(3)如果等于0,說明被整除,校驗是和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個數據包。

 雖然上面四種報文的校驗和算法一樣,但在作用范圍存在不同:IP校驗和只校驗20字節的IP報頭;而ICMP校驗和覆蓋整個報文(ICMP報頭+ICMP數據);UDP和TCP校驗和不僅覆蓋整個報文,而且還有12字節的IP偽首部,包括源IP地址(4字節)、目的IP地址(4字節)、協議(2字節,第一字節補0)和TCP/UDP包長(2字節)。另外UDP、TCP數據報的長度可以為奇數字節,所以在計算校驗和時需要在最后增加填充字節0(注意,填充字節只是為了計算校驗和,可以不被傳送)。

這里還要提一點,UDP的校驗和是可選的,當校驗和字段為0時,表明該UDP報文未使用校驗和,接收方就不需要校驗和檢查了!那如果UDP校驗和的計算結果是0時怎么辦呢?書上有這么一句話:“如果校驗和的計算結果為0,則存入的值為全1(65535),這在二進制反碼計算中是等效的。

講了這么多,那這個校驗和到底是怎么算的呢?

1. 什么是二進制反碼求和

對一個無符號的數,先求其反碼,然后從低位到高位,按位相加,有溢出則向高位進1(跟一般的二進制加法規則一樣),若最高位有進位,則向最低位進1。

首先這里的反碼好像跟我們以前學的有符號數的反碼不一樣(即正數的反碼是其本身,負數的反碼是在其原碼的基礎上,符號位不變,其余各位取反),這里不分正負數,直接每個位都取反!

上面加粗的那句是跟我們一般的加法規則不太一樣的地方:最高位有進位,則向最低位進1。確實有些疑惑,為什么要這樣做呢?仔細分析一下(為了方便說明,以 4bit二進制反碼求和舉例),上面的這種操作,使得在發生加法進位溢出時,溢出的值并不是10000,而是1111。也即是當相加結果滿1111時溢出,這樣也可以說明為什么0000和1111都表示0了(你同樣可以發現,任何數與這兩個數做二進制反碼求和運算結果都是原數,這恰好符合數0的加法意義)。

下面再舉例兩種二進制反碼求和的運算:

原碼加法運算                                               反碼加法運算
3(0011)+ 5(0101)= 8(1000)      3(1100)+ 5(1010)=  8(0111)
8(1000)+ 9(1001)= 1(0001)      8(0111)+ 9(0110)=  2(1101)

從上面兩個例子可以看出,當加法未發生溢出時,原碼與反碼加法運算結果一樣;當有溢出時,結果就不一樣了,原碼是滿10000溢出,而反碼是滿1111溢出,所以相差正好是1。舉例只是為了形象地觀察二進制反碼求和的運算規則,至于為什么要定義這樣的規則以及該運算規則還存在其它什么特性,可能就需要涉及代數理論的東西的了(嗚嗚~~數學理論沒學好啊,只能從表面上分析分析)。

另外關于二進制反碼求和運算需要說明的一點是,先取反后相加與先相加后取反,得到的結果是一樣的!(事實上我們的編程算法里,幾乎都是先相加后取反。)

2. 校驗和算法的實現


講了什么是二進制反碼求和,那么校驗和的算法實現就簡單多了。廢話少說,直接上代碼:

 

復制代碼
代碼如下:

[cpp] view plaincopy
//計算校驗和 
USHORT checksum(USHORT *buffer,int size) 

unsigned long cksum=0; 
while(size>1) 

cksum+=*buffer++; 
size-=sizeof(USHORT); 

if(size) 

cksum+=*(UCHAR *)buffer; 

//將32位數轉換成16 
while (cksum>>16) 
cksum=(cksum>>16)+(cksum & 0xffff); 
return (USHORT) (~cksum); 

 

buffer是指向需校驗數據緩存區的指針,size是需校驗數據的總長度(字節為單位) 
4~13行代碼對數據按16bit累加求和,由于最高位的進位需要加在最低位上,所以cksum必須是32bit的unsigned long型,高16bit用于保存累加過程中的進位;另外代碼10~13行是對size為奇數情況的處理!
14~16行代碼的作用是將cksum高16bit的值加到低16bit上,即把累加中最高位的進位加到最低位上。這里使用了while循環,判斷cksum高16bit是否非零,因為第16行代碼執行的時候,仍可能向cksum的高16bit進位。有些地方是通過下面兩條代碼實現的:cksum = (cksum >> 16) + (cksum & 0xffff); 
cksum += (cksum >>16);這里只進行了兩次相加,即可保證相加后cksum的高16位為0,兩種方式的效果一樣。事實上,上面的循環也最多執行兩次!
17行代碼即對16bit數據累加的結果取反,得到二進制反碼求和的結果,然后函數返回該值。

3. 為什么使用二進制反碼求和呢?

好了,最后一個問題,為什么要使用二進制反碼來計算校驗和呢,而不是直接使用原碼或者補碼?
這個問題我想了很久,由于水平有限實在弄不明白,于是在百度上一陣狂搜,什么都沒有(不知道是百度不給力,還是大家都不關注這個問題呢?)。果斷換google,敲了3個關鍵詞:why checksum tcp,嘿嘿 結果第二篇就是我想要的文章了?。。?br /> 先把鏈接給大家吧:http://www.netfor2.com/checksum.html
這篇文章主要介紹二進制反碼求和(the 1's complement sum)與補碼求和(the 2's complement sum)的區別,另外還說明了在TCP/IP校驗和中使用反碼求和的優點。

It may look awkword to use a 1's complement addition on 2's complement machines. This method however has its own benefits.
Probably the most important is that it is endian independent. Little Endian computers store hex numbers with the LSB last (Intel processors for example). Big Endian computers put the LSB first (IBM mainframes for example). When carry is added to the LSB to form the 1's complement sum (see the example) it doesn't matter if we add 03 + 01 or 01 + 03. The result is the same.
Other benefits include the easiness of checking the transmission and the checksum calculation plus a variety of ways to speed up the calculation by updating only IP fields that have changed.

上面是原文的一部分,說明在TCP/IP校驗和中使用反碼求和的一些優點:

a. 不依賴系統是大端還是小端。 即無論你是發送方計算或者接收方檢查校驗和時,都不需要調用htons 或者 ntohs,直接通過上面第2節的算法就可以得到正確的結果。這個問題你可以自己舉個例子,用反碼求和時,交換16位數的字節順序,得到的結果相同,只是字節順序相應地也交換了;而如果使用原碼或者補碼求和,得到的結果可能就不相同!
b. 計算和驗證校驗和比較簡單,快速。說實話,這個沒怎么看明白,感覺在校驗和計算方面,原碼或者補碼求和反而更簡單一些(從C語言角度),在校驗和驗證上面,通過一樣的算法判斷結果是否為全 0,確實要方便一些,所以可能從綜合考慮確實反碼求和要簡便一些。另外,IP報文在傳輸過程中,路由器經常只修改TTL字段(減1),此時路由器轉發該報文時可以直接增加它的校驗和,而不需要對IP整個首部進行重新計算。當然,可能從匯編語言的角度看,反碼求和還有很多高效的地方,這里就不在深入追究了~~~
結語:本來一個不怎么注意的地方,深入探究一下竟然發現這么多東西。學習算法其實沒有必要抱著《算法導論》一頁一頁地啃(嘿嘿,哥也有一本哦),我更喜歡從 TCP/IP協議或LInux內核原理中去探究算法以及實現思想,這樣反倒更有趣,而且這里面的一些算法和思想相當經典,慢慢體會,必然受益匪淺!



注:相關教程知識閱讀請移步到網絡協議頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕精品| 国产一区二区在线免费视频| 一级做a爰片久久毛片美女图片| 欧美第一淫aaasss性| 日韩亚洲一区二区| 91久久久久久久久久| 国内免费精品永久在线视频| 久久国产精品首页| 国产精品久久久久久久久免费看| 日韩中文字幕网址| 欧美国产精品日韩| 精品动漫一区二区| 在线亚洲午夜片av大片| 欧美乱人伦中文字幕在线| 精品久久久久久久大神国产| 91精品视频在线看| 91精品国产91久久久久久吃药| 精品一区二区亚洲| 5252色成人免费视频| 久久影视电视剧免费网站清宫辞电视| 国产精品扒开腿做爽爽爽的视频| 成人国产精品一区二区| 97国产suv精品一区二区62| 一区二区三区四区在线观看视频| 欧美电影第一页| 奇米成人av国产一区二区三区| 亚洲va欧美va国产综合剧情| 久久免费视频观看| 欧美成人一二三| 精品久久久香蕉免费精品视频| 中文字幕在线看视频国产欧美| 欧美综合激情网| 欧美日韩中文字幕日韩欧美| 精品日韩视频在线观看| 热re91久久精品国99热蜜臀| 欧美性感美女h网站在线观看免费| 91精品国产777在线观看| 久久99亚洲精品| 欧美成人免费在线观看| 欧美成人精品不卡视频在线观看| 亚洲欧美变态国产另类| 亚洲香蕉av在线一区二区三区| 热re99久久精品国产66热| 久久久久久免费精品| 日本成人免费在线| 国产精品自拍偷拍视频| 国产精品狠色婷| 久久精品国产v日韩v亚洲| 欧美亚洲第一区| 国产精品国产自产拍高清av水多| 午夜精品久久久久久99热| 欧美精品videosex牲欧美| 亚洲国产精品推荐| 久久免费观看视频| 亚洲女人天堂色在线7777| 97精品国产91久久久久久| 国模叶桐国产精品一区| 亚洲免费一级电影| 91精品国产网站| 欧美日韩黄色大片| 久久夜色精品国产亚洲aⅴ| 精品国产91乱高清在线观看| 不卡毛片在线看| 久久成人亚洲精品| 日本精品视频网站| 亚洲аv电影天堂网| 色哟哟入口国产精品| 日韩av片免费在线观看| 国产成人一区二区三区电影| 日韩美女毛茸茸| 欧美乱大交xxxxx另类电影| 欧美日韩国产综合视频在线观看中文| 亚洲一区二区三区乱码aⅴ蜜桃女| 在线播放国产精品| 在线观看精品国产视频| 久久久久女教师免费一区| 国产亚洲美女精品久久久| 亚洲精品成人久久电影| 2019中文字幕在线观看| 亚洲欧美综合精品久久成人| 亚洲视频在线播放| 久久精品国产免费观看| 国产日韩欧美一二三区| 中文字幕精品一区久久久久| 欧美性xxxx| 精品成人av一区| 国产有码一区二区| 国产欧美最新羞羞视频在线观看| 欧美插天视频在线播放| 色琪琪综合男人的天堂aⅴ视频| 成人免费黄色网| 精品少妇v888av| 91精品国产综合久久香蕉最新版| 国产自产女人91一区在线观看| 久久久久久久久电影| 亚洲成人精品久久| 中文字幕日韩欧美在线视频| 欧美影院久久久| 国产福利精品av综合导导航| 国产欧美亚洲视频| 日本亚洲欧美三级| 亚洲男人天堂2024| 91免费人成网站在线观看18| 日本aⅴ大伊香蕉精品视频| 亚洲石原莉奈一区二区在线观看| 成人av.网址在线网站| 久久久免费在线观看| 国产在线高清精品| 亚洲精品狠狠操| 亚洲精品国产欧美| 精品国产自在精品国产浪潮| 亚洲高清一区二| 色悠久久久久综合先锋影音下载| 亚洲区中文字幕| 国产在线拍揄自揄视频不卡99| 久久久久久久久久亚洲| 丝袜情趣国产精品| 国产日韩视频在线观看| 18一19gay欧美视频网站| 国产精品视频白浆免费视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产亚洲一区精品| 福利一区视频在线观看| 国产亚洲精品久久久久动| 久久久久久久色| 国产精品视频永久免费播放| 日韩欧美成人网| 奇米一区二区三区四区久久| 欧美在线激情网| 国产精品日韩久久久久| 一本一本久久a久久精品综合小说| 亚洲精品福利在线观看| 国产男女猛烈无遮挡91| 一区二区中文字幕| 国产精品久久久久免费a∨大胸| 国产亚洲成精品久久| 国产精品最新在线观看| 成人黄色免费在线观看| 日本不卡免费高清视频| 久久精品国产久精国产思思| 俺去亚洲欧洲欧美日韩| 国产精品久久久久久久久久久新郎| 国语自产精品视频在线看| 国产成人久久久精品一区| 亚洲一区二区三区四区在线播放| 国产一区欧美二区三区| 欧美午夜精品久久久久久久| 亚洲a在线播放| 国产精品第2页| 午夜精品久久久久久久白皮肤| 久久精品国产2020观看福利| 欧美成人四级hd版| 国产91精品黑色丝袜高跟鞋| 国产精品爱久久久久久久| 欧美日韩国产va另类| 精品亚洲国产视频| 国产精品免费视频久久久| 亚洲精选中文字幕| 久久久久久久电影一区| 日本欧美黄网站| 日本亚洲欧洲色α| 精品国产一区二区在线| 美女精品久久久| 亚洲欧洲一区二区三区在线观看|