0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

同一PC上で「複数IP=別PC」のようにソケット通信を行う方法

0
Last updated at Posted at 2026-02-03

はじめに(背景・目的)

本来は 異なる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指定ソケット通信が成立します。

image.png


想定する構成

本来の構成(実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の場合

  1. ループバックアダプタの IPv4 プロパティ
  2. 詳細設定
  3. 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の判断

  1. 宛先 198.18.0.11
  2. 「これは俺(このOS)が管理しているIPだ」
  3. 即ローカル配送
  4. 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実装として正当
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?