Python实现UDP校验计算的一个问题

查看:379
本文介绍了Python实现UDP校验计算的一个问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

计算UDP校验和的代码如下:

def do_checksum(self, source_string):
""" Verify the packet interitity """
sum = 0
max_count = (len(source_string) / 2) * 2
count = 0
while count < max_count:
    val = ord(source_string[count + 1]) * 256 + ord(source_string[count])
    sum = sum + val
    sum = sum & 0xffffffff
    count = count + 2

if max_count < len(source_string):
    sum = sum + ord(source_string[len(source_string) - 1])
    sum = sum & 0xffffffff

sum = (sum >> 16) + (sum & 0xffff)
sum = sum + (sum >> 16)
answer = ~sum
answer = answer & 0xffff
answer = answer >> 8 | (answer << 8 & 0xff00)
return answer

UDP的校验和在计算时遇到的任何溢出都会被回卷,那么问题来了:sum = sum & 0xffffffff这条语句应该是直接把溢出舍去了?

所以这段代码对么。。。

解决方案

这段代码没有问题。
sum = sum & 0xffffffff 表示只保留sum的低32位数据,32位数据已经可以保证不会有溢出。
UDP报文的长度字段是16位,也就是最长数据为65535字节;
计算校验和时,还包含20字节的报文头(12字节的伪头部+12字节头部),所以最多计算65555字节(65535+20)的校验和;
每个字节都是最大的数据(0xff或者255),那校验和最初计算时的最大值为 65555 * 255 = ‭16716525‬ (0xFF12ED),一共才24位,所以不会溢出。

这篇关于Python实现UDP校验计算的一个问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