V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yitingbai
V2EX  ›  问与答

为什么子网掩码会影响网速?

  •  
  •   yitingbai · 2021-04-08 21:30:27 +08:00 · 4635 次点击
    这是一个创建于 1321 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近发现电脑网速很慢, 还以为路由器问题, 排查了好久, 无意中发现原来是子网掩码的导致的, 只怪大学没好好听课, 原来子网掩码会影响网速.......... , 这是啥原理呢?

    28 条回复    2021-04-10 12:04:42 +08:00
    gux928
        1
    gux928  
       2021-04-08 21:54:14 +08:00 via iPhone
    拓扑结构及设备清单也放出来看看
    yitingbai
        2
    yitingbai  
    OP
       2021-04-08 22:13:10 +08:00
    @gux928 就是家庭网络, 光猫 > 路由器 > 电脑, 啥拓扑结构, 不会弄啊
    v2020
        3
    v2020  
       2021-04-08 22:55:13 +08:00 via Android
    理论 /24 范围很小不至于,难道是因为手动指定和网关播发冲突,我在虚拟内网掉速这个问题看到你这个突然想到了,还有种网卡缺陷类似 i217 -*之类
    yitingbai
        4
    yitingbai  
    OP
       2021-04-08 23:10:54 +08:00
    @v2020 255.255.0.0 也不会影响网速, 只有 255.255.255.255 会影响, 简单百度了一下, 也没找到类似的解释, 而且只影响上传速度, 下载不影响, 网络延迟也正常
    weyou
        5
    weyou  
       2021-04-08 23:18:45 +08:00 via Android   ❤️ 19
    猜想你的 librespeed 服务一定是架在本地内网的。

    上图中全 255 的掩码,所有的数据包都会发送给网关,由网关的 cpu 进行中转,速度受限于网关的处理能力。

    下图中,因为测速服务器在子网中,本地可以直接通过 arp 获取到服务器 mac 地址,发出的数据包会直接由交换机芯片直接中转,效率比 cpu 处理高很多。
    Lemeng
        6
    Lemeng  
       2021-04-08 23:30:14 +08:00
    真没研究过,了解了
    sujin190
        7
    sujin190  
       2021-04-08 23:31:28 +08:00
    @weyou #5 正解了,这也是下行不受影响的原因,可以抓包看看链路层信息就更清楚了
    yitingbai
        8
    yitingbai  
    OP
       2021-04-09 00:12:58 +08:00
    @weyou 测速网站确实在内网, 受教了
    ysc3839
        9
    ysc3839  
       2021-04-09 00:16:37 +08:00 via Android
    @weyou 借楼问一下,/32 的子网掩码不是代表同一网段内没有其他设备吗?那怎么发给网关的?按理说网关也得在同一子网内吧?

    搜索了一下,这里 https://networkengineering.stackexchange.com/a/11036 也说:
    A more appropriate way to do things would be to set your device IP to 10.0.0.2, your gateway to 10.0.0.1, and your subnet mask to 255.255.255.252.
    LinePro
        10
    LinePro  
       2021-04-09 00:17:04 +08:00
    @weyou #5 有个问题,子网掩码是 255.255.255.255 的话,按计算机网络知识正常来讲主机并不知道如何能够与网关互联。但为什么这里可以?
    muzuiget
        11
    muzuiget  
       2021-04-09 01:34:02 +08:00
    子网掩码无非就是定义一个 IP 范围而已,九成就是网络程序自己的问题。
    XiaoxiaoPu
        12
    XiaoxiaoPu  
       2021-04-09 01:49:49 +08:00   ❤️ 1
    @LinePro
    @ysc3839

    子网和网关是独立的。对于主机来说,子网、网关分别对应路由表里两条路由。举个例子:

    default via 192.168.1.1 dev eth0
    192.168.1.0/24 dev eth0

    第一条是网关对应的路由,第二条是子网对应的路由。

    子网掩码是 255.255.255.255 ,其实就是没有第二条路由。但是设置了网关,第一条路由就有的。
    ch2
        13
    ch2  
       2021-04-09 02:19:48 +08:00 via iPhone
    32 位子网,只能靠网关中转发 ip 包,24 位子网就不需要网关代劳了,子网内部可以直接发包
    lcdtyph
        14
    lcdtyph  
       2021-04-09 02:24:20 +08:00   ❤️ 2
    @ysc3839 #9
    网关不必在同一子网,典型的例子是 ipv6 的 link-local 地址。
    在路由阶段网关的 ip 只是用来在 arp 过程中获取下一跳的 mac 地址,因此内核只需要知道应该从哪个 interface 广播 arp request 就可以了。
    AllenHua
        15
    AllenHua  
       2021-04-09 08:53:43 +08:00   ❤️ 3
    子网掩码的作用是划分 IP 地址中哪一部分是网络号(区分哪些 network ),哪一部分是主机号(区分哪些主机)的 (回想起谢希仁计算机网络……),用来区分 ip 地址在这个私网内属于哪个网段

    而且子网掩码的高位的 1 必须连续,低位的 0 也必须连续,常用的也就是 24 位掩码,255.255.255.0 ( 32bit binary,the high 24 bit is all 1 and the low 8 bit is all 0 )

    掩码必须和 IP 地址一起使用,掩码和 IP 地址的二进制数字进行「按位与」的运算,计算得出这个 IP 地址所属的 network 是哪个(可以区别其他 network ),host 是哪个(具体主机是哪个)

    图一的 32 位 掩码,也就是 255.255.255.255 ,任何 32 bit 二进制数和他进行与操作之后还是本身,也就是 32 位全是网络号,没有空间区分主机号。这表示网络只有一个 IPv4 地址,所有流量都将直接在具有该 IPv4 地址的设备和默认网关之间进行。 该设备将无法与网络上的其他设备进行通信。

    于是当掩码是 32 时,路由器那边的 cpu 负担过重。而如果是 24 位掩码,其中的很多运算就在其他网络上进行了计算。

    可以说一个网络就包含一个路由器。
    AllenHua
        16
    AllenHua  
       2021-04-09 09:16:02 +08:00
    @AllenHua #15 楼主的 mac 获取 ipv4 地址是手动配置的

    子网掩码配置成 32 位,路由器是 192.168.199.1

    这样你的 mac 发出去的数据包,请求的压力就全在这台路由器上(也就是网关)

    而 LibreSpeed 的服务器 ip 是 192.168.199.50 这样子的吧
    AllenHua
        17
    AllenHua  
       2021-04-09 09:18:35 +08:00
    @AllenHua #16 没仔细看图,你的 LibreSpeed 的服务器 ip 是 192.168.199.101 🐶️

    顺便问问楼主这是 mac 什么客户端?
    shutan
        18
    shutan  
       2021-04-09 09:25:06 +08:00
    带宽好大啊!
    AllenHua
        19
    AllenHua  
       2021-04-09 09:51:29 +08:00
    @shutan #18 人家这是局域网,千兆内网都能达到的
    x86
        20
    x86  
       2021-04-09 09:57:11 +08:00
    @weyou #5 牛皮牛皮,学习了
    rationa1cuzz
        21
    rationa1cuzz  
       2021-04-09 10:11:34 +08:00
    学习了
    LinePro
        22
    LinePro  
       2021-04-09 10:14:37 +08:00   ❤️ 1
    @XiaoxiaoPu #12 @lcdtyph #14 拿 Windows 测试了一下,确实是这个逻辑,受教了,感谢。不过 IPv6 的 link-local 地址不是默认子网前缀长度是 10 吗?那应该算同一子网吧?
    yitingbai
        23
    yitingbai  
    OP
       2021-04-09 11:36:56 +08:00
    @AllenHua 不是啥客户端, 就是一个开源测速 web 项目 https://github.com/librespeed/speedtest, 局域网内搭建, 用来测试局域网速度非常方便
    lcdtyph
        24
    lcdtyph  
       2021-04-09 11:42:20 +08:00 via iPhone   ❤️ 1
    @LinePro
    不是说默认子网前缀是 10,是 fe80::/10 这个网段的地址都是 link-local 地址,本地单播实际上前缀是 64 。
    拿这个例子是想说,当时用 ipv6 全局地址通信的时候,网关可以使用与通信地址不在同一网段的链路地址。
    AllenHua
        25
    AllenHua  
       2021-04-09 11:53:16 +08:00
    @yitingbai #23 嗯嗯

    我后来搜了下 librespeed 没有客户端的 就是网页

    ![20210409115131.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210409115131.png)

    我也搞了个,但是可能受限于 这台机器的 CPU (上古神器 intel P8600 )性能不够 千兆没有跑满
    Telegram
        26
    Telegram  
       2021-04-09 13:04:45 +08:00
    @weyou #5 一个是菜鸟驿站,一个是京东送货上门,这比喻差不多吧
    weyou
        27
    weyou  
       2021-04-09 16:18:29 +08:00   ❤️ 2
    @ysc3839
    @LinePro

    网关必须要在某个子网中的目的是为了能够通过广播 arp 拿到网关的二层地址(子网划分了广播域), 如果某种路由的网关可以直接去查询二层地址, 那就没有这个限制.

    默认路由的网关就是这个特殊的存在. 比如 Linux 上网络地址是 default 的路由, 在 Windows 上 metric 标记为 Default 的路由. 这个网关的优先级是最低的, 所有其他路由没有匹配到的地址才会走这条路由的网关. 主机是会直接使用 ARP 查询这个网关的二层地址, 而不会管这个地址在其他的路由中是否可达.
    julyclyde
        28
    julyclyde  
       2021-04-10 12:04:42 +08:00
    一本正经的胡说八道
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3514 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 04:43 · PVG 12:43 · LAX 20:43 · JFK 23:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.