如果系统启用了IPv6 dual-stack支持,Go的net.Listen函数就能同时处理IPv4和IPv6流量

在 Go 的 net/http 包中,地址格式”:8091″(即不指定 IP,只指定端口)会尝试监听所有可用网络接口,包括 IPv4 和 IPv6。这不是只监听 IPv4,而是依赖于系统的网络栈配置。

Go 的 net.Listen("tcp", ":8091")(这是 ListenAndServe 函数内部调用的)会优先解析为 IPv6 地址 [::]:8091,如果系统启用了 IPv6 dual-stack 支持(即 IPv6 套接字可以接受 IPv4 连接),它会同时处理 IPv4 和 IPv6 流量。这被称为 “IPv4-mapped IPv6 addresses”。

但是,如果你的系统:
● 未启用 IPv6(例如,内核模块未加载,或 /proc/sys/net/ipv6/conf/all/disable_ipv6 设置为 1(可以cat它看看))。
● 或者系统配置了 net.ipv6.bindv6only = 1(Linux 下检查 /proc/sys/net/ipv6/bindv6only(可以cat它看看))

则 IPv6监听不会fallback到 IPv4,导致实际只监听 IPv6,导致浏览器访问http://[::1]:8091/能正常访问到首页,访问http://localhost:8091/也能正常访问到首页,但是访问
http://127.0.0.1:8091/报错:

无法访问此网站
连接已重置。
请试试以下办法:
检查网络连接
检查代理服务器和防火墙
运行 Windows 网络诊断
ERR_CONNECTION_RESET

在实践中,许多开发环境(如 Windows、macOS 或某些 Linux 发行版)默认启用 dual-stack,所以它应该同时监听 IPv4 和 IPv6。

要确认实际监听情况,你可以用命令行工具检查:

● Linux/macOS运行:

ss -tuln | grep 8091 或 netstat -tuln | grep 8091

如果显示:

tcp6   0   0   :::8091   :::*   LISTEN

则支持 IPv6,如果只显示:

tcp   0   0   0.0.0.0:8091   0.0.0.0:*   LISTEN

则只支持 IPv4。

● Windows运行:netstat -ano | findstr 8091

检查系统是否启用IPv6:

● Linux:cat /proc/sys/net/ipv6/conf/all/disable_ipv6(应为 0);如果为 1,编辑 /etc/sysctl.conf 添加net.ipv6.conf.all.disable_ipv6 = 0,然后 sysctl -p 重载。
● Windows:控制面板 > 网络和共享中心 > 更改适配器设置 > 属性 > 启用 “Internet 协议版本 6 (TCP/IPv6)”。
● macOS:系统偏好 > 网络 > 高级 > TCP/IP > 配置 IPv6 为 “自动”。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注