Checksum算法(累加校驗(yàn)和)

校驗(yàn)和計(jì)算:

1匆赃、校驗(yàn)數(shù)據(jù)以16bit為單位進(jìn)行累加求和淤毛,校驗(yàn)數(shù)據(jù)需為偶數(shù)字節(jié),奇數(shù)字節(jié)末尾填充0變?yōu)榕紨?shù)字節(jié)算柳。
2低淡、如果累加和超過16bit,產(chǎn)生了進(jìn)位瞬项,需將高16bit和低16bit累加求和蔗蹋。
3、循環(huán)步驟2囱淋,直至未產(chǎn)生進(jìn)位為止猪杭。
4、累加和取反得到校驗(yàn)和妥衣。

校驗(yàn)和驗(yàn)證

1胁孙、校驗(yàn)數(shù)據(jù)16bit為單位進(jìn)行累加求和,校驗(yàn)數(shù)據(jù)需為偶數(shù)字節(jié)称鳞,奇數(shù)字節(jié)末尾填充0變?yōu)榕紨?shù)字節(jié)。
2稠鼻、如果累加和超過16bit冈止,產(chǎn)生了進(jìn)位,需將高16bit和低16bit累加求和候齿。
3熙暴、循環(huán)步驟2,直至未產(chǎn)生進(jìn)位為止慌盯。
4周霉、累加和和校驗(yàn)和相加得到0xffff,校驗(yàn)成功亚皂,否則失敗俱箱。

一個(gè)簡單的例子

image.png

對于上圖的例子,發(fā)送數(shù)據(jù)7灭必、11狞谱、12乃摹、0、6跟衅,五位數(shù)據(jù)孵睬。
發(fā)送時(shí)的校驗(yàn)和計(jì)算(左邊)
1)上面是最簡單的例子,7伶跷、11掰读、12、0叭莫、6為奇數(shù)位蹈集,所以末尾補(bǔ)充0。求和得到了36=100100
2)100100 超過了16食寡,需要把高位10和低位0100進(jìn)行累加雾狈,即得到了0110
3)已無進(jìn)位,無需循環(huán)抵皱,執(zhí)行4
4)0110取反為1001 十進(jìn)制為9善榛,即發(fā)送的數(shù)據(jù)為7、11
12呻畸、0移盆、6、9

接收時(shí)的校驗(yàn)和驗(yàn)證(右邊)
1)對接收到的數(shù)據(jù)7伤为、11
12咒循、0、6绞愚、9叙甸,為偶數(shù)位無需補(bǔ)0,直接求和為45=101101
2)101101 超過了16位衩,需要把高位10和低位1101 進(jìn)行累加裆蒸,即得到了1111
3)已無進(jìn)位,無需循環(huán)糖驴,執(zhí)行4
4)1111取反為0000 為0僚祷,即校驗(yàn)成功,數(shù)據(jù)為正確數(shù)據(jù)

另一個(gè)例子

如計(jì)算下面一段數(shù)據(jù)的checksum贮缕,數(shù)據(jù)為16進(jìn)制辙谜;

45 00 00 3c 00 00 00 00 40 11 \color{red}{6d} \color{red}{36} c0 a8 2b c3 08 08 08 08 11

紅色的6d 36為checksum字段,先把checksum設(shè)0感昼,數(shù)據(jù)分組装哆,補(bǔ)0,整理完后數(shù)據(jù)如下,中間checksum設(shè)置為0烂琴,最后補(bǔ)1byte 0爹殊;

4500 003c 0000 0000 4011 \color{red}{0000} c0a8 2bc3 0808 0808 1100

計(jì)算:4500+003c+0000+0000+4011+\color{red}{0000}+c0a8+2bc3+0808+0808+1100 = 192C8
高低16bit相加: 1 + 92C8 = 92C9
取反: ~92C9 = 6D36
最后所得數(shù)據(jù)為:45 00 00 3c 00 00 00 00 40 11 \color{red}{6d} \color{red}{36} c0 a8 2b c3 08 08 08 08 11

對應(yīng)代碼如下:

