使用Python計算IP、TCP、UDP校驗和


IP數據報的校驗:

IP數據報只需要對數據頭進行校驗,步驟如下:

  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數據報的校驗

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

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

 

 

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

例子

import struct


def check(data):
    sum=0
    for i in range(0,len(data),4):
        val = int(data[i:i+4],16)
        sum = sum + val
        sum = sum & 0xffffffff

    sum = (sum >> 16) + (sum & 0xffff)
    if sum > 65535:
        sum = (sum >> 16) + (sum & 0xffff)

    return 65535-sum

a = '4500003c00004000400652c00a1a1a163afb88d1'
ip_check = check(a)
print('ip_check:',hex(ip_check))



a='9bd327105919fa3e17da3cbf8018014dd59000000101080a0024a9d043dcc85d5459504520490d0a' #will
    
length = struct.pack('>H',len(a)//2).hex()
print(length)

if len(a)%4 !=0:
    a=a+'00'

b='c0a8c8010a1a1a16'+'0006'+length+a

tcp_check= check(b)
print('tcp_check:',hex(tcp_check))

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM