パケットゲットだぜ！！！！！！！

# 概要
オレ、ヒロシ！今日はWiresharkとやらを使ってパケットゲットしてみるぜ！

# Wiresharkってなに？
`Wireshark`ってのは、ネットワークを流れるデータをゲットして内容を解析・表示するプロトコルアナライザのことだ！

# パケットってなに？
パケット（packet）は英語で「小包」を意味するんだぜ！
そんで、データ通信においてネットワーク経由でやりとりされる情報の伝送単位をパケットって呼ぶんだ！

# プロトコルってなに？
通信をする上で守らなければいけないお約束のことだぜ！
各種のプロトコルはOSI参照モデルの７レイヤーによって以下のように分類されているんだ！
|層（レイヤー）  　　　　　　　|名称  |規格（プロトコル）  |概要  　　　　　　　|利用例  |
|---|---|---|---|---|
|7  |アプリケーション層 　　　　　　　 |HTTP,FTP,DNS,SMTP,POPなど  |個々のアプリケーション  |www,メール  |
|6  |プレゼンテーション層  　　　　　　　　　　|SMTP,FTP,Telnetなど  |データの表現形式  |HTML  |
|5  |セッション層  |TLS,NetBIOSなど |通信手段 |HTTPS |
|4  |トランスポート層  |TCP,UDP,NetWare/IPなど  |エンド間の通信制御  |TCP,UDP |
|3  |ネットワーク層  |IP,ICMPなど  |データを送る相手を決め最適な経路で送信  |IP  |
|2  |データリンク層  |PPP,ARP,RARP,Ethernetなど  |隣接する機器同士の通信を実現  |Ethernet |
|1  |物理層  |RS-232,UTP,無線 |物理的な接続、電気信号  |UTPケーブル,光ファイバーケーブル |

# 環境
```
# OS情報
sw_vers
> ProductName:	macOS

# Wiresharkのダウンロード（3.6.5）
https://www.wireshark.org/download.html
```

# Wiresharkを使ってパケットをゲットしてみる
Wiresharkは無線(Wi-Fi)、有線(Ethernet)両方のパケットをキャプチャできるけど今回は無線のパケットをゲットしてみるぜ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/3150c62c-7056-c80b-2d30-6f2dd97a84ae.png)

こんな感じで、たくさんのパケットがゲットできたな！やったぜ！それじゃあ次はいくつかのプロトコルにそれぞれフォーカスして説明していくな！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/24034c2f-80ba-cd89-d99a-908c455f81b8.png)

# TCPの概要
まずはTCPって奴の説明をしていくぜ！
TCPは、`安全性重視で会話のキャッチボールをしようぜ！`っていう通信をする特性があるんだ！TCPでは通信の最初に`３ウェイハンドシェイク`という通信をするんだ！
下の図にあるように`SYN`や`ACK`はフラグと呼ばれていて、次にどのようなフラグで通信するか手順が決まっているぜ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/bc92ac3d-6726-14f9-654b-8df6486035ff.png)

ちなみに、通信を終了するときはこんな手順になるぜ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/1db152fd-0cb8-ff50-b25b-34b788c5dae3.png)

それじゃあ実際にパケットを見てみるぜ！
Wiresharkでゲットしたパケットでもちゃんと`SIN`=>`SYN, ACK`=>`ACK`という順番で通信しているのが分かるな！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/7c1d5d89-ce07-5eee-09c0-382f072f41ab.png)


通信を終了するときもちゃんと`FIN, ACK`=>`ACK`=>`FIN, ACK`=>`ACK`という順番で通信してるな！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/8aaf76e1-5bb1-b9b6-3f91-7535c112c6df.png)


# UDPの概要
次はUDPって奴の説明をしていくぜ！
UDPは、`スピード重視で会話のキャッチボールをしようぜ！`っていう通信をする特性があるんだ！UDPではTCPのように３ウェイハンドシェイクを行わないぜ！だから速い且つサーバー側の負荷も少なくて済むんだ！
あと、UDPはDNS(Domain Name System)のようなサーバー側で大量の通信を受け付ける場合に使われるぜ！
※DNSってのは、ドメイン名（コンピュータを識別する名称）をIPアドレスに自動的に変換してくれる奴のことだ！

それじゃあ実際にパケットを見てみるぜ！
こんな感じでUDPのパケットが飛んでいるのが分かるな！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/e5f07d97-e545-9c2a-ea8f-0eaf8d031a32.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/493bab96-d713-2eaf-b6be-40e2f896116c.png)



