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

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

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

2020-02-18 18:57:38
字體:
供稿:網(wǎng)友
這篇文章主要是為探索一下這個(gè)校驗(yàn)和算法具體怎么實(shí)現(xiàn)的,需要的朋友可以參考下
 
 

以前看計(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ì),必然受益匪淺!



注:相關(guān)教程知識閱讀請移步到網(wǎng)絡(luò)協(xié)議頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
自拍另类欧美| 一本色道亚洲精品aⅴ| 中文字幕免费国产精品| 日韩欧美在线观看免费| 日本一区免费观看| 在线播放黄网| 精品人妻在线视频| 日韩国产精品毛片| 国产精品久久久久77777丨| 亚洲第一区第二区| 男人天堂手机在线视频| 亚洲黄色三级| 亚洲熟妇无码一区二区三区导航| 岛国精品一区二区三区| 国产精品欧美韩国日本久久| 欧美一区二区三区性视频| 国产精品一区二区入口九绯色| 一区二区冒白浆视频| 一区二区视频在线观看| 97色在线播放视频| 在线成人激情视频| jizz中国少妇| 国产女呦网站| 欧美在线免费一级片| 亚洲高清视频网站| 岛国av一区二区| 国产成人免费精品| a在线观看视频| 极品人妻一区二区三区| 久草免费在线色站| 在线视频免费一区二区| 色综合久综合久久综合久鬼88| 91在线国内视频| 欧美日韩精品一区二区三区| 成人久久视频在线观看| 男人天堂2017| 97人澡人人添人人爽欧美| 色偷偷色偷偷色偷偷在线视频| 黄网页免费在线观看| 日本一区视频在线观看免费| 老色鬼久久亚洲一区二区| 国产高清精品久久久久| 免费一区二区三区在在线视频| 午夜视频网站在线观看| 欧美成年人视频在线观看| 国产一区二区精品久久91| 国产精品网站免费| 日本一区二区久久| 欧美视频在线免费播放| 久热在线中文字幕色999舞| 国产偷窥老熟盗摄视频| 精产国品一区二区三区| 国产高清精品软男同| 精品国产视频一区二区三区| 成人女人免费毛片| 欧美日韩国产不卡| 91精品国产91久久综合桃花| 免费a在线看| 视频一区在线视频| 久久最新免费视频| 视频一区视频二区中文| 国产精品99re| 中文字幕欧美一区| 在线观看亚洲网站| 看亚洲a级一级毛片| 欧美日韩免费观看一区三区| 精品高清一区二区三区| 日韩三区在线| 亚洲二区在线播放视频| 中文字幕免费高清电视剧网站在线观看| 干日本少妇视频| 福利在线国产| 最新日本在线观看| 欧美伦理视频网站| 日韩欧美123区| 国产精品美女免费视频| 在线免费观看日本欧美爱情大片| 免费看a级黄色片| 国内精品二区| 91综合视频| 在线不卡视频一区二区| 九九免费视频| 欧美激情图片小说| 麻豆国产精品va在线观看不卡| 成人午夜三级| 国内av在线播放| 中文字幕高清av| 国产精品yjizz视频网一二区| 亚洲国产精品999| 微拍福利一区二区| 四虎影院成人在线观看| 91理论电影在线观看| 一区二区三区四区高清视频| 国产精品永久久久久久久久久| xfplay资源站色先锋在线观看| 在线观看免费av网址| 91短视频版在线观看www免费| 亚洲国产欧美一区二区三区不卡| 欧美13videosex性极品| 国产精品500部| 91导航在线观看| 女厕盗摄一区二区三区| 久久草视频在线| 九九久久电影| 在线观看欧美www| 国内精品视频在线观看| 亚洲柠檬福利资源导航| 亚洲性在线观看| 超碰av女优在线| 亚洲综合视频在线观看| 日本久久综合| 亚洲二区自拍| 8x拔播拔播x8国产精品| www.男人的天堂.com| av在线播放中文字幕| 中文字幕精品在线观看| 欧美日韩国产美女| 亚洲日韩欧美视频| 4438x亚洲最大成人网| 中文字幕av在线免费观看| 欧美白人最猛性xxxxx| 亚洲综合国产激情另类一区| 黄网址在线播放免费| 青春草视频在线观看| 国模视频一区二区| 国产中文在线| 麻豆乱码国产一区二区三区| 欧美亚洲激情在线| 99riav国产| 国产99精品在线观看| 日韩黄色一级片| 欧美午夜精品电影| 欧美又粗又硬又大久久久| 熟女人妇 成熟妇女系列视频| 亚洲精品mv| 一本到不卡精品视频在线观看| 国产呦系列欧美呦日韩呦| 欧美一级久久久久久久大片| 午夜精品福利电影| 国产精品一区2区3区| 日本免费观看网站| 丝袜久久网站| 青青视频免费在线观看| 99热这里只有精品在线观看| 91超碰在线免费观看| 欧美性猛交xxxx黑人| 国产精自产拍久久久久久| 欧美日本视频在线| 无圣光视频在线观看| 精品久久久久久无码国产| 久久精品免费| 亚洲国产欧美精品| 国产特黄级aaaaa片免| 精品999久久久| 欧美美乳视频网站在线观看| 亚洲国产视频网站| 国产羞羞视频| 亚洲片在线观看| 丝袜美腿一区二区三区| 国产精品揄拍500视频| 香蕉精品视频在线| 97国产一区二区精品久久呦| 中文字幕在线播放视频| 亚洲精品911| av网站一区| 99热国内精品| 国产三区二区一区久久| av观看免费在线| 97久久夜色精品国产| 久久久久久久久久一区| 国产99精品一区| 91好吊色国产欧美日韩在线| 操一操视频一区| 亚洲第一狼人区| 国产浴室偷窥在线播放| 日韩人妻无码一区二区三区99| 999久久久精品一区二区| 性感美女激情视频在线观看| 深夜福利视频一区二区| 依依综合在线| 日本免费一区二区三区| 九热爱视频精品视频| 黄网站色大毛片| 欧美激情一区二区三区成人| 色婷婷色综合| 亚洲免费在线看| 偷偷要 色偷偷| 7m精品福利视频导航| 精品国产av色一区二区深夜久久| 欧美日韩一区二区三区在线观看免| 黄色一区二区在线观看| 后入内射无码人妻一区| 精品亚洲aⅴ无码一区二区三区| 国产精品二区在线| 日本一级在线观看| 欧美日韩在线精品一区二区三区激情综合| 欧美色窝79yyyycom| 黄黄视频在线观看| 黄色免费成人| 欧美美女黄视频| 久久久久久久久久久视频| 国产乱码在线观看| 久久免费福利视频| 黄色在线网站噜噜噜| 国产自产一区二区| 大地资源网3页在线观看| 国产最新精品精品你懂的| 成年人网站免费在线观看| 一区二区日本视频| 成人一级黄色大片| 国产日产精品_国产精品毛片| 欧美色123| 精品国产第一区二区三区观看体验| 老司机午夜网站| 国产综合精品久久久久成人av| 亚洲国产精品黑人久久久| 成人h动漫精品一区二区无码| 日韩视频中午一区| **欧美日韩在线| 国产精品高潮呻吟久久av黑人| 国产麻豆精品在线观看| 国自产精品手机在线观看视频| 午夜视频久久久久久| 欧美午夜a级限制福利片| 免费能直接在线观看黄的视频| 国产999精品久久| 蜜臀av性久久久久蜜臀av麻豆| 国产美女视频免费看| 国产麻豆精品一区二区三区v视界| 国产精品www爽爽爽| 先锋影音av资源网| 国产视频精品va久久久久久| 中文字幕在线一区| 国内精品视频久久| 哺乳挤奶一区二区三区免费看| 亚洲精品99| 亚洲国产精品久久久久| 青青草国产精品一区二区| 一区二区三区韩国| 久久先锋资源| 日韩午夜精品电影| 91人成网站www| 亚洲国产欧美日韩另类综合| 亚洲天堂av一区| 亚洲 欧美 日韩在线| 成人免费淫片免费观看| 久久久噜噜噜久久中文字免| 狠狠爱www人成狠狠爱综合网| 久操视频在线免费播放| 天天综合视频在线观看| 国产一区二区女内射| 天堂va欧美va亚洲va老司机| 国产精品系列视频| 美女视频黄是免费| 午夜福制92视频| 日韩视频在线一区二区| av在线播放不卡| 波多野结衣激情视频| 国产一区二区三区日韩精品| 日韩免费在线视频观看| 国产高清自拍视频| 欧美一区二区三区视频免费| 国产福利一区二区精品秒拍| 成人av资源网| 午夜精品在线播放| 国产传媒一区| 国产激情偷乱视频一区二区三区| 99久久激情视频| 精品一区在线观看视频| 亚洲国产精品日韩专区av有中文| 日韩免费在线电影| 4444欧美成人kkkk| 欧美喷潮久久久xxxxx| 日韩精品一区国产| 亚洲激情自拍| 偷拍25位美女撒尿视频在线观看| 久久久久久久久久久久久9999| 日韩三级电影网址| 黄色工厂这里只有精品| 中文字幕精品视频| 稀缺呦国内精品呦| 精品伊人久久97| 欧洲美女网站| 麻豆成人久久精品二区三区小说| 国产对白国语对白| 四虎永久免费网站| 亚洲一卡二卡三卡四卡五卡| 五月激情四射婷婷| 亚洲一区资源| 欧美成人禁片在线www| 在线视频不卡国产| 一区二区免费| 免费观看欧美成人禁片| 日韩av不卡在线观看| 亚洲怡红院在线| 亚洲国产精品成人av| 国产欧美久久久久久久久| 亚洲色图35p| www.激情成人| 欧美三级在线| 久久久久麻豆v国产精华液好用吗| 伊人网中文字幕| 国产a久久精品一区二区三区| 丝袜美女写真福利视频| 精品国产1区2区| 天堂中文字幕| 天天夜碰日日摸日日澡| 欧美极品美女视频| 久久高清内射无套| 久久99精品久久久久久三级| 国产精品女人久久久久久| 国产精品久久久久影视| 隣の若妻さん波多野结衣| 日韩欧美一级特黄在线播放| 亚洲国产精品一区二区三区| 香蕉人人精品| 中文字幕午夜精品一区二区三区| 麻豆久久婷婷| 少妇人妻在线视频| 美女视频黄久久| 手机在线观看毛片| 91 在线视频观看| 精品国产精品一区二区夜夜嗨| 女人天堂av手机在线| 国产一区二区三区三区在线观看| 欧美影院精品一区| 91美女片黄在线观看91美女| 久久精品无码一区二区日韩av|