eth/tcp/ip 头的结构记录

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)

 

posted on 2017-03-22 12:57  js.yeyong  阅读(381)  评论(1编辑  收藏  举报

导航