conf t

インフラエンジニアのメモ

pingのポート番号って?

f:id:monaski:20170326221315p:plain

結論からいうと、pingにはポート番号はありません。
じゃあ、pingって何なんでしょうか。なぜポート番号がなくとも動くのでしょうか?

そもそもpingプロトコル名ではなく、ツールの名前です。
pingが使っているプロトコルはICMPです。
このICMPプロトコルを用いて宛先とのL3レベルでの疎通を確認するのがpingです。

では、ICMPとは何なのでしょうか。

pingで使われるICMPとは何者か

ICMPプロトコルはIPプロトコルより上位のプロトコルです。
ネットワークを制御するためのプロトコルで、例えば私たちがこのIPに繋がらない とわかるのはICMPが教えてくれるおかげです。

ICMPはIPより上位のプロトコルです。
例えばHTTPで通信する際はIPヘッダの次にはTCPヘッダが来ますが、
pingなどでICMPを使う場合、IPヘッダの次にはTCPヘッダではなく、ICMPヘッダが来ます。
そのため、ICMPにはポートの概念はありません。(ポートはTCP/UDPで用いられる概念)

ethernetフレームヘッダ
f:id:monaski:20170326221315p:plain

到達不能通知

ICMPでネットワーク制御していると言いましたが、具体的にどのようなことをしているのでしょうか?
例えば、ある宛先につながらない時、それを教えてくれるのがICMPです。
以下例ではPCからあるサーバに接続しようとしましたが、ルータがその宛先を知らない場合です。
この時ルータはその宛先がないとわかったら、ICMP type3を返すことで宛先に接続できないことを送信元に通知します。
ICMPではtypeによって役割を分けています。

f:id:monaski:20170326222158p:plain

昔ある宛先につながらなくてパケットキャプチャして解析していた時、
なぜかルータからicmpが飛んできていて、pingなんてしてないのになんでだろうと思っていましたが、
このように接続できないことを通知する機能があるのです。
(icmp=pingという認識でした。)

ping

次に我々に最もなじみ深いpingを見てみましょう。
pingはICMP type 8とtype 0を用いることで、宛先との疎通確認をするツールです。
以下の通り、送信元はICMP type 8で宛先にecho requestを送信します。
それを受けた宛先はICMP type 0 のecho replyを返すことで、自分まで疎通できたことを送信元に返答します。
こうすることで、送信元は宛先まで疎通できたことを知ることが出来るのです。

f:id:monaski:20170326223048p:plain

結論:pingとは

  • pingはICMPプロトコルを使用し、宛先との疎通をL3レベルで確認するツールである
  • pingで使うICMPはポートの概念を持つTCP/UDPと同じL3レベルのプロトコルである
     よってICMPパケットはTCP/UDPヘッダを持たないため、ポート番号の概念もない。

参考:
ネットワークの疎通を確認するには?〜ping/traceroute〜:ネットワーク・コマンドでトラブル解決(1) - @IT
ICMP – ping, traceroute 詳細説明