IP,TCP,UDP Checksum校驗

IP數據報的校驗:

IP數據報只須要對數據頭進行校驗,步驟以下:git

  1. 將接收到的數據的checksum字段設置爲0
  2. 把須要校驗的字段的全部位劃分爲16位(2字節)的字
  3. 把全部16位的字相加,若是遇到進位,則將高於16字節的進位部分的值加到最低位上,舉例,0xBB5E+0xFCED=0x1 B84B,則將1放到最低位,獲得結果是0xB84C
  4. 將全部字相加獲得的結果應該爲一個16位的數,將該數取反則能夠獲得檢驗和checksum。

上述第2步中也能夠不用每次把進位加到低位,能夠等全部數據計算結束再將高位16個字依次加到低位,直到最後結果是兩個字節爲止,例如全部數據相加後爲0xb6e51c2a3,首先將其低位2個字節和剩餘的高位字節相加0xB6E51+0xC2A3=0xC30F4,對獲得的再次將低2個字節和剩餘的高位相加:0x30F4+0XC=0X3100程序員

TCP/UDP數據報的校驗

1、下面的圖是一個UDP的檢驗和所須要用到的全部信息,包括三個部分:github

  • UDP僞首部
  • UDP首部
  • UDP的數據部分

 

 

首先解釋下僞首部的概念,僞首部的數據都是從IP數據報頭獲取的。其目的是讓UDP兩次檢查數據是否已經正確到達目的地,只是單純爲了作校驗用的。
還有一個概念十分重要,那就是16位UDP總長度,該長度是UDP頭和數據的總長度。剩下的校驗算法和IP數據報的校驗方法一致了。 算法

例子

舉個例子來解釋該校驗方法: tcp

  1. 首先將檢驗和部分添零;
  2. 而後將TCP僞首部部分,TCP首部部分,數據部分都劃分紅16位的一個個16進制數
  3. 將這些數逐個相加,記得溢出的部分加到最低位上,這是循環加法:
     0xc0a8+ 0x0166+……+0x0402=0x9b49
  4. 最後將獲得的結果取反,則能夠獲得檢驗和位0x64B6 

下面一段代碼裏的ChecksumTcpUdp()和ChecksumIp()能夠用來檢驗以上步驟。各位程序員請自行用tcpdump截一段數據來檢驗一下。spa

https://github.com/CasperWu/Projects/tree/master/C%2B%2B/utility/srcblog

相關文章
相關標籤/搜索