【Cisco Packet Tracer】ブラウザがページ表示するまでのパケット通信をアニメーションで理解する

### 【概要】
Cisco Packet Tracerでブラウザがページ表示するまでのパケット通信をアニメーションで見ることにより、パケット通信の理解を深めます。
現在はHTTPSが主流ですが、理解しやすいようにHTTPSではなくHTTPを使用します。
また、やり取りしているパケットについて一つずつ説明していきます。

### 【環境】
Cisco Packet Tracer Version: 8.2.0.0162

### 【インポート用ファイル】
下記リンク先のhttp.pktがインポート用ファイルになります。
通信に必要なIPアドレス等の情報は設定済みです。
PC、ルーターのARPテーブルには、他の機器の情報がない状態です。

https://github.com/nobu12/packet-tracer-http

### 【ネットワーク構成図】
![ネットワーク構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121997/4e476f73-18bd-2e28-645f-763c04654648.png)

### 【ブラウザページ表示手順】
#### 1. Packet Tracerを起動し、インポート用ファイルを開く
メニューの File -> Open ... からインポート用ファイルを指定して開きます。

ファイルインポート後は、スイッチ側のポートはオレンジ色となっており通信不可状態です。
これは、STP(スパニングツリープロトコル)が有効となっているためであり、30秒後に緑色の通信可能状態に変わります。
30秒というのは、STPのリスニングとラーニングの保持時間がそれぞれ15秒でありその合計時間です。

通信不可状態のまま後続手順を実行すると、スイッチを経由する通信が届かなくなるので、通信可能状態になってから実行しています。
デフォルトではRealtimeモードになっていると思います。このモードで通信可能状態になるまで30秒待ちます。

#### 2. Simulationモードに変更する
Realtimeモードだとパケットの動きを見れないため、画面右下にあるSimulationボタンをクリックして、Simulationモードに変更します。
「Constant Delay」にチェックが入っていると一定時間ごとのパケット送信となり実際にかかる時間が確認できなくなるため、チェックを外します。
![パケットトレーサー1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121997/9949271e-2bf4-91eb-308f-7cb47f0bc29c.png)

#### 3. HTTP通信を開始する
PCのアイコンをクリックして、Desktopタブを開き、Web Browserを選択します。
![パケットトレーサー2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121997/bb378ce7-bffc-7d52-6477-e21f4925539a.png)

ブラウザが開くので下記URLを入力し、Goボタンをクリックします。
```text
http://example.com
```
![パケットトレーサー3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121997/00de6fea-9bd9-606b-d42e-3a25a6c171f9.png)

#### 4. アニメーションを開始する
再生ボタンをクリックして、アニメーションを開始します。
![パケットトレーサー4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121997/e4d3037d-bf76-720e-6d2c-babc45611d09.png)

#### 5. ページ表示完了
アニメーションがすべて終わると、ブラウザにページが表示されています。
![ページ表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121997/ab52523c-2be4-bcfb-d366-a1012496a0a7.png)


### 【アニメーション】
再生ボタンをクリックした後のアニメーションです。
実際のアニメーションは下記gif画像よりも、もっとパケットの動きが遅くなめらかになります。
このgif画像は、画像編集ツールで速度を早めたものになります。
（実際のアニメーションは、インポート用ファイルと同じリポジトリに格納してあります）
![パケット通信アニメーション3(Qiita投稿用フレーム重複削除バージョン).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121997/f6b1f9b8-0134-7597-fb2f-e41174f2fa45.gif)


### 【パケット一覧】
Simulation PanelのEvent Listの画像です。
この画像は私が実施したものなので、皆さんが実行する場合はTime列の値は異なります。

![パケット一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121997/c5760a0f-66a1-6533-49f5-0dc801f863a0.png)

### 【シーケンス図】
パケット一覧のシーケンス図です。
シーケンス図内の番号は、この後で記載しているパケット説明での番号と紐づいています。

![HTTPシーケンス図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121997/ede89543-3eee-5c35-65d6-57cee7d8d39e.png)

### 【パケット説明】
パケット一覧のそれぞれのパケットの説明です。
簡潔に説明するため、PC→サーバに向けてのパケットはリクエスト、サーバ→PCに向けてのパケットはレスポンスと表記しています。
そのため、リクエストに対するレスポンスが必ずしもあるわけではないことを、ご認識ください。

