ネットワーク基礎③|TCP・UDP・ポート番号の違い

ネットワーク基礎③|TCP・UDP・ポート番号の違い ネットワーク

ポート番号を知らないと、「pingは通るのに、つながらない」理由が分かりません。「サーバーに ping は通るのに、リモートデスクトップだけつながらないんです」

これも、情シスあるあるです。ping が通る=つながる、と思いたくなりますが、実は、そうとは限りません。理由は、今回のテーマ、ポート番号にあります。

シリーズ「情シスのためのネットワーク基礎」の第3回です。前回(第2回:DNS・DHCP・ARP)で、住所の調べ方・配り方を見ました。今回は、住所(IP アドレス)の先にある、窓口の番号の話です。

結論:住所はビルの場所、ポート番号は「何階の何号室」

IP アドレスは、機器(ビル)を指します。ポート番号は、その中の、どのサービス(部屋)に用があるかを指します。

要素 たとえ 役割
IP アドレス ビルの住所 どの機器か
ポート番号 部屋番号 その機器の、どのサービスか
TCP 復唱して確認する配達 届いたかを確かめながら送る
UDP 「はいよ!」と投げる屋台 確認せずに、さっと送る

ポート番号は 16ビット、つまり、0〜65535 の番号です。

TCP と UDP の違い

TCP UDP
接続 先に接続を作る(接続型) 接続を作らない
信頼性 届かなければ再送する。順番も保つ 届く保証はない
速さ・軽さ 手間がかかる分、やや重い 軽い
使われる場面 Web、メール、リモートデスクトップ、ファイル転送 名前解決(DNS)、動画・音声の配信、VoIP など

TCP の接続は、3回のやり取り(3ウェイハンドシェイク)で作られます。

  1. クライアント → サーバー:SYN(「話していいですか?」)
  2. サーバー → クライアント:SYN-ACK(「いいですよ、そちらは?」)
  3. クライアント → サーバー:ACK(「はい、始めましょう」)

食事でいえば、「注文いいですか?」「どうぞ」「じゃあ、これを」の3往復です。ここで失敗すると、接続自体ができず、アプリは「つながりません」と言います。

UDP は、確認なしで投げっぱなしです。届かなくても、気づきません(アプリ側で、必要なら確認します)。DNS の問い合わせは、軽さを優先して、基本的に UDP です。

よく見るポート番号

番号 用途 主なプロトコル
22 SSH TCP
53 DNS UDP / TCP
80 HTTP(暗号化なしの Web) TCP
443 HTTPS(暗号化ありの Web) TCP
3389 リモートデスクトップ(RDP) TCP

Microsoft の Test-NetConnection には、-CommonTCPPort という指定があり、HTTP、RDP、SMB、WINRM は、番号を覚えていなくても指定できます。

実機で確認:ポート番号は、開いているか

ポートの確認には、Test-NetConnection を使います。ping、TCP の接続テスト、経路の確認ができる、便利なコマンドです。

Test-NetConnection example.com -Port 443
Test-NetConnection example.com -Port 3389 -WarningAction SilentlyContinue | Select-Object RemotePort, TcpTestSucceeded
example.com の 443 番ポートへの接続は成功(TcpTestSucceeded が True)、3389 番ポートへの接続は失敗(False)となった画面
  • 443 番:TcpTestSucceeded : True。HTTPS の窓口は、開いていて、接続できました。出力に、InterfaceAlias(どのアダプターから出たか)と SourceAddress(こちらの IP アドレス)も出ています。
  • 3389 番:False。Web サーバーである example.com が、リモートデスクトップの窓口を開けていないのは、当然です。

大事なのは、「ping は通る」と「そのポートに接続できる」は、別のテストだということです。TcpTestSucceeded が True なら、その番号の窓口は、開いていて、接続できたことが分かります。

自分の PC では、どのポートが開いているか

逆に、自分の PC が、どのポートで待ち受けているかも見られます。

Get-NetTCPConnection -State Listen | Sort-Object LocalPort | Select-Object -First 6 LocalAddress, LocalPort, OwningProcess
Get-NetUDPEndpoint | Sort-Object LocalPort | Select-Object -First 4 LocalAddress, LocalPort, OwningProcess
自分の PC が待ち受けている TCP のポートと UDP のポートの一覧。ポート番号と、それを使っているプロセスの ID が表示されている
  • LocalPort が、待ち受けているポート番号です。
  • OwningProcess は、そのポートを使っているプロセスの ID です。Get-Process -Id <番号> に渡せば、どのプログラムかが分かります。
  • LocalAddress が 0.0.0.0 や :: なら、どのアドレス宛でも待ち受けている、という意味です。特定のアドレス(127.0.2.3 など)なら、その宛先だけです。

「身に覚えのないポートが開いている」ときは、OwningProcess から、何のプログラムかを辿るのが、調査の基本です。

僕のやらかし:ping が通るから、安心していた

リモートデスクトップで、あるサーバーに入れない、という連絡がありました。僕は、まず ping を打って、返ってくるのを見て、「ネットワークは大丈夫です」と答えてしまいました。

でも、本人は入れない。冷静になって、Test-NetConnection -Port 3389 を打つと、False。サーバーの手前のファイアウォールが、3389 を止めていたのが原因でした。

ping が通るのは、「建物の住所には、たどり着ける」というだけです。目的の部屋の鍵が開いているかは、別問題でした。レストランに電話が通じたからといって、ちょうど、その席が空いているとは限らないのと同じです。

それ以来、「つながらない」と言われたら、住所(ping)→ 部屋(ポート)の順に、確認しています。

今回覚えたコマンド

コマンド 意味
Test-NetConnection <相手> -Port <番号> そのポートに、TCP で接続できるかを調べる
Test-NetConnection <相手> -CommonTCPPort RDP よく使うポートを、名前で指定する
Get-NetTCPConnection -State Listen 自分の PC が待ち受けている TCP ポート
Get-NetUDPEndpoint 自分の PC が使っている UDP ポート
tnc Test-NetConnection の短い別名

次回予告

次回は、スイッチ・ルーター・VLAN・NAT。町を作る部品たちが、それぞれ何をしているのかを、実機の経路の表示と一緒に整理します。「家のルーターのおかげで、なぜ、複数の機器が1つのアドレスでネットに出られるのか」も、分かります。

→ 第4回:スイッチ・ルーター・VLAN・NAT

参考

ITもごはんも、腹八分目が長続きのコツ!

コメント