【アーキテクチャ】【Network】TCP/IPの通信

# 紀元
メーカー間で通信できない問題を解決するために誕生した、通信に対するプロトコル（決まりごと）。
RFCという文書にまとめられ、[IETF](https://www.ietf.org/rfc.html)（Internet Engineering Task Force）のサイトで確認できる。
1981年に通信の確立を担うTCP（Transmission Control Protocol, RFC 793）と、データの転送を担うIP（Internet Protocol, RFC 791）。
この後もHTTPを含むプロトコルが作られ、通信にまつわるプロトコル群を「TCP/IP」もしくは、「インターネット・プロトコル・スイート」と呼ぶ

## OSI参照モデル
TCP/IPと同時期に策定された通信に対するプトロコルだが、普及しなかった。
OSI参照モデルは、通信の仕組みを学ぶ上でとても役立つ。OSI参照モデルに示される階層ごとの役割は、TCP/IPにどういった機能が備えられているのかを知る助けとなる。

OSI参照モデルでは、通信に必要な機能を７階層に分けて考えた。

|階層|名前|役割|
|:---|:---|:---|
|第７層|アプリケーション層|アプリケーションごとに規定|
|第６層|プレゼンテーション層|文字コードなど、データの表現形式の違いを吸収|
|第５層|セッション層|接続の確率・開始・復帰・終了|
|第４層|トランスポート層|データを漏れなく転送|
|第３層|ネットワーク層|機器を中継してデータを転送|
|第２層|データリンク層|隣接する機器間でのデータ転送|
|第１層|物理層|物理的な接続方式を規定|
これらの各階層それぞれに対応するプロトコルを策定しようというのがOSI参照モデルの考え方。

TCP/IPでのレイヤ構造は、OSI参照モデルと異なり４階層。

<table>
<th colspan=2>OSI参照モデル</th><th>TCP/IPの階層モデル</th>
<tr>
<td>第７層</td><td>アプリケーション層</td><td rowspan=3>アプリケーション層<br>（HTTP、FTP、SMTP）</td>
</tr>
<tr>
<td>第６層</td><td>プレゼンテーション層</td>
</tr>
<tr>
<td>第５層</td><td>セッション層</td>
</tr>
<tr>
<td>第４層</td><td>トランスポート層</td><td>トランスポート層<br>（TCP、UDP）</td>
</tr>
<tr>
<td>第３層</td><td>ネットワーク層</td><td>インターネット層<br>（IP）</td>
</tr>
<tr>
<td>第２層</td><td>データリンク層</td><td rowspan=2>ネットワークインタフェース層<br>（Ethernet、PPPoE、IEEE 802.11）</td>
</tr>
<tr>
<td>第１層</td><td>物理層</td>
</tr>
</table>

機能ごとに階層を分け、階層独立性を持たせる利点

- 他の階層の仕様に影響されないからプロトコルの策定が容易になること
- 新たな階層を増やしたり不要な階層を減らしたりしても通信が成立する点

# IP
送信元から受信先にデータを運ぶ方法を定める。
郵便は集荷所など各地の住所や、配達ルートを決める方法について定める必要があり、IPはその役割を担っている。

## IPアドレス
IPにおいて送信元や受信先などを示す番号。IPv4の場合全32ビットで、それを8ビットごとに分けて表記する。
例）192.168.0.1（10進数表記）
例）11000000.10101000.00000000.00000001（ビット表記（2進数））

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/1e4f5c39-fd07-a120-616d-3b7852ba9175.png">

ネットワーク部：ネットワーク固有の番号が入る
ホスト部：個々のコンピュータを表す番号が入る。基本的に自由に割振れる（全て0または1を除く）

#### プライベートIPアドレス・グローバルIPアドレス
192.168.0.1はプライベートIPアドレスの一種。
以下は、LAN（Local Area Network）状の機器どうしのみがアクセスできるプライベートIPアドレスに指定できる範囲。グローバルIPアドレスとして使うことはできない。

- 10.0.0.0〜10.255.255.255
- 172.16.0.0〜172.31.255.255
- 192.168.0.0〜192.168.255.255

#### ローカルループバックアドレス
ループバックとは「自分自身にデータを送る」＝ローカルループバックアドレスは、自分自身を参照するためのアドレス。特別なIPアドレス。
このアドレスを使うことで、ローカルにあるデータをまるでインターネット状にあるデータのように見ることができ、Web開発の現場ではとても重宝する

- 127.0.0.1〜127.255.255.254

127.0.0.0のようなホスト部のビットが全て0のアドレスは「未指定アドレス」（アドレスを割り当てられていないホストが持つアドレス）、127.255.255.255のようなホスト部のビットがすべて1のアドレスは「ブロードキャストアドレス」（同じネットワークの機器全てに信号を送る際に使用するアドレス）にあたるため使用できない。

#### ネットワークアドレスとホストアドレス
32ビットで構成されるIPv4のIPアドレスは、ネットワークアドレスの部分とホストアドレスの部分に分けられる。
イネターネットを利用するためにはインターネットサービスプロバイダを通しての契約が必要。これはインターネットサービスプロバイダや教育期間などの組織が、イネターネットの一部文のネットワークを管理しているため。
インターネットの一部を「サブネット」と呼ぶ。ネットワークアドレスはサブネットどうしを識別するためのアドレスで、ホストアドレスはサブネット内の機器どうしを識別するためのアドレス。ネットワークアドレスの長さは可変で、CIDRやサブネットマスクによって示される。

#### CIDR
プライベートIPアドレスの範囲を以下、プライベートIPアドレスとして割り当てられていると言い換えれる。
スラッシュで区切られた右側の数値は、ネットワークアドレスの桁数で表記するCIDR（Classless Inter-Domain Routing）（サイダーと読む）表記。
桁数は2進数で考えた時のもので、10.0.0.0をビット表記すると、00001010.00000000.00000000.00000000の32桁。「10.0.0.0/8」はこの左8桁がネットワークアドレスであることを示し、それより残りの右側24桁がホストアドレスであることもわかる。

- 10.0.0.0〜10.255.255.255 = 10.0.0.0/8
- 172.16.0.0〜172.31.255.255 = 172.16.0.0/12
- 192.168.0.0〜192.168.255.255 = 192.168.0.0/16

#### サブネットマスク
CIDR表記と同様に、ネットワークアドレスの桁数を表現する仕組み。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/68dd847d-7c11-a4f9-d23f-2601b981350b.png">

## ICMP
- エラーレポート
    - 何かの理由でIPパケットを破棄したら、破棄した機器がICMPによって破棄したIPパケットの送信元にエラーレポートを送る。＝到達不能メッセージ
- 診断機能
    - IPのエンドツーエンド通信ができるかどうかの確認。よく利用するコマンドにpingコマンドがある。

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/aa2c392b-7011-700a-926f-0e4941a010d5.png">

1. 宛先：ホスト２、送信元：ホスト１
2. 何かの理由でホスト１からホスト２宛のIPパケットを破棄
3. 宛先：ホスト１、送信元：R2<br>ICMP到達不能メッセージでのIPパケットを破棄した理由を送信元のホスト１へ通知

### ping
PINGコマンドで、ICMPエコー要求／応答メッセージを送受信することで、指定したIPアドレスとの間で通信ができるかどうか確認できる。

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/b6475593-fae2-13cb-83d7-d12257aa2f4f.png">

1. pingコマンド実行（ping 192.168.1.100）
2. ICMPヘッダにエコー要求メッセージであることを記述している「送ったデータをそのまま送り返してください」
3. ICMPヘッダにエコー応答メッセージであることを記述している「送ってくれたデータです」

## ARP
役割：PCやサーバなどのインタフェースはMACアドレスで識別している。TCP/IPのIPアドレスとインタフェースを識別するためのMACアドレスを対応づける。

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/63b9ffdd-cf83-1268-a9c6-f1cf103edcf1.png">

IPアドレスとMACアドレスを対応づけることをアドレス解決と呼ぶ。

ARPのアドレス解決の範囲は同じネットワーク内のIPアドレス。イーサネットインタフェースで接続されているPCなどの機器がIPパケットを送信するために宛先IPアドレスを指定した時に、自動的にARPが行われる。

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/8bc3aa00-d0c2-a35b-3ff2-09679db95c69.png">

1. ARPリクエストでIPアドレスに対応するMACアドレスを問い合わせる
2. 問い合わされたIPアドレスを持つホストがARPリプライでMACアドレスを教える
3. アドレス解決したIPアドレスとMACアドレスの対応をARPにキャッシュに保存する
4. ARPリクエストを受信しても破棄する

# TCP
データが確実に相手に届くことを保証するためのプロトコル。セッション（通信の開始・終了）の管理や、データの欠損がないかのチェックについて定めている。
IPはセッションの管理がなく、相手に届いたかの確認ができない。データを小さな単位であるパケットの順番のチェックなどもしないから、相手に届くデータが送るデータと同一かは保証されない。

TCPによるデータ転送の流れ
1. TCPコネクションの確立
2. アプリケーション間のデータの送受信
3. TCPコネクションの切断

## ipconfig
TCP/IPの設定を表示。

確認出来る項目

- IPアドレス
- サブネットマスク
- デフォルトゲートウェイ
- DNS

## パケット
各層が通信に必要な情報を追加／削除してデータを届ける

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/3cae08a5-1954-e619-b06b-143456f9875f.png">

1. 受信側のDBMSへ届けたいデータ／送信側から受け取ったデータ
2. TCPのヘッダがつくことでTCPセグメントが作られる／TCPヘッダを削除してDBMSへデータを渡す
3. TCPセグメントの前にIPヘッダがつくことでIPパケットが作られる／IPヘッダを削除してTCPへTCPセグメントを渡す
4. IPパケットの前後にデータがついてイーサネットのフレームになり、電気信号として外に出る／電気信号として入ってきたパケット（フレーム）は前後のデータを削除し、IPへIPパケットを渡す

- TCP/IPと階層とデータの呼び方
    - アプリケーション層：メッセージ
    - トランスポート層：セグメントまたはデータグラム
    - インターネット層：おアジェットアタはデータグラム
    - ネットワークインターフェイス層：フレーム
    
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/37e32075-e972-8d93-7448-15a33c851ecb.png">

## コネクション型
データ転送の前に接続（コネクション）の確立を要求する「コネクション型」のプロトコル。
TCPが接続の確立を行うために取る手法を「Three-Way Handshake」。

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/892990da-f6b6-bf2c-1f5d-6369ac7d4910.png">

1. 接続を要求する側は、接続の確立を行ってよいか相手のサーバに要求の信号を送る（SYNを送る）
2. 受け取った相手は、OKなら許可の信号を送る（受け取ったことを示すACKとSYNを送る）
3. 許可の信号を受け取ったら、接続を開始する合図の信号を送る（受け取ったことを示すACKを送る）

IPのように接続の確立を行わず通信を始めるのを「コネクションレス型」のプロトコルという。

## ネットワーク到達性
TCPはデータの欠損を起こさないためにシーケンス番号を使う。送信側は送るデータの1Byteごとに連続したシーケンス番号を付け、あるシーケンス番号のところまでデータを送った後は、受信側が次のシーケンス番号（データの続き）を要求してくるのをまつ。

一定時間待っても要求が戻ってこない場合や要求してくるシーケンス番号が誤っている場合は、データが正しく届かなかったと判断してもう一度送った部分を送り直す。再送処理によって、TCPはデータの同一性を保証している。

## ポート番号
TCPは、同時に複数の通信を可能にするためにポート番号を使用する。
ポートはデータを渡す窓口となる部分で、アプリケーションプロトコルに応じて使うポートが番号が定められている。0〜65535まであるが、特に使われるプロトコルのポート番号（ウェルノウンポート番号）は0〜1023に割り当てられる。

|名称|ポート番号の範囲|意味|
|:---|:---|:---|
|ウェルノウンポート|0〜1023|サーバアプリケーション用に予約されているポート番号|
|登録済みポート番号|1024〜49151|よく利用されるアプリケーションのサーバ側のポート番号|
|ダイナミック／プライベート番号|49152〜65535|クライアントアプリケーション用のポート番号|

データを要求するクライアントは、相手のサーバのIPアドレスとポート番号を指定し、通信を要求する信号を送る。
要求に応えるサーバは、あらかじめポート番号を解放しておき、要求を受け取ったらデータを送信するなどの処理を開始する。
ポート番号の指定がないと、サーバはどのアプリケーションにデータを渡せばいいかわからない。

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

# UDP
PCサーバなどに届いたデータを適切なアプリケーションに振り分けるためだけの機能を持っているプロトコル。TCPのような確認は一切しない。
UDPヘッダフォーマットは、TCPヘッダフォーマットに比べると極めてシンプル。
TCPに比べると、余計な処理をしないので、データの転送効率が良いというメリットがある。
大きなサイズのデータを分割する機能もない。

例）

- IP電話

# トラブルシューティング
## ping
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/5b038e12-d737-5441-e738-42aba116af9c.png">

1. 「ping IPアドレス」による確認＝IPレイヤとイーサネットレイヤ（物理レイヤ）まではOK
2. 「ping ホスト名」による確認＝名前解決とIPレイヤまではOK
3. 「ping 他のマシン（目的のネットワーク）」やトレースルートによる確認
4. 「netstat -a」や「telnet ホスト名 ポート番号」による確認
5. hostsファイルや nslookupによる名前解決の確認
6. アプリの設定確認

## netstat
OSの統計情報。OSが起動してからの累積値。

コリジョン（collision：衝突）：パケットとパケットの電気信号がケーブル上で衝突する現象。