# ICMPの概要
次はICMPって奴の説明をしていくぜ！
ICMPってのは、Internet Control Message Protocolの略で、`IPプロトコルの「エラー通知」や「制御メッセージ」を転送するためのプロトコル`なんだぜ！ICMPメッセージには機能毎にいくつかのタイプがあって、主要なメッセージタイプと機能は以下の図の通りだ！ちなみに、皆んさんお馴染みの`ping`はこのICMPプロトコルを使用したプログラムだぜ！

|タイプ  　　　　　　　|機能 |
|---|---|
|0  |エコー応答（echo reply）|
|3  |あて先不達（destination unreachable）|
|5  |リダイレクト要求（redirect、経路変更要求）|
|8  |エコー要求（echo request）|
|11  |時間超過（time exceeded）|
|13  |タイムスタンプ要求（timestamp request）|
|14  |タイムスタンプ応答（timestamp reply）|
|15  |情報要求（information request）|
|16  |情報応答（information reply）|
|17  |アドレス・マスク要求（address mask request）|
|18  |アドレス・マスク応答（address mask reply）|


それじゃあ実際にパケットを見てみるぜ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/bb9d4633-43b0-e631-e962-c3f3b745ceb8.png)
今回は`エコー応答（echo reply）`と`エコー要求（echo request）`のパケットをゲットだぜ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/43495988-91e8-ea74-b92c-23200440042a.png)
あと`ping`が通らなかったときは、こんな感じで`あて先不達（destination unreachable）`のパケットが飛ぶぜ！


# ARPの概要
次はARPって奴の説明をしていくぜ！
ARPってのは、Address Resolution Protocolの略で、`IPアドレスからMACアドレスの情報を得られるプロトコル`なんだぜ！ARPには「ARPリクエスト」と「ARPリプライ」っていう2種類のパケットがあるんだ！ARPリクエストとARPリプライでの組み合わせは下の図の通りだぜ！


|通信種別|opcode|MAC address|IP address|MAC address|IP address|
|---|---|---|---|---|---|
|ARPリクエスト|1|自分|自分|00:00:00:00:00:00|解決したいIPアドレス
|ARPリプライ|2|自分|自分|リクエスト送信元|リクエスト送信元|



それじゃあ実際にパケットを見てみるぜ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/821aa638-f763-f74f-45b2-c1fcc250547c.png)
`Who has 10.18.128.1? Tell 10.18.184.237`ってあるな！これは、「おーい、みんなー！10.18.128.1のIPアドレスって誰ー？オレ（10.18.184.237）に教えくれ！」って言ってるわけだ！面白いぜ！

# mDNS（Bonjour）の概要
最後にmDNS（Bonjour）の説明をしていくぜ！
mDNSってのは、Multicast Domain Name Serviceの略で、`ローカルネットワーク内でホスト名からIPアドレスを割り出すために用いられるプロトコル`なんだ！
これまでの名前解決はブロードキャスト、DNSではユニキャスト、mDNSではマルチキャストで名前解決をするんだ！
### ブロードキャストとは
`1対不特定多数`で行われるデータ通信のことだぜ！
### ユニキャストとは
`1対1`で行われるデータ通信のことだぜ！
### マルチキャストとは
`1対複数`で行われるデータ通信のことだぜ！


それじゃあ実際にパケットを見てみるぜ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/57452d36-4219-2d51-e2fc-4140445045c8.png)
おっと！ちゃんとオレのPCが名前解決されたぜ！これは面白いや！


# 表示フィルター
下の赤枠の小窓に条件構文を直接入力することでディスプレイをフィルタリングできるぜ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684448/ad4602fb-7775-5f1a-ed40-21b9770c1331.png)

プロトコル（以下など）
`tcp`
`udp`
`icmp`
`arp`
IPアドレス
送信元IP: `ip.src==xxx.xxx.xxx.xxx`
送信先IP: `ip.dst==xxx.xxx.xxx.xxx`
送信元/送信先両方: `ip.addr==xxx.xxx.xxx.xxx`
ポート番号
TCP: `tcp.port==xxx`
UDP: `udp.port==xxx`
組み合わせ
例）`mdns&&ip.src==xxx.xxx.xxx.xxx`

# 最後に一言

みんなもパケットゲットだぜ！！！！！！！！！！！！！！！！！