首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python发送原始IP流量:检测MTU

问用Python发送原始IP流量:检测MTU
EN

Stack Overflow用户
提问于 2016-04-04 11:56:30
回答 1查看 3K关注 0票数 6

如何使用Python实现手动MTU发现?

来自:https://networkengineering.stackexchange.com/a/28988/23983

向目标发送ping,在我的示例中,我将使用Google的DNS服务器(8.8.8.8)。将ping中的DF位设置为on,以防止ping被碎片化。将您的数据包大小设置为一些大的数字,或标准的MTU 1500。注意,有些ping实现只设置有效负载的大小,这意味着您必须计算8字节的ICMP报头和20字节的IP报头。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-07 10:53:44

我想补充一下,您也可以使用原始套接字。

替罪羊是一个很好的抽象层,它为您带来了很大的魔力,但是公平地说,如果您要下降,您可以一路学习经验。(请注意,在大多数现代操作系统中,原始套接字需要更高的权限,而且随着实现的深入,Windows和Linux的实现可能有所不同。)

代码语言:javascript
复制
import socket
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))

这将为您提供一个基于原始数据包的套接字,该套接字可以为您提供所有帧。它在Windows和Linux之间略有不同,但我将在这个答案中坚持使用Linux。还请注意,如果需要该功能(嗅探功能),则所有传出数据包都可能不会被这个套接字所捕获,请考虑搜索与混杂模式相关的命中。

您现在所需要做的就是将每个数据包作为它们进入或进入的段来处理--打开以太网和IP帧看起来如下所示:

代码语言:javascript
复制
frame, meta = s.recvfrom(65565)
print(frame, meta)

ethernet = frame[0:14]
ethernet_segments = struct.unpack("!6s6s2s", ethernet)

mac_source, mac_dest = (binascii.hexlify(mac) for mac in ethernet_segments[:2])

ip = frame[14:34]
ip_segments = struct.unpack("!12s4s4s", ip)

ip_source, ip_dest = (socket.inet_ntoa(section) for section in ip_segments[1:3])

print('MAC Source:', b':'.join(mac_source[i:i+2] for i in range(0, len(mac_source), 2)))
print('MAC Dest:', b':'.join(mac_dest[i:i+2] for i in range(0, len(mac_dest), 2)))
print('IP Source:', ip_source)
print('IP Dest:', ip_dest)

考虑到您自己正在构建数据包,Payloading将是“容易的”。

无论是最传统的方式还是最初最快的方式,你都可以实现你想要的任何东西。

发送同样简单,使用结构并查看许多ICMP示例,包括那些进行校验和计算的示例:

关于MTU,这是您必须自己实现的逻辑,因为没有我所知道的预构建库。

但这是我对用Python发送原始IP通信量的贡献。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36401955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档