1件のコメント

レイヤ4 -トランスポート層- ポート番号

今回はTCP/IPのレイヤ4、トランスポート層の、「ポート番号」についての話です。IPアドレスまでは知っていても、TCPのことはよく知らないという人が多いはずです。この層より上の層ははかなりアプリケーションに依存した話になりますので、ネットワークを抑える意味ではこの層が理解の要になります。しっかり理解していきましょう。

どうやってアプリケーションを区別するのか

まず、考えてもらいたいことがあります。たとえばブラウザを2つ開いているとします。1つのブラウザではyoutubeでAという動画を再生しています。もうひとつのブラウザではyoutubeでBという動画を再生しています。

さて、このとき自分のPCとyoutubeのサーバーとの間には(少なくとも)2つの通信が確立されています。この2つは「どうして混ざってしまわないのでしょうか?」。どちらも同じブラウザですし、相手も同じyoutubeのサーバーです。不思議だと思いませんか?

通信にはIPアドレスを使っているはずです。仮に自分のPCのIPアドレスをIP1、youtubeのサーバーのIPをIP2としましょう。以下の2つの通信が確立されているはずです。

  1. IP1 – IP2
  2. IP1 – IP2

うーん。どう見ても区別できませんね。これは当然のことで、「IPアドレスだけで通信の確立がなされているわけではない」のです。IPアドレスだけではなくてそのPCの中で「どのプログラムと関連づいているのか」、より正確に言うと「どのプロセスと関連づいているのか」ということが管理されているわけです。これが「ポート番号」です。

超有名なポート番号として「HTTP = 80番」というものがあります。ブラウザで接続する時にはHTTPサーバー(Webサーバー)の80番ポートに接続するわけです。

  1. IP1 – IP2:80
  2. IP1 – IP2:80

うーん。これでもまだ見分けがつかないですね。普段ポート番号はサーバー側だけが意識されることが多いですが、「クライアント側のポート番号」も意識する必要があるのです。

それでは、クライアントのポート番号は何番になるのかというと、これはもう「何番でもいい」わけです。少なくとも他とバッティングしなければ。このようにクライアント側が接続のために一時的に使用するポート番号のことをエフェメラルポートといいます。

ここでは適当に1024と1025番だったとしましょう。

  1. IP1:1024 – IP2:80
  2. IP2:1025 – IP2:80

うん。これできちんとそれぞれの通信が区別できるようになりました。このようにサーバー、クライアントのIPアドレスとポート番号をつかって接続の状態を表し、これをソケットといいます。

このように、プログラムが通信をする際には、それぞれの動的なポート番号が割り当てられるので、混ざることが無いわけです。

繰り返しになりますが、サーバー側のポート番号だけではなく、クライアント側のポート番号も意識していきましょう

接続の状態を確認する

ここまで理解できたら、実際に自分が使っているPCの現在の接続の状態を確認してみましょう。接続を確認する方法は沢山ありますが、Windowsの標準コマンドということでいうとnetstatコマンドがあります。コマンド自体の解説は@ITに譲ろうと思います。

私がよく使うオプションを紹介しておきます。実際に試しながら見てみてください。

netstat –an

いつも何も考えずに使うのは -anオプションです。-aで接続状態に加えて、待ち受けているポートの状態を表示しています。「状態」が「LISTENING」になっているものが待ち受けているものです。いわゆるサーバーですね。

これに加えて -nオプションをつけることで、名前解決をさせないようにしています。ホスト名ではなく、IPアドレスで表示されるわけです。確かにホスト名で表示されたほうが分かりやすいかもしれませんが、毎行表示するためにDNSに問い合わせるひつようがあるため、動作が非常に遅くなってしまいます。ですので、-nオプションをつけることですばやく表示可能にしているのです。

netstat –ano

「ん?なんでこんなポート番号で待ちうけしているんだろう」、「この接続はどのプログラムが使ってるんだろう」なんていうような疑問を感じたときには -oオプションをつけて、そのポートを開いたプログラムのPIDを表示できます。

これでPIDを確認した後で「tasklist」のコマンドの実行結果を比較することで、実際に接続を使っているプロセスを特定することができます。

netstat –anb

PIDからプロセスを追うよりも、-bオプションを使って直接実行ファイルを表示させる方が目的にかなっているときもあると思います。そのときはこちらを使っています。

 

今回はここまでです。TCPのポート番号について理解できましたでしょうか。コメントあればいただきたいと思います。よろしくお願いします。

子供3人。家族優先。都内SIer勤務。Windows系中心のインフラよりの何でも屋。脱原発。 Microsoft MVP for Cloud and Datacenter Management.

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。