この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。RFC 4291とMicrosoft LearnのSocket API、既存Daily-Code-Samplesを確認し、外部ネットワークを使わず::1だけでIPv6 TCPを観察する形に整理しています。
検証ステータス:📘 公式情報確認済み・Windows実機未確認
IPv6は外部ネットワークがなくても、自分のPCのloopbackアドレス ::1 で試せます。IPv4の 127.0.0.1 と同じように、サーバーとクライアントを1台のPC内で動かし、endpoint表記やAddressFamilyの違いを観察できます。
まず動かす
今回の成功条件は 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 loopbackはIPv6 Addressing Architectureで ::1 と定義されています。
ここを見る
出力されるendpointが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設定です。
1か所変えてみる
ポートだけ 48061 から 48062 へ変えて再実行します。
完全版サンプルは -Port 引数を持つため、次のように比較できます。
.\Test-Ipv6LoopbackTcp.ps1 -Port 48062
アドレスやDualModeを同時に変えず、まずポートだけ変えると「何を変えた結果なのか」が追いやすくなります。
DualModeをfalseにする理由
今回のSmoke TestはIPv6そのものを観察したいため、listenerを DualMode = $false にしています。DualModeはIPv6 socketがIPv4も扱う構成と関係するため、最初から混ぜると観察対象が増えてしまいます。
仕事で使うなら
localhostで動いたことは、外部IPv6通信が利用できることの証明にはなりません。実運用では次も別に確認します。
OS/NICでIPv6が有効か
DNSのAAAAレコード
Firewall
listen address
dual-stack方針
IPv4-mapped addressの扱い
また、Socket/Streamは例外時にも Dispose() / Stop() できるよう try/finally にするのが安全です。完全版は後始末まで含めています。
GitHubサンプル
公式情報・一次情報
まとめ
::1 を使えば、IPv6 TCPを1台のPC内だけで安全に試せます。まずIPv6専用Socketで往復を確認し、その後にDualModeやDNSへ進むと、IPv4との違いを段階的に理解できます。
