tcp头
1 tcp_base_header_len = 20 2 tcp_header = body[0:tcp_base_header_len] 3 source_port, dest_port, seq, ack_seq, t_f, flags = struct.unpack(b'!HHIIBB6x', tcp_header) 4 # real tcp header len 5 tcp_header_len = ((t_f >> 4) & 0xF) * 4 6 7 pack.flags = flags 8 pack.fin = flags & 1 9 pack.syn = (flags >> 1) & 1 10 pack.rst = (flags >> 2) & 1 11 pack.psh = (flags >> 3) & 1 12 pack.ack = (flags >> 4) & 1 13 pack.urg = (flags >> 5) & 1
其中 tcp_header_len是这样的:
在t_f中给出的是header长度占32bit的数目,也就是: 8 ==> 8x32 = 8*4*8 = 32 bytes
其中 这一位可以取值范围是 4 bit 也就是 最大 1111 = 15 * 4* 8 = 60 bytes
一般这个值是 5 也就是 20 bytes
如果出于某些目的需要改写出一个异常的 header_len数据,则可以
binary数据转 helixfy, 修改以后 unhelixfy 得到修改以后的包长信息,当然一般情况下这样做出来的packet包是错误的,可能无法在wireshark中被正确处理
1 b = binascii.hexlify(p.tcp_header) 2 # print b[25], b[24], b[26] 3 if b[24]=='8': 4 c = b[:24]+'5'+b[25:] 14 new_tcp_header = binascii.unhexlify(c)