TCP/IP について勉強した内容をまとめてみた

勉強した内容をアウトプットする企画第 2 弾です。
本記事では TCP/IP のレイヤーごとに学んだ内容の一部をまとめます。
あくまで私の備忘録であり、網羅的に説明しているわけではないという点はご留意ください。

第 1 弾 はこちら ↓

https://qiita.com/ayanoigarashi/items/1f2cd267b0c6b47a2625

## 1. アプリケーション層
例 : HTTP, SMTP, POP3, IMAP, DNS, FTP, TELNET, NNTP, RCP
アプリに合わせた通信をできるようにするため、アプリごとにプロトコルがいろいろあります。

### HTTP
1 つの要求に対して 1 つの応答を返すというシンプルなプロトコルです。
このような 1 回で完結するプロトコルをステートレスプロトコルというそうです。

ステートレスで対応しきれないという場合、やり取りに関する情報 (Cookie) をクライアント側に保存しておいて、サーバーに提示することで、前回からの引き続きの通信として扱うことができます。
Cookie は HTTP プロトコルの正規の仕組みではなく、通常は CGI (Common Gateway Interface) などクライアント側の要求に応じて Web ページを作成する仕組みと組み合わせて使います。

CGI については、こちらのページでお寿司屋さんという例えで解説されていてわかりやすかったです。

CGIとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word112.html


### SSL/TLS
厳密には L5 に位置するため、TCP/IP ではアプリケーション層とトランスポート層の間とされるそうです。
仕組みはこのようになっています。
![SSL/TLS の仕組み](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954427/2fde3c81-7969-9aba-e445-96d698c25632.png "SSL/TLS の仕組み")

### メールシステム
複数のプロトコルが結びついて機能しています。
- SMTP (Simple Mail Transfer Protocol) : メールの送受信
- POP3 (Post Office Protocol 3) : メールのダウンロード
- IMAP (Internet Message Access Protocol) : メールの操作

「TCP/IP のツボとコツがゼッタイにわかる本」によると、POP3 はユーザー認証の際に平文でユーザー名とパスワードを送るというお花畑な仕様らしく、さすがにこれではまずいということで APOP (Authenticated Post Office Protocol) という認証方式が追加されたそうです。
ただこれも暗号学的には強度が低いため、パスワードの送信などセキュリティ重視の場面では利用しないことが推奨されているそうです。

## 2. トランスポート層
例 : TCP, UDP
2 つの違いを簡単に書いておくとこのような感じです。
TCP (Transmission Contorol Protocol) : 安全・確実に届けるプロトコル
UDP (User Datagram Protocol) : 素早く届けるプロトコル (リアルタイム性重視)
トランスポート層で扱うデータの単位は **セグメント** といいます。

### ポート番号
受信側では、TCP ヘッダに書き込まれたポート番号から受け渡すアプリケーションプロトコルを判断しています。
ポート番号は 0 ～ 65535 番までありますが、このうち 0 ～ 1023 番までは **ウェルノウンポート** と呼ばれ、通信サービスごとに予約されています。

| サービス | アプリケーション層のプロトコル | ポート番号 | トランスポート層のプロトコル |
|:-:|:-:|:-:|:-:|
| WWW | HTTP | 80 | TCP/UDP |
| WWW (セキュリティ付き) | HTTPS | 443 | TCP/UDP |
| 電子メール (送信) | SMTP | 25 | TCP/UDP |
| 電子メール (受信) | POP3 | 110 | TCP/UDP |
| 電子メール (認証付き送信)  | SMTP | 587 | TCP |
| ファイル転送 | FTP | 20/21 | TCP/UDP |
| 遠隔ログイン | TELNET | 23 | TCP/UDP |
| 遠隔ログイン (セキュリティ付き) | SSH | 22 | TCP/UDP |
| ネットワーク管理 DNS | DNS | 53 | TCP/UDP |
| ネットワーク管理 DHCP | DHCP | 546/547 | UDP |

誕生日が 5/3 なので DNS は覚えられそうです ( ~~どうでもいい~~ )。

### netstat
PowerShell に netstat と入力すると、現在確立している通信情報が表示できます。
```console:PowerShell
PS C:\Users\hoge> netstat
```

UDP は通信の確立を行わないため netstat だけでは見えません。
すべての情報を見るには netstat -a を入力します。
```console:PowerShell
PS C:\Users\hoge> netstat -a
```

