python统计检验的包_使用Python计算TCP包中的校验和

该文介绍了一种使用Python实现TCP/IP校验和的算法,参照了RFC1071和RFC1141中的计算方法。通过将首部和数据按16位进行二进制反码求和,计算出IP数据报的校验和。提供的Python代码示例展示了如何对给定的数据进行校验和计算。
摘要由CSDN通过智能技术生成

本文最后更新于2014年12月22日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

首先确定搜索关键字:use python to verify TCP Checksum

查看《TCP/IP详解:卷1》{Page 26}

IP数据报的“首部校验和”字段是根据IP首部计算出的校验和,它不对首部后面的数据进行计算。

ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据的校验和。

为了计算一份数据报的IP校验和,首先把校验和字段置为0。然后,对首部中每个16 bit进行二进制反码求和(整个首部看成是由一串16 bit的字组成),结果存在校验和字段中。

ICMP、IGMP、UDP和TCP都采用相同的校验和算法,尽管TCP和UDP除了本身的首部和数据外,在IP首部中还包含不同的字段。在RFC 1071中有关于如何计算Internet检验和的实现技术;在RFC 1141中有一个很有效的方法。

使用Python实现:

#!/usr/bin/env python

# coding=utf-8

import struct

data = "45 00 00 47 73 88 40 00 40 06 a2 c4 83 9f 0e 85 83 9f 0e a1"

def carry_around_add(a, b):

c = a + b

return (c & 0xffff) + (c >> 16)

def checksum(msg):

s = 0

for i in range(0, len(msg), 2):

w = ord(msg[i]) + (ord(msg[i+1]) << 8)

s = carry_around_add(s, w)

return ~s & 0xffff

data = data.split()

data = map(lambda x: int(x,16), data)

data = struct.pack("%dB" % len(data), *data)

print ' '.join('%02X' % ord(x) for x in data)

print "Checksum: 0x%04x" % checksum(data)

参考链接:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值