V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Aaron7Amelia
V2EX  ›  程序员

有没有可能跳过 ip 层 mtu 的限制进行发包

  •  
  •   Aaron7Amelia · 2023-02-26 10:58:01 +08:00 · 2707 次点击
    这是一个创建于 647 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我记得我在哪看到过,mtu 这个限制是在 ip 层处理的,这实际上是一个 “软性”限制。按照正常的收发网络包的流程来看,肯定要经过内核协议栈,那么必定会被 ip 层处理。ip 层看到包太大,就会分包

    那么我的数据包要是不走内核协议栈,比如像 DPDK 这样的技术,我是不是就可以绕过 MTU 的限制,直接将一个大包交给网卡,由网卡发出去

    不知道这样理解对不对
    18 条回复    2023-02-27 19:53:17 +08:00
    choury
        1
    choury  
       2023-02-26 11:16:13 +08:00
    发出去肯定没问题啊,直接操作驱动,但是发出去之后呢?这条链路上的所有设备处理这个包的时候都是要过 ip 协议栈的,遇到了都会丢掉的,还是说你能掌控这个链路上的所有设备?
    mxi1
        2
    mxi1  
       2023-02-26 11:36:10 +08:00
    可以发出去,但受限于整个传输链路上的中间节点(路由器、交换机)的配置,极大概率都会被丢掉。
    如果你有一个可控的网络环境,可以配起来看看,内核协议栈也可以通过 offloading 的方式来绕过 MTU 的限制。
    Songxwn
        3
    Songxwn  
       2023-02-26 11:40:10 +08:00
    那是以太网也有限制的
    hhhsuan
        4
    hhhsuan  
       2023-02-26 11:49:06 +08:00 via Android
    可以直接调网卡驱动的接口
    leonshaw
        5
    leonshaw  
       2023-02-26 11:49:11 +08:00 via Android
    直接把 MTU 改大不就行了
    nightwitch
        6
    nightwitch  
       2023-02-26 12:12:55 +08:00 via Android
    mtu 的限制不仅在你的机器上,而是在链路的所有机器上。
    msg7086
        7
    msg7086  
       2023-02-26 12:46:17 +08:00
    可以发,并且在一毫秒后被其他设备扔掉……
    iX8NEGGn
        8
    iX8NEGGn  
       2023-02-26 13:03:22 +08:00 via iPhone
    看来计算机网络学得不是深刻
    hxysnail
        9
    hxysnail  
       2023-02-26 13:03:33 +08:00
    首先,MTU 不是 IP 层的限制,而是链路层的限制,可以理解成链路层一帧能够传输的数据量: https://fasionchan.com/network/ethernet/mtu/

    其次,IP 包到达目的 IP 前通常会经过多跳,链路上的网络设备传输能力千差万别,根据木桶原理,由传输能力最弱的节点决定,就算你的设备比较强大,将 MTU 调大也没用。

    最后,IP 包其实也可以分片: https://fasionchan.com/network/ip/fragmentation/ ,不过有些设备可能不支持,因为这个特性很鸡肋,只要其中有一个分片丢了就得全部重传;而且分片重组也有很多开销
    DefoliationM
        10
    DefoliationM  
       2023-02-26 13:14:32 +08:00 via Android
    网络运营商给你全丢了,而且包越大传输中越可能受到干扰,越不稳定,没必要
    Kunmona
        11
    Kunmona  
       2023-02-26 13:29:03 +08:00 via Android
    MTU 是针对数据链路层的概念,数据包过大会非常不利于传输,还会增大数据延迟,IP 层也有分片功能去针对大数据包的场景。实在要用也可以设置巨帧的方法,但路由器交换机需要支持,双方接口也需要额外设置,巨帧也一般用在局域网中,没哪个运营商会接收巨帧,这会大幅增加数据交换延迟。
    dialtcp
        12
    dialtcp  
       2023-02-26 17:19:23 +08:00 via Android
    一个分布式系统里的作恶节点太少了,没法实现,你得控制整条链路的节点
    blackeeper
        13
    blackeeper  
       2023-02-26 20:32:00 +08:00
    看来你对 PDU ( Protocol Data Unit )不太熟,这个是网络的对等实体传送的讯息单元,不同的网络最大 mtu 是不一样的。如果你发送了一个超过设备的 mtu ,那么设备会 DF (分片),如果设置了禁止 DF ,那么就直接丢弃了。
    你可以用 ping 命令验证,尝试加或者不加“-f”,“-f”是禁止分片,ping 192.168.1.1 -l 1800 -f

    物理层(一层) PDU 指数据位( Bit )。
    数据链路层(二层) PDU 指数据帧( Frame )。
    网络层(三层) PDU 指数据包[注 1]( Packet )或数据报( Datagram )[1]。
    传输层(四层) PDU 指数据段( Segment )。
    wheat0r
        14
    wheat0r  
       2023-02-26 21:30:35 +08:00
    你说的是不是 FCoE ?
    xuanbg
        15
    xuanbg  
       2023-02-26 22:06:13 +08:00
    你发管你发,路由器转发失败自然丢掉,对方能接收到算我输。
    cat9life
        16
    cat9life  
       2023-02-27 08:36:32 +08:00
    可以随便发,但是传输中的节点会怎么处理?
    julyclyde
        17
    julyclyde  
       2023-02-27 08:37:31 +08:00
    @blackeeper DF 是“don't 分片”的缩写吧?
    blackeeper
        18
    blackeeper  
       2023-02-27 19:53:17 +08:00
    @julyclyde 是的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1040 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:00 · PVG 04:00 · LAX 12:00 · JFK 15:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.