我用替罪羊通过ICMP发送数据。我需要发送图像和其他文件通过ICMP使用替罪羊。我能够在ICMP中发送简单的字符串。我如何发送图像和其他文件?
发布于 2014-03-18 17:12:10
我不知道替罪羊,所以我的答案是算法和直蟒蛇。
为了发送图像文件,您需要将图像分解成块,请记住,您需要有一些机制来跟踪块发送的顺序。
要开始,请将图像文件读入二进制文件。然后,根据二进制数据应该被划分的数量来决定。鉴于MTU为1500,我建议1500 - IP报头- ICMP报头,或1472,以避免IP碎片。此外,我建议使用16位或32位数字来跟踪发送块的顺序,并从1500中减去。示例: 1500 - IP - ICMP -4= 1468.
使用上面的例子,我会像这样分解图像:
image = file("/path/to/file","rb").read()
chunk = []
interval = 1500 - 20 - 8 - 4
for n in range(0, len(image), interval):
chunk.append(image[n:n + interval])对于现在的图像块,我会将跟踪字节添加到每个块中。它可以是前缀,也可以是后缀,你的选择。我选择了前缀:
for n in range(len(chunk)):
chunk[n] = struct.pack(">I", n) + chunk[n]现在我们已经标记了用于跟踪的块,我们需要构建ICMP头,并附加每个块。但是我们使用哪种类型/代码呢?在本用例中,我们将构建回送请求包(其他类型(如0或3)是未经请求的,可能导致接收内核不将数据包转发到ICMP套接字处理程序)。另外,需要注意的一点是:您需要校验和代码来计算ICMP校验和
icmp_chunks = []
for img_piece in chunk:
icmp = struct.pack(">BBHHH%ds" % len(img_piece), 8, 0, 0, 0, 0, img_piece)
icmp = struct.pack(">BBHHH%ds" % len(img_piece), 8, 0, cksum(icmp), 0, 0, img_piece)
icmp_chunks.append(icmp)要重申,请注意第二个icmp头包中的cksum(icmp)参数。此校验和是必需的,否则接收内核可能不会将数据包转发到任何ICMP套接字处理程序(如果不正确)。还要注意第4和第5个参数为0:这些是“标识符”和“序列号”字段。通常,它们用于存储进程ID和增量数字(分别)。套接字对象这样做是为了跟踪哪个套接字发送了什么以及由多少个套接字发送。在这个用例中,由于我们发送的是未经请求的回显答复,所以可以将接收端编码为查找0类型,并在发送的块中进一步查找跟踪字节。因此,现在我将标识符和序列字段保留为零。如果您想知道我为什么要构造两个icmp报头,那是因为内核将正确计算的校验和建立在初始校验和字段为零的基础上。
此时,我们有icmp报头,并准备发送:
for i in icmp_chunks:
[socket].sendto(i, ("hostname-or-ip", 0))我假定套接字对象不是替罪羊,就是你自己的套接字对象。
在接收端,您将读取数据并查找图像有效载荷,将每个有效负载重新构造为其原始顺序。但是,您仍然需要一些方法来确定所有接收到的块是否都是它们。在发送图像块之前,可能会考虑如何构造一个指示总预期大小的初始字节序列。
希望这能有所帮助。
更新:我测试了向Ubuntu发送非请求类型0数据包的情况,并注意到接收内核做了而不是,将包传递给我的处理程序。所以我修改了我的解释来解释这件事。
发布于 2014-03-16 11:29:08
我想你已经发现了互联网发明者开发TCP的原因。ICMP数据包中的有效载荷大小是有限制的。大多数网络对以太网数据包的大小都有1500字节的总限制,因此对于20字节的IP报头和8字节的ICMP报头,单个数据包中的最大有效载荷大小将为1472个字节。对于许多图像文件来说,这是不够的。
您需要一种方法来将您的图像数据流分解成类似大小的块,以多个ICMP数据包发送它们,并将它们重新组装到接收器上的数据流中。
考虑到不能保证ICMP数据包按顺序接收,实际上也不能保证它们都会按顺序接收,因此您需要在各个数据包中放置某种序列号,这样就可以按顺序重新组装它们。您还可能需要一些超时逻辑,这样您的接收机器就可以知道数据包丢失了,因此图像永远不会完成。
RTP和TCP是实现这一目的的两种IP协议。它们被详细地记录下来,您可以从这些文档中学习如何做您想要做的事情,以及其中的一些缺陷和性能影响。
https://stackoverflow.com/questions/22436119
复制相似问题