static u16_t chksum(void *dataptr, u16_t len)//只演示checksum累加的過程
{
  u32_t acc;
  u16_t src;
  u8_t *octetptr;
 
  acc = 0;
  octetptr = (u8_t*)dataptr;
  while (len > 1) {
    src = (*octetptr) << 8;
    octetptr++;
    src |= (*octetptr); //補(bǔ)足兩個(gè)字節(jié)長度
    octetptr++;
    acc += src;
    len -= 2;
  }
  if (len > 0) {
    src = (*octetptr) << 8;
    acc += src;
  }
 
  acc = (acc >> 16) + (acc & 0x0000ffffUL);
  if ((acc & 0xffff0000UL) != 0) {
    acc = (acc >> 16) + (acc & 0x0000ffffUL);
  }
 
  src = (u16_t)acc;
  return ~src;//取反
}

UDP校驗(yàn)和原理

UDP校驗(yàn)數(shù)據(jù)范圍

范圍:UDP偽首部(12字節(jié)) + UDP首部(8字節(jié)) + UDP負(fù)載數(shù)據(jù)

image.png

詳情參考網(wǎng)絡(luò)編程(六)UDP詳解

接收方和發(fā)送方都遵守該約定。

發(fā)送方UDP校驗(yàn)和計(jì)算

1奸绷、填充偽首部梗夸。
2、UDP首部校驗(yàn)和清零号醉。
3反症、校驗(yàn)數(shù)據(jù)按照校驗(yàn)和原理計(jì)算出校驗(yàn)和。
4畔派、填充校驗(yàn)和至UDP首部校驗(yàn)和字段铅碍。

接收方UDP校驗(yàn)和驗(yàn)證

1、接收方接收UDP數(shù)據(jù)報(bào)文(含UDP頭部)线椰。
2胞谈、填充偽首部。
3憨愉、校驗(yàn)數(shù)據(jù)按照校驗(yàn)和原理校驗(yàn)烦绳,滿足累加和為0xffff,校驗(yàn)成功配紫。

思考:為什么發(fā)送方校驗(yàn)數(shù)據(jù)(UDP首部校驗(yàn)和)為0径密,而接收方校驗(yàn)數(shù)據(jù)(UDP首部校驗(yàn)和)已填充校驗(yàn)和,雙方校驗(yàn)數(shù)據(jù)不一樣躺孝,不會(huì)出錯(cuò)嗎享扔?

其實(shí)接收方是把計(jì)算累加和和校驗(yàn)和驗(yàn)證兩個(gè)步驟合成了一個(gè)步驟,可以理解為接收方先計(jì)算校驗(yàn)數(shù)據(jù)(UDP首部校驗(yàn)和為0)的累加和植袍,再把累加和UDP校驗(yàn)和相加惧眠。

image.png

如上圖,發(fā)送時(shí)UDP校驗(yàn)和計(jì)算
1)填充偽首部于个,1byte為8bit锉试,即2byte為16bit,按照規(guī)則览濒,偽首部12byte每行為4byte,即每行繼續(xù)拆分為兩部分拖云,拆分為153.19贷笛,即153和19表示為16進(jìn)制為10011001 00010011 。以此類推宙项,可以推導(dǎo)出上圖所示數(shù)據(jù)
2)校驗(yàn)和為0無需清除
3)求和為10010110 11101101 剛好是16bit乏苦,無需循環(huán),直接求反,即校驗(yàn)和為01101001 00010010

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汇荐,一起剝皮案震驚了整個(gè)濱河市洞就,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掀淘,老刑警劉巖旬蟋,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異革娄,居然都是意外死亡倾贰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門拦惋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匆浙,“玉大人,你說我怎么就攤上這事厕妖∈啄幔” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵言秸,是天一觀的道長软能。 經(jīng)常有香客問我,道長井仰,這世上最難降的妖魔是什么埋嵌? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮俱恶,結(jié)果婚禮上雹嗦,老公的妹妹穿的比我還像新娘。我一直安慰自己合是,他們只是感情好了罪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聪全,像睡著了一般泊藕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上难礼,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天娃圆,我揣著相機(jī)與錄音,去河邊找鬼蛾茉。 笑死讼呢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谦炬。 我是一名探鬼主播悦屏,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼节沦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了础爬?” 一聲冷哼從身側(cè)響起甫贯,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎看蚜,沒想到半個(gè)月后叫搁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡失乾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年常熙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碱茁。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡裸卫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纽竣,到底是詐尸還是另有隱情墓贿,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布蜓氨,位于F島的核電站聋袋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏穴吹。R本人自食惡果不足惜幽勒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望港令。 院中可真熱鬧啥容,春花似錦、人聲如沸顷霹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淋淀。三九已至遥昧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朵纷,已是汗流浹背炭臭。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袍辞,地道東北人鞋仍。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像革屠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容