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

首頁 > 課堂 > 網(wǎng)絡(luò)協(xié)議 > 正文

IP、ICMP、UDP、TCP 校驗(yàn)和算法分享

2020-10-24 11:54:20
字體:
供稿:網(wǎng)友

以前看計(jì)算機(jī)網(wǎng)絡(luò)相關(guān)的書,每次看到IP或者UDP報(bào)頭校驗(yàn)和時(shí),都一瞥而過,以為相當(dāng)簡單,不就是16bit數(shù)據(jù)的相加嗎。最近在研究《TCP/IP詳解 卷1:協(xié)議》這本書,看到校驗(yàn)和是16bit字的二進(jìn)制反碼和(暈,以前都沒注意原來是反碼和,看來以前看書不仔細(xì)??!罪過,罪過~~),覺得很奇怪,為什么會(huì)用反碼和,而不是直接求和呢?(因?yàn)槲艺J(rèn)為TCP/IP協(xié)議里面的算法和思想一般都是非常經(jīng)典的,人家這么做一定有原因的)下面就來探索一下這個(gè)校驗(yàn)和算法具體怎么實(shí)現(xiàn)的。

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

 在發(fā)送數(shù)據(jù)時(shí),為了計(jì)算數(shù)據(jù)包的校驗(yàn)和。應(yīng)該按如下步驟:

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

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

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

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

講了這么多,那這個(gè)校驗(yàn)和到底是怎么算的呢?

1. 什么是二進(jìn)制反碼求和

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

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

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

下面再舉例兩種二進(jìn)制反碼求和的運(yùn)算:

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

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

另外關(guān)于二進(jìn)制反碼求和運(yùn)算需要說明的一點(diǎn)是,先取反后相加與先相加后取反,得到的結(jié)果是一樣的!(事實(shí)上我們的編程算法里,幾乎都是先相加后取反。)

2. 校驗(yàn)和算法的實(shí)現(xiàn)


講了什么是二進(jìn)制反碼求和,那么校驗(yàn)和的算法實(shí)現(xiàn)就簡單多了。廢話少說,直接上代碼:


復(fù)制代碼
代碼如下:

[cpp] view plaincopy
//計(jì)算校驗(yàn)和
USHORT checksum(USHORT *buffer,int size)
{
unsigned long cksum=0;
while(size>1)
{
cksum+=*buffer++;
size-=sizeof(USHORT);
}
if(size)
{
cksum+=*(UCHAR *)buffer;
}
//將32位數(shù)轉(zhuǎn)換成16
while (cksum>>16)
cksum=(cksum>>16)+(cksum & 0xffff);
return (USHORT) (~cksum);
}

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

