关于本文
本文是通过生成式 AI 辅助的自动化流程创建的。我们参考了 RFC 4291、Microsoft Learn 的 Socket API 以及现有的 Daily-Code-Samples,并将其整理为无需外部网络、仅使用::1即可观察 IPv6 TCP 的形式。
验证状态:📘 已确认官方信息 · Windows 实机未验证
即使没有外部网络,你也可以使用自己电脑的回环地址 ::1 来尝试 IPv6。类似于 IPv4 的 127.0.0.1,你可以在同一台电脑上同时运行服务器和客户端,从而观察端点表示法和地址族的差异。
首先运行
本次的成功条件是发送 HELLO_IPV6,并收到 ACK_IPV6 返回。完整版代码已放置在 GitHub 上,正文将介绍其核心部分。
$listener = [Net.Sockets.TcpListener]::new(
[Net.IPAddress]::IPv6Loopback,
48061
)
$listener.Server.DualMode = $false
$listener.Start()
Write-Host "[LISTEN] $($listener.LocalEndpoint)"
$client = [Net.Sockets.TcpClient]::new(
[Net.Sockets.AddressFamily]::InterNetworkV6
)
$client.Connect([Net.IPAddress]::IPv6Loopback, 48061)
Write-Host "[SUCCESS] connected to $($client.Client.RemoteEndPoint)"
$client.Dispose()
$listener.Stop()
IPv6 回环在《IPv6 寻址体系结构》中被定义为 ::1。
观察这里
输出的端点不是 IPv4 的 127.0.0.1:48061,而是类似于 [::1]:48061 的形式。
sequenceDiagram
participant C as Client [::1]
participant S as Server [::1]
C->>S: TCP connect
S-->>C: accept
C->>S: HELLO_IPV6
S-->>C: ACK_IPV6
TCP 的“连接 → 发送 → 接收 → 断开”这一流程与 IPv4 大多相同,改变的主要是地址体系和 Socket 设置。
修改一个地方
仅将端口从 48061 更改为 48062 并重新运行。
由于完整版示例带有 -Port 参数,因此你可以按如下方式进行比较。
.\Test-Ipv6LoopbackTcp.ps1 -Port 48062
如果不盲目同时修改地址或 DualMode,而是先仅更改端口,就会更容易追溯“修改带来了什么结果”。
将 DualMode 设为 false 的原因
由于本次冒烟测试(Smoke Test)旨在观察 IPv6 本身,因此监听器被设为了 DualMode = $false。DualMode 涉及到 IPv6 socket 同时处理 IPv4 的配置,如果一开始就将其混合进来,会增加观察的对象。
如果在工作中实际使用
能够在 localhost 上运行并不证明可以使用外部 IPv6 通信。在实际运营中,还需要单独确认以下内容。
操作系统/网卡是否启用了 IPv6
DNS 的 AAAA 记录
防火墙
监听地址
双栈(dual-stack)策略
对 IPv4 映射地址的处理
此外,为了确保 Socket/Stream 即使在发生异常时也能 Dispose() / Stop(),使用 try/finally 是更安全的做法。完整版代码甚至包含了善后清理工作。
GitHub 示例
官方信息与第一手资料
总结
::1通过使用

