91av免费观看_日韩视频在线免费看_日本xxxx色视频在线观看免费_伊人222综合网图片_国产二区三区在线_91麻豆麻豆

IT之道-艾銻知道

您當前位置: 主頁 > 資訊動態(tài) > 艾銻分享 >

IP、ICMP、UDP、TCP 校驗和算法分享-IT運維


2020-06-03 20:34 作者:admin 瀏覽量:

IP、ICMP、UDP、TCP 校驗和算法分享-IT運維

 
IT運維工作,以服務為中心,以穩(wěn)定、安全、高效為三個基本點,確保公司的互聯(lián)網(wǎng)業(yè)務能夠 7×24 小時為您提供高質量的服務。
 
下面由網(wǎng)絡運維工程師為您講解專業(yè)的解決方案 
 
以前看計算機網(wǎng)絡相關的書,每次看到IP或者UDP報頭校驗和時,都一瞥而過,以為相當簡單,不就是16bit數(shù)據(jù)的相加嗎。最近在研究《TCP/IP詳解 卷1:協(xié)議》這本書,看到校驗和是16bit字的二進制反碼和(暈,以前都沒注意原來是反碼和,看來以前看書不仔細啊!罪過,罪過~~),覺得很奇怪,為什么會用反碼和,而不是直接求和呢?(因為我認為TCP/IP協(xié)議里面的算法和思想一般都是非常經(jīng)典的,人家這么做一定有原因的)下面就來探索一下這個校驗和算法具體怎么實現(xiàn)的。
 首先,IP、ICMP、UDP和TCP報文頭部都有校驗和字段,大小都是16bit,算法也基本一樣:
 在發(fā)送數(shù)據(jù)時,為了計算數(shù)據(jù)包的校驗和。應該按如下步驟:
(1)把校驗和字段置為0;   
(2)把需校驗的數(shù)據(jù)看成以16位為單位的數(shù)字組成,依次進行二進制反碼求和;   
(3)把得到的結果存入校驗和字段中。   
在接收數(shù)據(jù)時,計算數(shù)據(jù)包的校驗和相對簡單,按如下步驟:   
(1)把首部看成以16位為單位的數(shù)字組成,依次進行二進制反碼求和,包括校驗和字段;   
(2)檢查計算出的校驗和的結果是否為0;   
(3)如果等于0,說明被整除,校驗是和正確。否則,校驗和就是錯誤的,協(xié)議棧要拋棄這個數(shù)據(jù)包。
 雖然上面四種報文的校驗和算法一樣,但在作用范圍存在不同:IP校驗和只校驗20字節(jié)的IP報頭;而ICMP校驗和覆蓋整個報文(ICMP報頭+ICMP數(shù)據(jù));UDP和TCP校驗和不僅覆蓋整個報文,而且還有12字節(jié)的IP偽首部,包括源IP地址(4字節(jié))、目的IP地址(4字節(jié))、協(xié)議(2字節(jié),第一字節(jié)補0)和TCP/UDP包長(2字節(jié))。另外UDP、TCP數(shù)據(jù)報的長度可以為奇數(shù)字節(jié),所以在計算校驗和時需要在最后增加填充字節(jié)0(注意,填充字節(jié)只是為了計算校驗和,可以不被傳送)。
這里還要提一點,UDP的校驗和是可選的,當校驗和字段為0時,表明該UDP報文未使用校驗和,接收方就不需要校驗和檢查了!那如果UDP校驗和的計算結果是0時怎么辦呢?書上有這么一句話:“如果校驗和的計算結果為0,則存入的值為全1(65535),這在二進制反碼計算中是等效的。”
講了這么多,那這個校驗和到底是怎么算的呢?
業(yè):IT駐場服務 網(wǎng)絡機房綜合布線 計算機網(wǎng)絡安全維護 解決方案
1. 什么是二進制反碼求和
對一個無符號的數(shù),先求其反碼,然后從低位到高位,按位相加,有溢出則向高位進1(跟一般的二進制加法規(guī)則一樣),若最高位有進位,則向最低位進1。
首先這里的反碼好像跟我們以前學的有符號數(shù)的反碼不一樣(即正數(shù)的反碼是其本身,負數(shù)的反碼是在其原碼的基礎上,符號位不變,其余各位取反),這里不分正負數(shù),直接每個位都取反!
上面加粗的那句是跟我們一般的加法規(guī)則不太一樣的地方:最高位有進位,則向最低位進1。確實有些疑惑,為什么要這樣做呢?仔細分析一下(為了方便說明,以 4bit二進制反碼求和舉例),上面的這種操作,使得在發(fā)生加法進位溢出時,溢出的值并不是10000,而是1111。也即是當相加結果滿1111時溢出,這樣也可以說明為什么0000和1111都表示0了(你同樣可以發(fā)現(xiàn),任何數(shù)與這兩個數(shù)做二進制反碼求和運算結果都是原數(shù),這恰好符合數(shù)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)
從上面兩個例子可以看出,當加法未發(fā)生溢出時,原碼與反碼加法運算結果一樣;當有溢出時,結果就不一樣了,原碼是滿10000溢出,而反碼是滿1111溢出,所以相差正好是1。舉例只是為了形象地觀察二進制反碼求和的運算規(guī)則,至于為什么要定義這樣的規(guī)則以及該運算規(guī)則還存在其它什么特性,可能就需要涉及代數(shù)理論的東西的了(嗚嗚~~數(shù)學理論沒學好啊,只能從表面上分析分析)。
另外關于二進制反碼求和運算需要說明的一點是,先取反后相加與先相加后取反,得到的結果是一樣的!(事實上我們的編程算法里,幾乎都是先相加后取反。)
2. 校驗和算法的實現(xiàn)

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

