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这条语句应该是直接把溢出舍去了?
所以这段代码对么。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这段代码没有问题。
sum = sum & 0xffffffff 表示只保留sum的低32位数据,32位数据已经可以保证不会有溢出。
UDP报文的长度字段是16位,也就是最长数据为65535字节;
计算校验和时,还包含20字节的报文头(12字节的伪头部+12字节头部),所以最多计算65555字节(65535+20)的校验和;
每个字节都是最大的数据(0xff或者255),那校验和最初计算时的最大值为 65555 * 255 = 16716525 (0xFF12ED),一共才24位,所以不会溢出。