3. 為什么使用二進(jìn)制反碼求和呢?

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

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校驗(yàn)和中使用反碼求和的一些優(yōu)點(diǎn):

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
日本少妇色视频| 亚洲一区二区高清| 亚洲第一免费播放区| 成年人观看网站| 欧美高清视频手机在在线| 欧美优质美女网站| 亚洲欧美另类综合偷拍| 美女久久久精品| 欧美日溪乱毛片| 777a∨成人精品桃花网| 日韩电影免费在线| 欧美一级在线播放| 国产精品亚洲综合在线观看| 成人欧美一区二区三区小说| 国产成在线观看免费视频| 色综合久久久久久| 欧美三级电影在线看| 国产伦久视频在线观看| www.xxxx国产| 中文字幕日韩av综合精品| 国内精品不卡在线| 国产日产在线观看| 视频一区在线观看| 亚洲精品粉嫩美女一区| 91精品入口| 中文幕av一区二区三区佐山爱| 亚洲三级影院| 免费看污片的软件| 国产极品在线观看| 欧美色爱综合| 热久久一区二区| 国产精品毛片久久久| 久久精品久久久久| 97超碰中文字幕| 这里只有精品视频在线观看| 97视频热人人精品免费| 麻豆国产原创| 国产黄色小视频网站| 亚洲色图14p| 中文字幕大看焦在线看| 亚洲精品久久久久久国| 91在线免费播放| 亚洲v精品v日韩v欧美v专区| 久久久午夜精品理论片中文字幕| www操操操| 国产噜噜噜噜久久久久久久久| 国产精品国产精品国产专区| 欧美大片aaa| 日日噜噜噜夜夜爽爽| 国产中文精品久高清在线不| 亚洲一本大道| 欧美高清另类hdvideosexjaⅴ| 国产成人亚洲精品青草天美| 久久久久久自在自线| 精品福利网址导航| 久久夜精品va视频免费观看| 99理论电影网| 欧美日韩一区二区三区69堂| 麻豆国产视频| 小明成人免费视频一区| 日本vs亚洲vs韩国一区三区二区| 中文一区二区| 日本成人激情视频| 国产欧美日韩一区二区三区四区| 伊人网在线观看| 欧美尺度大的性做爰视频| 无码日韩精品一区二区免费| 免费激情视频网站| 狠狠干夜夜草| 亚洲男人天堂2021| 熟女熟妇伦久久影院毛片一区二区| 国产激情视频一区二区在线观看| 欧美三级情趣内衣| 欧美精品一区二区三区涩爱蜜| 精品国产乱子伦| 久久亚洲一区二区三区四区五区高| 精品国产乱码久久久久久1区2区| 97视频在线观看成人| 色呦呦一区二区| 久久精品无码人妻| 中文字幕色av一区二区三区| 国产精品久久久久久久久久久久久久久久| 印度美女freesex性hd| 欧美成人xxxxx| 亚洲色图 欧美| 国产一级一片免费播放| 国产一级精品在线| 五月婷婷视频在线观看| 长河落日免费高清观看| 最新国产一区| 亚洲精选中文字幕| 国产日韩精品久久久| 欧美日韩一区二区三区四区在线观看| 国产高清在线观看视频| 欧美性猛片xxxxx免费中国| 欧美人成网站| 日韩大片免费观看| 久草网在线观看| 精品一区国产| 久久久久久久激情| 亚洲综合激情五月| 宅男噜噜99国产精品观看免费| 国产在线观看免费视频软件| 99精品国产一区二区三区2021| 国产 福利 在线| 不卡av中文字幕| 亚洲自拍小视频免费观看| 欧美人与物videos另类| 最新国产露脸在线观看| 亚洲人成在线观看网站高清| 国产精品国产成人国产三级| 在线亚洲欧美| 国产精品无码一本二本三本色| 亚洲一区二区3| 国产精品久久亚洲| 亚洲欧美色一区| 在线观看亚洲欧美| 亚洲色图视频免费播放| 亚洲欧美日韩视频二区| 亚洲网站一区| 国产精品久久久久av蜜臀| 国产精品毛片av| a欧美人片人妖| 日韩欧美一级二级| 国产无套精品一区二区| 欧美高清视频手机在在线| 超黄网站在线观看| 国产91精品青草社区| 天堂成人免费av电影一区| 亚洲视频在线网| 粗大的内捧猛烈进出视频| 麻豆国产高清在线播放| 午夜黄色一级片| 五月天亚洲激情| 欧美一区欧美二区| 精品伊人久久久久7777人| 在线免费观看av电影| 日韩护士脚交太爽了| 久久久精品网站| 免费国产在线观看| 国产麻豆视频网站| 国产一区二区三区精品欧美日韩一区二区三区| 国产一区欧美日韩| 欧美日韩亚洲成人| 精品无线一线二线三线| 亚洲综合色一区| 成人av在线资源网站| 91性高湖久久久久久久久_久久99| 国产精品久久久免费视频| 久久视频在线直播| 一区二区三区在线视频免费| 欧美人与牲动交xxxxbbbb| 日韩精品资源二区在线| 精品国产91亚洲一区二区三区婷婷| 日皮视频在线免费观看| 91免费日韩| 精品国产一区二区三区四区| 精品国内自产拍在线观看视频| 国产人伦精品一区二区| 成人v精品蜜桃久久一区| 久久精品导航| 猛性xxxxx| 久久9热精品视频| 古典武侠综合av第一页| 免费av在线一区二区| 蜜桃视频成人在线观看| 丰满人妻av一区二区三区| 中文字幕一区不卡| 日本强好片久久久久久aaa| 激情视频免费网站| 91在线视频九色| 欧美一区在线观看视频| 欧美亚洲视频| 在线国产视频| 激情亚洲色图| 不卡av在线免费观看| 粗暴蹂躏中文一区二区三区| 亚洲欧美偷拍另类a∨色屁股| 国产一区在线看| 国产欧美一级片| 日韩偷拍自拍| 中文字幕亚洲影院| 国产免费播放一区二区| 国产大屁股喷水视频在线观看| 北条麻妃一区二区三区在线| av第一福利大全导航| 精品免费二区三区三区高中清不卡| 色香蕉在线视频| 伊人久久精品| 噼里啪啦国语在线观看免费版高清版| 欧美老女人在线| 亚洲一区二区在线视频| 国产免费一区| 欧美日韩亚洲国产另类| 电影亚洲精品噜噜在线观看| 在线观看视频污| 国产精品毛片a∨一区二区三区| 亚洲精品乱码久久久久久久久| 亚洲欧美日韩偷拍| 91精品国产高清久久久久久久久| 精品视频网站| 日韩欧美天堂| 欧美日韩一区二区三区四区不卡| 中文字幕在线导航| 男同在线观看| 粉色视频免费看| 中文字幕日韩专区| 欧美一二三区精品| 中文字幕人妻丝袜乱一区三区| 欧美大香线蕉线伊人久久国产精品| 久久精品国产精品国产精品污| 色777狠狠狠综合伊人| 99re6热在线精品视频播放| 久久精品国产久精国产爱| 成人免费毛片嘿嘿连载视频| 亚洲欧洲精品一区二区三区| 中日韩美女免费视频网站在线观看| 伊人久久大香线蕉| 亚洲熟妇无码一区二区三区导航| 成人妇女淫片aaaa视频| 最新在线黄色网址| 欧美在线91| jizz18欧美| 日本激情视频在线观看| 在线丨暗呦小u女国产精品| 天堂8中文在线最新版在线| 国产伦一区二区| 中文字幕欧美日韩va免费视频| 久久久久久久高清| 亚洲视频精品一区| 国产精品日韩久久久| 国产精品综合色区在线观看| 91精品国产自产在线观看永久∴| 亚洲国产精久久久久久| 中文字幕中文字幕中文字幕亚洲无线| 久久久久国产精品视频| 精品人妻一区二区三区四区不卡| 欧美精品v日韩精品v国产精品| 日韩欧美国产另类| 豆国产96在线|亚洲| 国内精品久久久久| 里番在线播放| 亚洲欧美精品一区二区| 91传媒视频免费| 国产精品久久久久久久一区探花| 视频三区在线| 国产精品久久久久久久久免费桃花| 久久精品国产亚洲精品| 亚洲国产欧美精品| 成人羞羞视频免费| 在线免费三级电影网站| 91精品在线观看国产| 欧美毛片又粗又长又大| 国产成人在线小视频| 日韩一级裸体免费视频| 欧美综合欧美视频| 欧美日韩一区二区在线播放| www.色五月| 亚洲综合中文字幕在线观看| 亚洲裸体俱乐部裸体舞表演av| 国产精品天天干| 久久久久久久高潮| 日韩一区二区三区视频| 国产成人午夜电影网| 最近2019中文字幕第三页视频| 97久久香蕉国产线看观看| 欧美成人免费全部网站| 羞羞污视频在线观看| freexxx性亚洲精品| 久久久噜噜噜久久狠狠50岁| 91亚洲国产成人久久精品麻豆| 美女日批视频在线观看| 加勒比一区二区| 99久久.com| 亚洲一区导航| 偷拍25位美女撒尿视频在线观看| 成年女人午夜毛片免费看| 国产成人三级一区二区在线观看一| 黄色国产网站在线观看| 久久视频社区| 销魂美女一区二区三区视频在线| 国产精品99久久久久久久久久久久| 在线人成动漫视频在线观看| 国产另类自拍| 精品久久久三级丝袜| 日韩欧美美女一区二区三区| 精品国产一区二区三区久久| 成人h小游戏| 日韩av电影免费| 污污网站在线| 黄色a级在线观看| 欧美亚洲国产一区二区三区va| 国产白袜脚足j棉袜在线观看| 日本一区二区免费电影| 国产乱码精品| 欧美精品观看| www.99热| 68国产成人综合久久精品| 虎白女粉嫩尤物福利视频| 国产第100页| 久久精品99久久无色码中文字幕| 99精品国产一区二区青青牛奶| 色丁香婷婷综合久久| 亚洲免费资源| 波多野结衣一区| 91综合免费在线| 中国一级大黄大黄大色毛片| 国产亚洲欧美视频| 高潮毛片无遮挡| 91免费版看片| 亚洲成aⅴ人片久久青草影院| 国产一级一级国产| 一级毛片视频在线观看| 国内精品卡一卡二卡三| 成人禁在线观看网站| 无码精品国产一区二区三区免费| 国产又爽又黄又舒服又刺激视频| 国产v亚洲v天堂无码| www国产精品视频| 精品视频1区2区| 久草视频在线播放| 四虎电影院在线观看| 精品高清视频| 99久久99久久精品国产片| 艳妇荡乳欲伦69影片| 欧美aaaaaa午夜精品| 精品91久久久久| 亚洲av综合色区|