python slice 分片(切片)

Python014

python slice 分片(切片),第1张

概念:将序列按段进行切割

语法: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/ )