【问题标题】:UDP packet sent to a multicast destination is sent via the loopback interface发送到多播目标的 UDP 数据包通过环回接口发送
【发布时间】:2017-02-25 00:20:10
【问题描述】:

我正在运行 Windows 10。 我最近诊断出我的计算机存在问题,发送到多播目标的任何数据包都是通过环回接口而不是“默认”接口发送的(请参阅我的冒险here)。

示例代码:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(b"herpyderp", ('224.0.0.251', 5353))

数据包仅在环回接口上可见(使用 Microsoft Message Analyzer 进行嗅探)。

我尝试通过route print检查路由表,得到如下输出:

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      10.0.10.138       10.0.10.30     35
        10.0.10.0    255.255.255.0         On-link        10.0.10.30    291
       10.0.10.30  255.255.255.255         On-link        10.0.10.30    291
      10.0.10.255  255.255.255.255         On-link        10.0.10.30    291
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    331
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    331
        224.0.0.0        240.0.0.0         On-link        10.0.10.30    291
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    331
  255.255.255.255  255.255.255.255         On-link        10.0.10.30    291
===========================================================================

您会注意到该指标表明数据包应通过我的“默认”接口发送。

然后我尝试通过 PowerShell Get-NetIPInterface cmdlet(暗示 here)检查接口指标,并得到以下输出:

ifIndex InterfaceAlias                  AddressFamily NlMtu(Bytes) InterfaceMetric Dhcp     ConnectionState PolicyStore
------- --------------                  ------------- ------------ --------------- ----     --------------- -----------
2       Ethernet 3                      IPv6                  1500              35 Enabled  Connected       ActiveStore
7       Ethernet                        IPv6                  1500               5 Enabled  Disconnected    ActiveStore
1       Loopback Pseudo-Interface 1     IPv6            4294967295              75 Disabled Connected       ActiveStore
3       isatap.home                     IPv6                  1280              75 Disabled Disconnected    ActiveStore
17      Teredo Tunneling Pseudo-Inte... IPv6                  1280              75 Enabled  Connected       ActiveStore
2       Ethernet 3                      IPv4                  1500              35 Enabled  Connected       ActiveStore
7       Ethernet                        IPv4                  1500               5 Enabled  Disconnected    ActiveStore
1       Loopback Pseudo-Interface 1     IPv4            4294967295              75 Disabled Connected       ActiveStore

您会注意到InterfaceMetric 字段似乎也表明我的数据包应该通过“默认”接口而不是环回接口发送。

通过s.setsockopt(socket.IP_MULTICAST_IF, ...) 强制套接字通过不同的接口发送数据包有效,但我不需要这样做。

您会注意到,我的主板上有两个以太网接口对应于两个网卡。当我将电缆连接到 Ethernet 而不是 Ethernet 3 时,上面的代码开始按我预期的方式运行,并且数据包是通过该接口而不是通过环回接口发送的。

发生了什么事?

【问题讨论】:

    标签: windows sockets windows-10 winsock multicast


    【解决方案1】:

    在我的 Win10 PC 上,防火墙中有一条规则:UDP 端口 5353 (mDNS) 只允许 svchost.exe 使用。这基本上意味着只有一些 Windows 服务可以使用 mDNS。您可能需要检查自己的防火墙并修改该规则 - 如果您有的话。

    【讨论】:

    • 禁用防火墙没有帮助。这不是防火墙问题,因为确实发送了数据包 - 它只是通过环回接口发送。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多