# -*- coding: UTF-8 -*- from scapy.layers.inet import IP, ICMP, TCP from scapy.layers.l2 import Ether import sys import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) # 清除报错 from scapy.all import * # 导入scapy模块 def mtu_one(mtu, dst): data = b‘a‘ * (mtu - 28) # result = sr1(Ether(dst=‘48-bd-3d-22-77-e0‘) / IP(flags=‘DF‘, dst=dst) / ICMP() / data, # timeout=0.2, iface=‘Intel(R) Dual Band Wireless-AC 3168‘) # result = sr1(IP(flags=‘DF‘,dst=dst) / ICMP() / data, timeout=0.2, # iface=‘Intel(R) Dual Band Wireless-AC 3168‘) # 发送第三层数据包 result = sr1(IP(flags=‘DF‘, dst=dst) / ICMP() / data, timeout=0.2) # 发送第三层数据包 # print(result.show()) try: # 如果返回数据包ICMP层的type==3,code==4则表明数据包已经超过了MTU if result.getlayer(ICMP).type == 3 and result.getlayer(ICMP).code == 4: return 1 # 如果返回数据包ICMP层的type==0,code==0则表明数据包可以成功发送,大小没有超过MTU elif result.getlayer(ICMP).type == 0 and result.getlayer(ICMP).code == 0: return 2 except: return None # -*- coding: UTF-8 -*- from scapy.layers.inet import IP, ICMP, TCP from scapy.layers.l2 import Ether import sys import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) # 清除报错 from scapy.all import * # 导入scapy模块 def mtu_one(mtu, dst): data = b‘a‘ * (mtu - 28) # result = sr1(Ether(dst=‘48-bd-3d-22-77-e0‘) / IP(flags=‘DF‘, dst=dst) / ICMP() / data, # timeout=0.2, iface=‘Intel(R) Dual Band Wireless-AC 3168‘) # result = sr1(IP(flags=‘DF‘,dst=dst) / ICMP() / data, timeout=0.2, # iface=‘Intel(R) Dual Band Wireless-AC 3168‘) # 发送第三层数据包 result = sr1(IP(flags=‘DF‘, dst=dst) / ICMP() / data, timeout=0.2) # 发送第三层数据包 # print(result.show()) try: # 如果返回数据包ICMP层的type==3,code==4则表明数据包已经超过了MTU if result.getlayer(ICMP).type == 3 and result.getlayer(ICMP).code == 4: return 1 # 如果返回数据包ICMP层的type==0,code==0则表明数据包可以成功发送,大小没有超过MTU elif result.getlayer(ICMP).type == 0 and result.getlayer(ICMP).code == 0: return 2 except: return None if __name__ == "__main__": ipaddr = "8.8.8.8" mtu = 1500 while mtu > 0: res = mtu_one(mtu, ipaddr) if res == 1 or res is None: mtu -= 1 elif res == 2: print(‘mtu: %d‘ % mtu) break if __name__ == "__main__": ipaddr = "8.8.8.8" mtu = 1500 while mtu > 0: res = mtu_one(mtu, ipaddr) if res == 1 or res is None: mtu -= 1 elif res == 2: print(‘mtu: %d‘ % mtu) break
[root@bogon ~]# python icmp_pro.py Begin emission: ...........................................Finished sending 1 packets. ........................................... Received 86 packets, got 0 answers, remaining 1 packets Begin emission: Finished sending 1 packets. .* Received 2 packets, got 1 answers, remaining 0 packets mtu: 1499
原文:https://www.cnblogs.com/dream397/p/14808750.html