traceroute を 3つのプロトコルで試す

# 概要

かつて Windows マシンメインでネットワークエンジニアをやっていた関係で、traceroute (Windows だと tracert) は `ICMP の echo request` を使っているものかと思っていたが、Linux / Mac ではそんなことなかったので備忘録として記しておきます。

# Linux / Mac の traceroute コマンド

上で述べた通り、Windows の tracert コマンドは ICMP プロトコルを使用しますが、Linux / Mac の traceroute コマンドはデフォルトでは `UDP` を使用します。

オプションを付ければ ICMP や TCP で実行することができます。

```shell
# TCP: ポート指定しない場合は80番
$ traceroute -T -p ポート番号 [ホスト名 or IPアドレス]
 
# ICMP: を利用する場合
$ traceroute -I [ホスト名 or IPアドレス]

# UDP: デフォルトですが -U で明示的にしてすることもできる。ポート指定しない場合は53番。
$ traceroute -U -p ポート番号 [ホスト名 or IPアドレス]
```

ちなみに TCP の場合、tcptraceroute というものも存在します。
Mac で brew で入れましょう。

```shell
$ brew install tcptraceroute
$ sudo tcptraceroute [ホスト名 or IPアドレス] ポート番号
$ sudo tcptraceroute [ホスト名 or IPアドレス] ポート番号
```

# おまけ： network layer (第3層) と transport layer (第4層) の復習

ここから先は、あれ ICMP ってポートあったっけ？とか色々忘れていたので、個人的に復習するために残す用です。（読み飛ばしてもらって大丈夫です）

- ICMP
  
```shell
ICMP ( Internet Control Message Protocol ) は、IPプロトコルの「エラー通知」や「制御メッセージ」を転送するためのプロトコル。
TCP/IPが実装されたコンピュータ間で、通信状態を確認するために使用される。
ICMPはインターネット層（OSI参照モデルのネットワーク層）で動作するプロトコル。
※ ネットワーク診断プログラムの ping（ピング）や traceroute（トレースルート）はこのICMPプロトコルを使用したプログラム。

ICMP がネットワーク層で動作するとはいえ、正確にはIPプロトコルの上位に位置していることになっている transport layer ではないが。個人的には IP を補完するプロトコルというイメージ。
```

- TCP

```shell
TCP ( Transmission Control Protocol ) は、伝送制御プロトコルといわれ、インターネット・プロトコル・スイートの中核プロトコルのひとつ。
TCP はインターネット・プロトコル・スイートの初期からある2つのコンポーネントの1つで、もう1つは Internet Protocol (IP) である。そのため、スイート全体を一般に「TCP/IP」と呼ぶ。
 
TCPは、送信元のコンピュータ上のプログラムから別のコンピュータ上の別のプログラムへと信頼できる順序通りのオクテット列の転送を行う。 World Wide Web、メール、リモート管理、FTP などの主要なインターネット・アプリケーションは TCP を利用している。
 
高信頼のデータストリーム・サービスを必要としないアプリケーションでは User Datagram Protocol (UDP) を使うこともある。 UDP は信頼性よりもレイテンシ低減を重視したデータグラムサービスを提供する。

OSI参照モデルのトランスポート層にあたる。 ネットワーク層のプロトコルであるIPの上位プロトコルとして使われる。 IP ヘッダでのプロトコル番号は6である。
 
TCP は、セッションという形で1対1の通信を実現し、パケットシーケンスチェックによる欠損パケット再送などのエラー訂正機能などを持ち、データ転送などの信頼性の必要な場面でよく使用される。 一方他のトランスポート層プロトコルに比べ、プロトコル上のオーバヘッドが大きい為、比較的低速となる。
 
上位プロトコルとして、HTTP、FTP、Telnet、SSHなどがある。
```

- UDP

```shell
UDP ( User Datagram Protocol ) は、主にインターネットで使用されるインターネット・プロトコル・スイートの中核プロトコルの一つ。
アプリケーションから Internet Protocol (IP) ネットワーク上の他のホストへ「データグラム」と呼ばれるメッセージを送るのに使われ、事前に転送チャネルやデータ経路といった特別な設定をする必要がない。デイヴィッド・P・リードが1980年に設計し、RFC 768 で定義した（STD番号: 6）。非常にシンプルに設計されている。
 
主に IP プロトコル上に実装されており OSI 参照モデルのトランスポート層にあたる。
明確なハンドシェイクを省いたコネクションレスであり、送達確認などを行わない言わば無手順方式のデータ転送で、信頼性・順序性・データ完全性を保証しない。
通信中のパケット紛失や重複、改竄の検出やそのための対応が必要な場合はアプリケーションで行う。
それによってトランスポート層でのそのような処理のオーバーヘッドを削減している。
リアルタイム・システムでは遅れているパケットを待つよりもそういうパケットはないものとして処理する方が好ましいため、適時性を重視するアプリケーションでよく使われている。

トランスポート層での誤り検出機能が必須なら、その用途に設計された Transmission Control Protocol (TCP) または Stream Control Transmission Protocol (SCTP) を使えばよい。
```

- Port Number

```shell
TCP や UDP で通信を行うときは、コンピュータ一台という単位ではなく「プログラム単位」つまり「プロセスやスレッド単位」で通信が行われる。そのためプロセス同士、正しく受け渡しをする必要がある。
 
このとき通信しているプロセスには「ポート番号」というものが割り振られる。プロセスやスレッドはこのポート番号を目印にして、どのアプリケーションとどのアプリケーションが通信をとっているのかを判別することになる。
 
IP アドレスを建物の住所に例えるなら、ポート番号は「部屋の番号は何号室か？」という例えになる。コンピュータネットワークにおいて、プロトコル、IPアドレスとポート番号はまとめると、「どのような方法」で「どこ」の「何号室」に通信をとるのか？ということになる。
 
- 代表的なポート番号とプロトコル
 
TCP 20 : FTP (データ)
TCP 21 : FTP (制御)
TCP 22 : SSH
TCP 23 : Telnet
TCP 25 : SMTP
UDP 53 : DNS
UDP 67 : DHCP（サーバ）
UDP 68 : DHCP（クライアント）
TCP 80 : HTTP
TCP 110 : POP3
UDP 123 : NTP
TCP 443 : HTTPS
WELL KNOWN PORT NUMBERS 0~1023
 
ポートと IP アドレスとプロトコルの例をあげると Web サーバなどだろう。
特定の IP アドレス上で公開されているサーバ上で、HTTP  というプロトコルにそったアプリケーション、Apache などが80番ポートで、クライアントとの通信を待機し、要求に応じて Web ページの情報を送信するといった流れ。
```