[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位數(shù)轉換成16
while (cksum>>16)
cksum=(cksum>>16)+(cksum & 0xffff);
return (USHORT) (~cksum);
}
buffer是指向需校驗數(shù)據(jù)緩存區(qū)的指針,size是需校驗數(shù)據(jù)的總長度(字節(jié)為單位)
4~13行代碼對數(shù)據(jù)按16bit累加求和,由于最高位的進位需要加在最低位上,所以cksum必須是32bit的unsigned long型,高16bit用于保存累加過程中的進位;另外代碼10~13行是對size為奇數(shù)情況的處理!
14~16行代碼的作用是將cksum高16bit的值加到低16bit上,即把累加中最高位的進位加到最低位上。這里使用了while循環(huán),判斷cksum高16bit是否非零,因為第16行代碼執(zhí)行的時候,仍可能向cksum的高16bit進位。有些地方是通過下面兩條代碼實現(xiàn)的:cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);這里只進行了兩次相加,即可保證相加后cksum的高16位為0,兩種方式的效果一樣。事實上,上面的循環(huán)也最多執(zhí)行兩次!
17行代碼即對16bit數(shù)據(jù)累加的結果取反,得到二進制反碼求和的結果,然后函數(shù)返回該值。
專業(yè):IT機房建設 辦公大樓網(wǎng)絡布線 IT硬件設備維護外包  運維服務方案
3. 為什么使用二進制反碼求和呢?
好了,最后一個問題,為什么要使用二進制反碼來計算校驗和呢,而不是直接使用原碼或者補碼?
這個問題我想了很久,由于水平有限實在弄不明白,于是在百度上一陣狂搜,什么都沒有(不知道是百度不給力,還是大家都不關注這個問題呢?)。果斷換google,敲了3個關鍵詞:why checksum tcp,嘿嘿 結果第二篇就是我想要的文章了!!!
先把鏈接給大家吧:http://www.netfor2.com/checksum.html
這篇文章主要介紹二進制反碼求和(the 1's complement sum)與補碼求和(the 2's complement sum)的區(qū)別,另外還說明了在TCP/IP校驗和中使用反碼求和的優(yōu)點。
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ōu)點:
a. 不依賴系統(tǒng)是大端還是小端。 即無論你是發(fā)送方計算或者接收方檢查校驗和時,都不需要調用htons 或者 ntohs,直接通過上面第2節(jié)的算法就可以得到正確的結果。這個問題你可以自己舉個例子,用反碼求和時,交換16位數(shù)的字節(jié)順序,得到的結果相同,只是字節(jié)順序相應地也交換了;而如果使用原碼或者補碼求和,得到的結果可能就不相同!
以上文章由北京艾銻無限科技發(fā)展有限公司整理
 
 

相關文章

IT外包服務
二維碼 關閉
主站蜘蛛池模板: 乱色熟女综合一区二区三区 | 永久免费观看的毛片手机视频 | 色综合中文综合网 | 国产精品麻豆久久 | 特大巨黑吊xxxx高潮 | 亚洲AV色香蕉一区二区蜜桃 | 国产精品亚洲аv久久 | 亚洲精品一区久久久久 | 狼人无码精华AV午夜精品 | 91麻豆成人 | 亚洲AV无码国产综合专区 | 中国一级黄绝片 | 国产无遮挡又黄又爽网站 | 2019年手机中文字幕 | 欧美日本高清在线不卡区 | 国产人妻精品区一区二区 | 私人影院无在线码免费 | 国产肥白大熟妇bbbb | 欧美国产在线一区 | "欧美 黑人一级毛片" | 中国一级黄色片 | 伊人久久久AV老熟妇色 | 麻豆影视国产在线观看 | 四虎永久在线精品免费AV | 婷婷五月日韩AV永久免费 | 人善交VIDEOS欧美3D | 强被迫伦轩高潮无BD | 成熟人妻换XXXX | 中文字幕无码久久一区 | 熟女毛多熟妇人妻在线视频 | 国内精品免费一区二区2001 | 亚洲色欲综合一区二区三区 | 99国产精品久久久久久久床豆 | 亚洲国产精品无码久久青草 | x8x8拨牐拨牐x8免费视频8文字 | 天堂在线最新版 | 日本无码潮喷A片无码高潮 亚洲VA中文字幕不卡无码 | 久久久久亚洲AV无码观看 | 麻豆一区二区三区在线观看 | 国产V亚洲V欧美V专区 | 116少妇做爰毛片 |