【入門編】 ソケット通信の概念と五つ組(5-tuple) – ネットワーク基礎とWebセキュリティ実践ガイド

ネットワークの深淵へようこそ。今日は、インフラエンジニアの登竜門であり、ネットワークの「心臓部」とも言えるソケット通信と五つ組(5-tuple)についてお話しします。

「OSI参照モデル? パケット? 難しそう…」と身構える必要はありません。まずは、私たちの身近にある「手紙」のやり取りから紐解いていきましょう。

—

1. ネットワークは「巨大な郵便局」である

私たちがWebサイトを見るとき、裏側では膨大な量のデータがパケットという「封筒」に入れられて飛び交っています。

手紙が正しい相手に届くためには、何が必要でしょうか?

  • 誰から(送信元)
  • 誰へ(宛先)
  • 何の手紙か(プロトコル:招待状なのか請求書なのか)

ネットワークの世界でも全く同じです。コンピュータ同士が通信するとき、OSは「この通信は誰と誰の、何のやり取りなのか」を識別するために、五つ組(5-tuple)という「管理札」をパケットに貼り付けます。

五つ組(5-tuple)の正体

五つ組とは、通信を一意に特定するための以下の5つの情報のセットです。

1. 送信元IPアドレス:あなたのコンピュータの住所
2. 送信元ポート番号:あなたのコンピュータ内の「どのアプリケーション(ブラウザ?メール?)」が送ったか
3. 宛先IPアドレス:相手のコンピュータ(サーバー)の住所
4. 宛先ポート番号:相手のコンピュータ内の「どのサービス(Webサーバー?DB?)」宛か
5. プロトコル:通信のルール(TCPかUDPか)

この5つが全て一致していれば、それは「同じセッション(会話のつながり)」であると判断されます。逆に言えば、一つでも欠けたり異なれば、それは別の通信として扱われるわけです。

—

2. 「ソケット」とは、窓口のこと

次に「ソケット」という概念について。これは、コンピュータというビルの中にある「通信専用の窓口」だと考えてください。

ブラウザでWebサイトを開こうとすると、OSはメモリ上に専用の「窓口(ソケット)」を一つ作成します。この窓口には、先ほどの五つ組がラベルとして貼られます。

  • 窓口(ソケット)の中身:
  • 192.168.1.10:54321(自分)と 93.184.216.34:443(相手)が握手している。

OSは、届いたパケットのラベルを見て、「お、これはあの窓口に届けるべき郵便物だな」と判断し、該当するアプリケーションにデータを渡します。これが、PCの中で複数のタブを開いていても通信が混ざらない理由です。

—

3. Pythonで覗いてみる、通信のリアル

理屈はわかったけれど、実際に見てみないと実感が湧きませんよね。Pythonを使って、ごくシンプルな通信の「窓口」を作ってみましょう。

import socket

# 通信の窓口(ソケット)を作成します
# AF_INETはIPv4、SOCK_STREAMはTCP通信を意味します
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 宛先を指定(今回は例としてGoogleのサーバー)
server_address = ('www.google.com', 80)

# 通信を開始(ここで五つ組の一部が決まります)
s.connect(server_address)

# 自分の窓口(ローカルポート)を確認してみましょう
print(f"ローカル側(自分)の接続情報: {s.getsockname()}")
print(f"リモート側(相手)の接続情報: {s.getpeername()}")

# 終わったら窓口を閉じます
s.close()

このコードを実行すると、getsockname() でOSが自動的に割り当てた「送信元ポート番号」が表示されます。このように、OSは「空いている窓口」を探して通信を管理しているんです。

—

4. 現場のトラブルシューティングで役立つコマンド

インフラの現場で「通信が繋がらない!」という緊急事態に直面したとき、真っ先に確認すべきなのがこの五つ組です。

Linuxサーバーで現在どんな「窓口」が開いているかを確認するには、ss コマンド(昔で言う netstat)を使います。

# 現在確立されているTCP通信をすべて表示する
ss -nt

実行結果を見ると、こんな感じの表示が並びます。

State  Recv-Q Send-Q  Local Address:Port  Peer Address:Port
ESTAB  0      0       192.168.1.5:443     203.0.113.10:56789
  • Local Address:Port が「自分側の五つ組」
  • Peer Address:Port が「相手側の五つ組」

これを見れば、「どのポートが」「どこから」使われているか一目瞭然ですよね。ファイアウォール(iptablesやAWSのセキュリティグループ)で通信を許可・拒否する際も、この五つ組のどれを指定するかで設定の意味が変わってきます。

—

最後に:ネットワークを「視る」力を養おう

五つ組とソケット。最初は難しく感じるかもしれませんが、要は「誰が・誰と・何をしているか」を厳密に管理するための名札に過ぎません。

トラブルが起きたとき、パケットの海に溺れそうになったら、まずは深呼吸して「今、五つ組はどうなっているか?」を思い出してください。そこには必ず、解決のヒントが隠されています。

ネットワークの世界は、触れば触るほど奥が深い。これからも一緒に、一歩ずつレベルアップしていきましょう!

コメント

タイトルとURLをコピーしました