网络传输中的反码求和算法
生活随笔
收集整理的這篇文章主要介紹了
网络传输中的反码求和算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在發送數據,計算數據包的校驗和,按如下步驟:
1、把校驗和字段置為0;
2、把需校驗的數據看成以16位為單位的數字組成,依次進行二進制反碼求和;
3、把得到的結果存入校驗和字段中。
在接收數據時,計算數據包的校驗和相對簡單,按如下步驟:
1、把首部看成以16位為單位的數字組成,依次進行二進制反碼求和,包括校驗和字段;
2、檢查計算出的校驗和的結果是否為0;
3、如果等于0,說明被整除,校驗是和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個數據包。 IP,ICMP,TCP,UDP數據校驗的不同: (IP校驗和只校驗20字節的IP報頭;而ICMP校驗和覆蓋整個報文(ICMP報頭+ICMP數據);UDP和TCP校驗和不僅覆蓋整個報文,而且還有12字節的IP偽首部,包括源IP地址(4字節)、目的IP地址(4字節)、協議(2字節,第一字節補0)和TCP/UDP包長(2字節)。另外UDP、TCP數據報的長度可以為奇數字節,所以在計算校驗和時需要在最后增加填充字節0(注意,填充字節只是為了計算校驗和,可以不被傳送)。 反碼求和:對一個無符號的數,先求其反碼,然后從低位到高位,按位相加,有溢出則向高位進1(跟一般的二進制加法規則一樣),若最高位有進位,則向最低位進1。 代碼: /計算校驗和 USHORT checksum(USHORT *buffer,int size) { unsigned long cksum=0; //這里注意,其實是把數據頭部校驗和字段內存里的值也要賦值為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); }這里有一篇詳細的英文解釋,說明1的反碼求和和2的反碼求和的不同與選擇,參考http://www.netfor2.com/checksum.html
轉載于:https://www.cnblogs.com/MyselfDancing/p/3482333.html
總結
以上是生活随笔為你收集整理的网络传输中的反码求和算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js模版引擎handlebars.js实
- 下一篇: HDU-2023