pingにはなんでポート番号を指定できないの?

このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
ポート番号を持たないICMPと宛先ポート番号を持つTCP・UDPを対比したイメージ

pingが使っているのはTCPやUDPではなくICMPという別のプロトコルでポート番号という仕組みそのものがないから!

pingが使っているのはTCP/UDPではなくICMP

Web通信でおなじみのポート番号は、TCPやUDPのヘッダーに含まれる情報です。宛先ホストの中のどのアプリケーション(HTTPサーバーやSSHサーバーなど)宛てのデータなのかを、ポート番号で区別しています。

80番や443番などの番号が誰によって決められているのかはポート番号の割り当てルールで紹介しています。

一方でpingが使っているのは、ICMP(Internet Control Message Protocol)という別の仕組みです。IPv4のIPヘッダーには後ろに続くプロトコルを識別する「プロトコル番号」があります。「ICMPは1」「TCPは6」「UDPは17」ですがこの数字はポート番号ではありません。ICMPの「1」はpingが1番ポートを使うという意味ではないんですね。IPv6ではICMPv6を使いますがポート番号を使わない点は同じです。

RFC 792で定義されているEcho Request(エコー要求)・Echo Reply(エコー応答)のヘッダーにはType・Code・Checksum・Identifier・Sequence Numberがあり、その後ろにデータが続きます。TCPやUDPにある送信元・宛先ポート番号のフィールドはありません。

ICMP(pingが使う)TCP・UDP
プロトコル番号1TCP:6 / UDP:17
ポート番号なしあり(宛先アプリを識別)
主な用途疎通確認・エラー通知アプリケーション同士の通信

Identifierが「ポートのように」使われるとは?

ちょっとややこしいのが、RFC 792自体に「IdentifierはTCPやUDPのポートのようにセッションを識別するために使うことがある」という趣旨の説明がある点です。この一文だけ見るとpingにもポートに近い仕組みがあるように感じてしまいますよね。

Identifierは送ったEcho Requestと返ってきたEcho Replyを対応づけるための識別子です。Linuxのiputils版pingにはこの値を指定する-eオプションもあります。ですがIdentifierに443を指定してもHTTPSの443番ポートへ接続するわけではありません。応答を区別する番号であって相手のサービスを指定するポート番号ではないんですね。

pingが通っても目的のサービスが動いているとは限らない

ここが実務でも混同しやすいところだと思います。pingのEcho Replyが返ってきたからといって、Webサーバーの443番ポートが開いていることまでは保証されません。pingが確認しているのはあくまで相手ホストまでIPパケットが届いて返ってきたかどうかだけです。

しかもWindowsでは既定の設定でICMPのEcho Request(エコー要求)がブロックされていることが多いです。ファイアウォールの設定によってはこれが遮断されていてもTCPの443番には接続できます。pingを許可したいときに確認するのはTCPやUDPのポート開放ではなくICMPのエコー要求を許可するルールです。WindowsではICMPv4・ICMPv6の種類やルールが適用されるネットワークプロファイル、接続元の範囲を確認します。

ちなみにICMPには「Destination Unreachable」という別のメッセージ種別があり、その中の「port unreachable」というコードは、UDPで存在しないポート宛てに送った際に返ってくるものです。同じICMPの中に「port」という言葉が出てくる場面はあるものの、これはEcho Request/Replyとは別物なのでpingのポート指定とは直接関係ありません。

ポートの疎通を確認したいときはTest-NetConnectionを使う

特定のTCPポートへ接続できるか確認したいときはTCP接続そのものを試します。PowerShellならTest-NetConnectionに-Portを付けて実行できます。次の例のexample.comは確認したいホスト名またはIPアドレス、443は確認したいTCPポート番号に置き換えてください。

PowerShell
Test-NetConnection -ComputerName example.com -Port 443

結果のTcpTestSucceededがTrueなら実行したPCから指定先のTCPポートへ接続できています。Falseだった場合はサービスの停止やファイアウォール、通信経路など原因の切り分けが必要です。なお、-Portで確認できるのはTCPでUDPポートは確認できません。

「pingが通ったから大丈夫」で済ませていざアクセスすると繋がらず慌てる、というのはわりとよくある話だと思います。ICMPとTCP/UDPが別物だと知っていてもとっさに混同しがちなポイントですよね。


PowerShellのバージョンによる使い分けや実行結果の見方は下記の記事で詳しく紹介しているのであわせて確認してみてください。


ITに残る昔の名残や身近なルールの理由をほかにも知りたい方はIT雑学まとめから関連記事を探せます。

  • URLをコピーしました!