はじめに(背景・目的)
本来は 異なるPC間で動作するアプリケーションがあり、
- IPアドレスを指定して
- TCP/UDP ソケットで通信する
という構成になっているケースは多いです。
しかし開発・デバッグ段階では、
- PCを複数台用意したくない
- LANケーブルを挿したくない
- 設定ファイル(IPアドレス)を極力変更したくない
という事情がよくあります。
この記事では、
1台のWindows PC上で、
あたかも「複数PCがIP指定で通信しているかのように」
ソケット通信を成立させる方法
を、なぜそれが成立するのかという理屈も含めて解説します。
結論(先に要点)
- 1つのループバックNICに複数のIPv4アドレスを割り当てる
- 各IPは
/32(255.255.255.255)で設定する - GWは不要
- OSは「宛先IPが自分の管理下か」を最優先で判定する
これにより、
- 同一PC上
- LAN未接続
- 物理NIC無効
という状態でも、IP指定ソケット通信が成立します。
想定する構成
本来の構成(実PC)
PC-A : 198.18.0.10
PC-B : 198.18.0.11
A → B : connect(198.18.0.11)
B → A : bind(198.18.0.11)
今回の仮想構成(同一PC)
1台の Windows PC
├─ 198.18.0.10 /32 (PC-A役)
└─ 198.18.0.11 /32 (PC-B役)
アプリケーションの IP 指定は そのまま です。
手順①:ループバックアダプタの追加(Windows 10 / 11)
Windows 11 では GUI から追加できないため、コマンドで行います。
Win + R
hdwwiz.exe
- ネットワークアダプター
- Microsoft
- Microsoft KM-TEST Loopback Adapter
を選択して追加します。
手順②:1つのループバックIFに複数IPを割り当てる
GUIの場合
- ループバックアダプタの IPv4 プロパティ
- 詳細設定
- IPアドレス → 追加
例:
| IPアドレス | サブネット |
|---|---|
| 198.18.0.10 | 255.255.255.255 |
| 198.18.0.11 | 255.255.255.255 |
- デフォルトゲートウェイ:設定しない
- DNS も不要
PowerShellの場合(自動化向け)
New-NetIPAddress -InterfaceAlias "Ethernet 3" -IPAddress 198.18.0.10 -PrefixLength 32
New-NetIPAddress -InterfaceAlias "Ethernet 3" -IPAddress 198.18.0.11 -PrefixLength 32
なぜ /32 なのか?(ここが一番重要)
通常の /24 の世界
192.168.1.10/24
- 同一セグメント宛 → ARP
- 別セグメント宛 → デフォルトGW必須
これは 完全に正しい理解です。
/32 の意味
198.18.0.10/32
- 同一セグメント = 自分自身のみ
- 他のIPはすべて「別ネットワーク」
一見すると、
「/32 同士なら、別セグメントだから GW が必要なのでは?」
と思いがちですが、ここで OS の挙動が効いてきます。
OSは最初に「宛先は自分か?」を判定する
IP送信時、Windows(Linuxも同様)は概念的に以下の順で処理します。
1. 宛先IPは、このOSが管理しているIPか?
└ Yes → ローカル配送(完)
└ No → ルーティング/GW判定へ
重要なポイント
- 送信元IPは関係ない
- 「198.18.0.10 というホスト」が判断しているわけではない
- 判断主体は OS(ネットワークスタック全体)
/32 同士でも GW が不要な理由
設定
このPCが持つIP:
198.18.0.10/32
198.18.0.11/32
GW: なし
通信
198.18.0.10 → 198.18.0.11
OSの判断
- 宛先 198.18.0.11
- 「これは俺(このOS)が管理しているIPだ」
- 即ローカル配送
- ARP/GW/Ethernet に降りない
👉
GWが不要なのは「別セグメントでも自分宛だから」
「俺」とは誰か?
ここで言う「俺」は、
- 198.18.0.10 というホストではない
- 仮想的なPC-Aでもない
この Windows OS そのもの
です。
IPアドレスは「人格」ではなく、
**OSが持つ複数の別名(論理アドレス)**にすぎません。
127.0.0.1 との関係
- 127.0.0.1 は OSに組み込まれた特別なループバック
- KM-TEST Loopback Adapter は NICを装う仮想デバイス
共通点
- 自分宛通信
- 外に出ない
- ARPしない
違い
| 127.0.0.1 | KM-TEST + /32 | |
|---|---|---|
| デバイス | 内蔵 | 仮想NIC |
| IP追加 | 不可 | 可能 |
| 論理ホスト分離 | 不可 | 可能 |
👉
思想は同じ、層が違う
C# ソケット例
サーバ側
var listener = new TcpListener(
IPAddress.Parse("198.18.0.11"), 5000);
listener.Start();
クライアント側
client.Connect("198.18.0.11", 5000);
- 同一PC内
- LAN不要
- IP指定そのまま
この方法で再現できる範囲・できない範囲
できる
- TCP/UDP 通信
- IP単位の役割分離
- 本番IP設定の流用
できない
- ARP挙動の再現
- ブロードキャスト
- L2 レベルの完全再現
👉
L2 まで必要なら VM / Docker / network namespace が必要。
まとめ
- /32 は「自分専用IP」を作る設定
- 複数 /32 = OSが複数ホストを演じる
- GWは「他人に届ける出口」
- 自分宛通信には GW は不要
- 同一PCでのIP指定ソケット通信は、
TCP/IP規格の外ではなく、OS実装として正当
