语法:slice[(index_start):(index_end):(Step_length)]
#demo
slice = "abcdefg"
print(slice[0,2]) 输出结果 "ab" ,步长为空时默认为1,取0~2之间的数字,不包含2,即[0,2)
print(slice[0:6:2]) 输出结果 "ace" ,Step_length为2说明每2个2个的取值
print(slice[:]) 输出结果 "abcdefg"
print(slice[3:]) 输出结果 "defg"
print(slice[:3]) 输出结果 "abc"
print(slice[-5,-2]) 输出结果 "cde" ,当index_start和index_end为负数时,分片切割是从后往前取值(最后一个字符下标为-1)
实验拓扑如下,linux向R2发送IP分片,并在R2接口上抓包。
ICMP包校验和是连通头部信息加数据本身一起进行校验(ip包只需要校验头部信息)而Scapy自动添加ICMP校验和时只会计算第一分片的数据,当三个分片到达目标主机进行重组后校验不通过,将重组后的数据包丢弃;因此在手动设置IP分片时,需要手动将校验和添加入ICMP首部中。
由于手动计算校验和过程较复杂,可通过wireshark抓包,可以获取到正确的校验和。
抓包结果如下,由于单个数据包长度超过MTU,系统自动将ICMP request包分片发送,同样的ICMP reply系统也进行了分片。
当主机发送分组的长度超过MTU又不可以分片(IP flags位DF置1),则这个分组丢弃,并用ICMP差错报文向主机报告。
参考:( https://fasionchan.com/network/ip/fragmentation/ )