标签: ip-fragmentation

如何读取tcpdump生成的包含大UDP数据包的pcap文件并重新组装IP碎片数据包?

我想读取由 tcpdump 生成的 pcap 文件,该文件包含经过IPV4 分片的大型 UDP 数据包。原始数据包的大小约为 22000 字节。

在 C++ 中,我会使用 libtins 和它的 IPV4Reassembler。有没有办法在 Rust 中做类似的事情?

目前在 Rust 中,这是我到目前为止所写的内容:高度不完整的第一次尝试(使用 crate pnet):

use pnet::packet::{
    ethernet::{EtherTypes, EthernetPacket},
    ip::IpNextHeaderProtocols,
    ipv4::Ipv4Packet,
    udp::UdpPacket,
    Packet,
};

struct Ipv4Reassembler {
    cap: pcap::Capture<pcap::Offline>,
}

impl Iterator for Ipv4Reassembler {
    type Item = Vec<u8>;

    fn next(&mut self) -> Option<Self::Item> {
        let mut payload = Vec::<u8>::new();
        while let Some(packet) = self.cap.next().ok() {
            // todo: handle packets other than Ethernet packets
            let ethernet = EthernetPacket::new(packet.data).unwrap();
            match …
Run Code Online (Sandbox Code Playgroud)

ip networking udp rust ip-fragmentation

5
推荐指数
0
解决办法
176
查看次数

IPv6重组

RFC8200明确规定分片仅由源节点完成,而不由任何中间节点完成。它还说碎片在接收器处重新组装。我是否可以由此得出结论,重组在接收方完成,除了目的地之外没有其他节点可以重组数据包?

ipv6 ip-fragmentation

3
推荐指数
1
解决办法
796
查看次数

ip碎片有多糟糕

据我所知,当发送ip消息时,be和我的数据包目的地之间的网络路径中的每一跳都将检查下一跳的MTU是否大于我发送的数据包的大小.如果是这样,则数据包将被分段,并且两个数据包将分别发送到下一跳,仅在目的地重新组装(或者,在某些情况下,在遇到的第一个NAT路由器处).据我所知,这件事情可能非常糟糕,但我并不理解为什么.

  • 我知道如果连接往往会丢弃很多数据包,丢失一个片段意味着我必须重新发送整个数据包(这实际上是我自己想出的唯一的事情)
  • 是否有可能不会被分割,我的数据包将被丢弃?
  • 如何识别数据包片段?我可以100%确定它们会被正确重新组装吗?例如,如果我将两个相同长度的ip数据包几乎同时发送到同一个目的地,那么两个片段的可能性有多大,如AAA,BBB重新组装成ABA,BAB?

原则上,如果数据包没有被丢弃并且片段被正确地重新组装,实际上使用数据包分段似乎是一个好主意,可以节省本地带宽并避免发送越来越多的头而不仅仅是一个大数据包.

谢谢

sockets ip networking routing ip-fragmentation

2
推荐指数
2
解决办法
3057
查看次数

标签 统计

ip-fragmentation ×3

ip ×2

networking ×2

ipv6 ×1

routing ×1

rust ×1

sockets ×1

udp ×1