路径 MTU 发现和重传

网络工程 路由 ipv4
2021-07-03 20:03:14

我目前正在阅读有关 IP 的内容,但我无法很好地理解的一件事是设置了 DF 的 IP 数据包的重传情况。

在这种情况下,我假设 PC 的直接路由器/网关同意 MTU 但不同意路径中的下一个路由器之间会发生以下情况。所以让我们假设下图 PC -> R1 -> R2。当 R2 由于数据报大于其 MTU 而拒绝该数据包时,它会丢弃该数据包并发送带有“数据包太大”加上 IP 标头的 ICMP 消息。

我的问题是:谁负责转发消息?是以前的路由器还是源(PC)?如果是这样,PC 如何知道要重新发送哪个数据报?数据报在发送后是否会在内存中保留一段时间,或者重传仅适用于 tcp-ip 数据包?

2个回答

如果 PC 收到 ICMP Fragmentation required 消息,PC 必须重新发送任何流量。通常只有 TCP 处理重传(包括 MTU 问题造成的丢失);TCP 还包括对路径 MTU 发现的支持

对于编写支持 PMTU 发现和重传的非 TCP 应用程序,PC 可以知道要重新发送哪些数据包,因为 ICMP 错误包括产生错误的数据包的上下文……这是从tshark -Vi eth0 icmp……转储下图MTU of next hop显示了这个 ICMP 消息是为了响应到 172.16.255.1(设置了 DF)的 UDP 数据包而收到的,该数据包太大。

Internet Protocol, Src: 172.16.1.1 (172.16.1.1), Dst: 172.16.1.5 (172.16.1.5)
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0xc0 (DSCP 0x30: Class Selector 6; ECN: 0x00)
        1100 00.. = Differentiated Services Codepoint: Class Selector 6 (0x30)
        .... ..0. = ECN-Capable Transport (ECT): 0
        .... ...0 = ECN-CE: 0
    Total Length: 56
    Identification: 0x6297 (25239)
    Flags: 0x00
        0.. = Reserved bit: Not Set
        .0. = Don't fragment: Not Set
        ..0 = More fragments: Not Set
    Fragment offset: 0
    Time to live: 255
    Protocol: ICMP (0x01)
    Header checksum: 0xfe46 [correct]
        [Good: True]
        [Bad : False]
    Source: 172.16.1.1 (172.16.1.1)
    Destination: 172.16.1.5 (172.16.1.5)
Internet Control Message Protocol
    Type: 3 (Destination unreachable)
    Code: 4 (Fragmentation needed)
    Checksum: 0x8813 [correct]
    MTU of next hop: 1420
    Internet Protocol, Src: 172.16.1.5 (172.16.1.5), Dst: 172.16.255.1 (172.16.255.1)
        Version: 4
        Header length: 20 bytes
        Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
            0000 00.. = Differentiated Services Codepoint: Default (0x00)
            .... ..0. = ECN-Capable Transport (ECT): 0
            .... ...0 = ECN-CE: 0
        Total Length: 1500
        Identification: 0x3aff (15103)
        Flags: 0x02 (Don't Fragment)
            0.. = Reserved bit: Not Set
            .1. = Don't fragment: Set
            ..0 = More fragments: Not Set
        Fragment offset: 0
        Time to live: 1
            [Expert Info (Note/Sequence): "Time To Live" only 1]
                [Message: "Time To Live" only 1]
                [Severity level: Note]
                [Group: Sequence]
        Protocol: UDP (0x11)
        Header checksum: 0xe0ea [correct]
            [Good: True]
            [Bad : False]
        Source: 172.16.1.5 (172.16.1.5)
        Destination: 172.16.255.1 (172.16.255.1)
    User Datagram Protocol, Src Port: 60742 (60742), Dst Port: 33437 (33437)
        Source port: 60742 (60742)
        Destination port: 33437 (33437)
        Length: 1480
        Checksum: 0xf73f [unchecked, not all data available]
            [Good Checksum: False]
            [Bad Checksum: False]

注意:这仅适用于 TCP。根据规范,流量的发起方必须保留所有流量,直到接收方确认为止。如果数据包在传输过程中丢失,则可以重新发送。如果数据包必须更小,则可以重新发送。

可以通过 UDP 来完成,但它需要应用程序来完成。(即复制 TCP 的可靠传输,此时没有理由不使用 TCP。)