【问题标题】:How does the OS know which network interface to use for the internet?操作系统如何知道互联网使用哪个网络接口?
【发布时间】:2026-01-18 00:50:01
【问题描述】:

我有一台带有两个网络接口的 PC:eth0 和 eth1。

eth0 - ip 为 192.168.11.X/24。

eth1 - 具有 192.168.130.X/24 的 IP。 eth1 有互联网连接。

当我尝试连接到互联网时,我的操作系统如何知道使用哪个接口?它是否遍历所有默认网关?它是否有每个接口提供的任何缓存? Windows 和 Linux 的行为有什么不同吗?

【问题讨论】:

    标签: sockets network-programming network-interface


    【解决方案1】:

    我将回答房子的 Linux 方面(至少对于基于 Debian 的系统,例如 Ubuntu,因为此时它对用户来说更常见):

    在命令行中输入以下内容:

    route -n
    

    您应该会看到您的“路由表”出现,如下所示:

    Destination    Gateway          Genmask         ...    Iface
    0.0.0.0        192.168.11.254   0.0.0.0         ...    eth0
    169.254.0.0    0.0.0.0          255.255.0.0     ...    eth0
    192.168.11.0   0.0.0.0          255.255.255.0   ...    eth0
    192.168.130.0  0.0.0.0          255.255.255.0   ...    eth1
    

    我省略了几列,但基本上,“目的地”下的“0.0.0.0”行是确定默认路线所在位置的行。换句话说,所有流量都不会流向其他线路中的任何其他子网(google.com、facebook.com 等)。

    如果不正确(如上表,其中“eth1”是你要上网的网卡),你应该改变默认路由:

    sudo route del default
    sudo route add default gw 192.168.130.254 netmask 255.255.255.0
    

    现在可以解决它。要使其永久化,请编辑您的接口文件:

    sudo gedit /etc/network/interfaces
    

    将其编辑为如下所示(根据您的具体情况进行更改):

    auto eth0
    iface eth0 inet dhcp
    up route del default
    
    auto eth1
    iface eth1 inet dhcp
    up route add default gw 192.168.130.254 netmask 255.255.255.0
    

    然后重新启动网络以查看是否成功:

    sudo /etc/init.d/networking restart
    

    【讨论】:

      【解决方案2】:

      您要询问的功能是路由表,即主机已知的目的地列表。

      当操作系统需要转发数据包时,它会检查此列表并选择最合适的一个(从特定目的地到一般目的地)。例如:

      192.0.2.0/28    - 192.0.2.1 via eth1
      198.51.100.0/27 - 198.51.100.1 via eth0
      0.0.0.0/0       - 203.0.113.1 via eth0
      

      注意最后一个目的地:它将匹配任何 IPv4 地址。

      【讨论】:

      • 但是当电脑第一次打开并尝试连接到互联网时会发生什么?它不知道哪个 eth 提供对互联网的访问。它是否遍历接口并在成功时将信息放入路由表中?谢谢。
      • @UriH 它需要用户或路由协议的某种形式的配置。它不会随机尝试路由数据包。
      • 谢谢,我通过删除默认路由并重新启动 eth1 进行了检查,然后我看到添加了默认路由,我假设是因为 DHCP 请求包含路由器选项。跨度>
      最近更新 更多