## 3. ネットワーク層
例 : IP (, ICMP)
「TCP/IP の絵本」によると、IP と ICMP はトランスポート層の TCP と UDP のように並列した関係ではなく、ICMP はあくまで「IP を助けるプロトコル」という位置づけとのことでした。
ICMP は宛先に届かないという問題が起こったときに、送信元に対してそれを知らせるメッセージを送りますが、このとき ICMP のメッセージ単独ではなく、IP のヘッダが付加されて送られるそうです。

また、トランスポート層で **セグメント** と呼んでいたデータ単位をネットワーク層では **データ** と呼び、データに IP ヘッダを付けたものは **IP データグラム** と呼ばれます。

### DHCP (Dynamic Host Configuration Protocol)
[前の記事](https://qiita.com/ayanoigarashi/items/1f2cd267b0c6b47a2625#dhcp-dynamic-host-configulation-protocol) にも書いていましたがリンク開くのが面倒なのでコピペします。
DHCP は必要な時だけ自動的に IP アドレスを割り振るプロトコルです。
![DHCP の図解](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954427/55ef4fd2-736d-afd2-e3c7-395262ecf168.png "DHCP の図解")
1. クライアントは送信元 IP アドレスを不定アドレス (0.0.0.0) に、宛先をリミテッドブロードキャストアドレス (255.255.255.255) にして DHCP メッセージをブロードキャストします。
1. DHCP サーバーがメッセージを受け取って、使ってよい IP アドレス (192.168.XX.Y) を返します。ただ、この時点ではまだクライアントに IP アドレスが割り当てられていないのでブロードキャストします。
1. クライアントは提示された IP アドレス (192.168.XX.Y) を使用するというメッセージを DHCP サーバーに送ります。
1. DHCP サーバーが確認応答を返したらやり取りが完了します。

### NAT と NAPT
これも [前の記事](https://qiita.com/ayanoigarashi/items/1f2cd267b0c6b47a2625#nat-network-address-translation) とかぶってしまいました。これは覚えたので省きます。

### ipconfig (ifconfig) と ping
コンピューターの接続状況を見るには ipconfig (UNIX/Linux では ifconfig) を入力します。
```console:PowerShell
PS C:\Users\hoge> ipconfig
```

通信したい相手のコンピューターの接続状況を見るには ping を入力します。
```console:PowerShell
PS C:\Users\hoge> ping www.microsoft.com
```

## 4. データリンク層 / 物理層
例 : Ethernet, FDDI, ATM, PPP, PPPoE(, ARP)
ARP がどの層に属するかは微妙なところだそうで、だいたい L2 と L3 の間くらいと捉えます。

### ARP (Address Resolution Protocol)
データリンク内では MAC アドレスを使って機器を特定するため、ARP プロトコルを使います。

私が引っかかった部分が「TCP/IP の絵本」の「ブロードキャスト MAC アドレス」という宛先を示す語句でした。
ちなみに、IP のブロードキャストアドレスは知っていた (聞いたことがあった) のですが、それも種類があったそうです。
- リミテッドブロードキャストアドレス (255.255.255.255)
- ディレクテッドブロードキャストアドレス (XXX.YYY.ZZZ.255) ※ ネットワーク部のついているもの

で、話を戻すとブロードキャスト MAC アドレスとは FF-FF-FF-FF-FF-FF というものです。

「MAC アドレスを知りたいコンピューターの IP アドレスを ARP パケットに書き込み、ブロードキャスト MAC アドレス宛てに送信します」という本の記載で、IP アドレスは何を指定しているのかがわからなくてもやもやしていました。
これは、先に答えを書くと IP アドレスはブロードキャストアドレスを指定していることがわかりました。
(え、当たり前だろと思われるかもしれません。でも私はわかりませんでした。)

一番すっきりしたのが下記のコマンドレットの実行結果でした。

```console:PowerShell
PS C:\Users\hoge> arp -a
```
これを実行すると、IP ブロードキャストアドレスがリミテッドでもディレクテッドでも対応する MAC アドレスが FF-FF-FF-FF-FF-FF になっていることがわかります。
個人的にこれはすごく感動しました。
この記事で書きたかったことはほとんどこれに尽きます。

## まとめ
今回は TCP/IP のレイヤーごとに勉強した内容の一部を自分の備忘録としてまとめました。
次は、OAuth について学んだことをまとめていきたいと思っています。
※ 誤りや補足などございましたらお気軽にコメントいただけますと幸いです。