| No | Time(sec) | Last Device | At Device | Type | 説明
|:----------|:----------|:----------|:----------|:----------|:----------|
|1|0.000|--|PC|DNS|DNSパケット作成するが、デフォルトゲートウェイ(ルーター)に対する宛先MACアドレスが不明|
|2|0.000|--|PC|ARP|宛先MACアドレスが不明のため、ARPパケット作成、送信|
|3|0.003|PC|ルーター|ARP|ARPリクエスト到着、ARPレスポンス送信|
|4|0.004|ルーター|PC|ARP|ARPレスポンス到着|
|5|0.004|--|PC|DNS|DNSパケット作成、送信|
|6|0.005|PC|ルーター|DNS|DNSリクエスト送信しようとするが、宛先IPアドレス(DNSサーバ)に対する宛先MACアドレスが不明|
|7|0.005|--|ルーター|ARP|宛先MACアドレスが不明のため、ARPパケット作成、送信|
|8|0.006|ルーター|スイッチ|ARP|ブロードキャストでARPリクエスト|
|9|0.008|スイッチ|HTTPサーバ|ARP|ARPリクエスト到着（宛先IPアドレスが自身ではないため、パケット破棄）|
|10|0.008|スイッチ|DNSサーバ|ARP|ARPリクエスト到着、ARPレスポンス送信|
|11|0.011|DNSサーバ|スイッチ|ARP|ARPレスポンス|
|12|0.013|スイッチ|ルーター|ARP|ARPレスポンス到着|
|13|15.002|--|PC|DNS|DNSレスポンスが到着しないため、DNSリクエスト再送信（時間を見るとわかるが約15秒待っている）|
|14|15.005|PC|ルーター|DNS|DNSリクエスト(ARPにより宛先MACアドレスが判明しているため、ARPリクエストの必要なし)|
|15|15.007|ルーター|スイッチ|DNS|DNSリクエスト|
|16|15.009|スイッチ|DNSサーバ|DNS|DNSリクエスト到着、DNSレスポンス送信|
|17|15.010|DNSサーバ|スイッチ|DNS|DNSレスポンス|
|18|15.012|スイッチ|ルーター|DNS|DNSレスポンス|
|19|15.014|ルーター|PC|DNS|DNSレスポンス到着|
|20|15.014|--|PC|TCP|TCPパケット作成、送信|
|21|15.016|PC|ルーター|TCP|TCPリクエスト送信しようとするが、宛先IPアドレス(HTTPサーバ)に対する宛先MACアドレスが不明|
|22|15.016|--|ルーター|ARP|宛先MACアドレスが不明のため、ARPパケット作成、送信|
|23|15.019|ルーター|スイッチ|ARP|ブロードキャストでARPリクエスト|
|24|15.021|スイッチ|HTTPサーバ|ARP|ARPリクエスト到着、ARPレスポンス送信|
|25|15.021|スイッチ|DNSサーバ|ARP|ARPリクエスト到着（宛先IPアドレスが自身ではないため、パケット破棄）|
|26|15.024|HTTPサーバ|スイッチ|ARP|ARPレスポンス|
|27|15.026|スイッチ|ルーター|ARP|ARPレスポンス到着|
|28|15.316|--|PC|TCP|TCPレスポンスが到着しないため、TCPリクエスト再送信|
|29|15.319|PC|ルーター|TCP|TCPリクエスト(SYN)|
|30|15.322|ルーター|スイッチ|TCP|TCPリクエスト(SYN)|
|31|15.324|スイッチ|HTTPサーバ|TCP|TCPリクエスト(SYN)到着、TCP(SYN/ACK)レスポンス送信|
|32|15.327|HTTPサーバ|スイッチ|TCP|TCP(SYN/ACK)レスポンス|
|33|15.329|スイッチ|ルーター|TCP|TCP(SYN/ACK)レスポンス|
|34|15.332|ルーター|PC|TCP|TCP(SYN/ACK)レスポンス到着、TCP(ACK)リクエスト送信|
|35|15.332|--|PC|HTTP|HTTPパケット作成|
|36|15.335|PC|ルーター|TCP|TCP(ACK)リクエスト送信|
|37|15.335|--|PC|HTTP|HTTPパケット送信（No35で作成したパケットを使用。No36でTCPリクエストされた後にリクエストするため）|
|38|15.338|PC|ルーター|HTTP|HTTPリクエスト|
|39|15.338|ルーター|スイッチ|TCP|TCP(ACK)リクエスト|
|40|15.340|ルーター|スイッチ|HTTP|HTTPリクエスト|
|41|15.340|スイッチ|HTTPサーバ|TCP|TCP(ACK)リクエスト到着|
|42|15.342|スイッチ|HTTPサーバ|HTTP|HTTPリクエスト到着、HTTPレスポンス送信|
|43|15.344|HTTPサーバ|スイッチ|HTTP|HTTPレスポンス|
|44|15.346|スイッチ|ルーター|HTTP|HTTPレスポンス|
|45|15.349|ルーター|PC|HTTP|HTTPレスポンス到着|
|46|15.349|--|PC|TCP|TCPパケット作成、送信|
|47|15.352|PC|ルーター|TCP|TCP(FIN/ACK)リクエスト|
|48|15.354|ルーター|スイッチ|TCP|TCP(FIN/ACK)リクエスト|
|49|15.356|スイッチ|HTTPサーバ|TCP|TCP(FIN/ACK)リクエスト到着、TCP(FIN/ACK)レスポンス送信|
|50|15.358|HTTPサーバ|スイッチ|TCP|TCP(FIN/ACK)レスポンス|
|51|15.360|スイッチ|ルーター|TCP|TCP(FIN/ACK)レスポンス|
|52|15.362|ルーター|PC|TCP|TCP(FIN/ACK)レスポンス到着、TCP(ACK)リクエスト送信|
|53|15.365|PC|ルーター|TCP|TCP(ACK)リクエスト|
|54|15.366|ルーター|スイッチ|TCP|TCP(ACK)リクエスト|
|55|15.368|スイッチ|HTTPサーバ|TCP|TCP(ACK)リクエスト到着|

### 【補足】
本記事で説明したのは初回通信です。
初回通信ではPC、ルーターでARP通信が発生していましたが、2回目以降の通信ではARPテーブルのキャッシュデータを参照するため、ARP通信が発生しなくなります。
また、スイッチも同様に2回目以降の通信ではMACアドレステーブルのキャッシュデータを参照するため、ブロードキャストフレームは発生しなくなります。
（もちろんキャッシュデータが存在する場合のみです）
ただよく分かっていませんが、Packet TracerのSimulationモードでは時間の進み方が現実と異なるようで、想定外にキャッシュが削除されることがあります。