使用Python计算TCP包中的校验和


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

http://search.aol.com/aol/search?q=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)
参考链接:
,

《 “使用Python计算TCP包中的校验和” 》 有 2 条评论

  1. 一个多线程工具,用于从网卡/PCAP文件中嗅探TCP流的统计信息和内嵌的HTTP头。携带HTTP信息的每个TCP流都以json格式导出至文本文件(A multi-threading tool to sniff TCP flow statistics and embedded HTTP headers from PCAP file. Each TCP flow carrying HTTP is exported to text file in json format.)
    https://github.com/caesar0301/http-sniffer

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注