TCP/IP階層モデルの概要

## はじめに
　プロトコルを体系的に理解するための記事。
　TCP/IPモデルに準拠して記述してある。

<br>









<br>

## 階層モデル
　プロトコルを役割毎にレイヤーとして分類したもの。

　階層モデルには、TCP/IPモデルとOSI基本参照モデルがある。
　現在は、TCP/IPモデルがデファクトスタンダードである。

<br>









<br>

# TCP/IPモデル
　プロトコルを4層に分類している。
 
　　　　<img width="400" alt="TCP/IP Model" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1620826/69cff25c-b995-8c1c-0459-d55b30f601f4.jpeg">

　各層のプロトコルは、データ本体にヘッダーやトレーラを付加する。
　ヘッダーに自身の役割を果たすために必要な情報を格納して通信を行っている。
 
　例えば、インターフェース層ならIPアドレスを、
　ネットワークインターフェース層ならMACアドレスの情報を格納している。

　　　　<img width="550" alt="paket" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1620826/1db945fa-5a1c-87b7-e8a8-45eb5695bbb7.jpeg">

<br>

## アプリケーション層
　サーバとクライアント間でやりとりする、
　メッセージや命令の形式を取り決めたプロトコル群。

:::note info
　つまり、送受信するデータ本体を記述するためのルールである。
:::

### ・HTTP
　webサーバとwebブラウザがやりとりする、HTTPメッセージの形式を定めたプロトコル。
　HTTPメッセージは、リクエストとレスポンスの2つに分類される。

　**HTTPリクエスト**
　webブラウザ側が送信するメッセージのこと。
　URLが示すドメインにあるサーバに対して、
　閲覧したいファイル名と自身の情報を添えてメッセージを送信する。

　**HTTPレスポンス** 
　webサーバ側が送信するメッセージのこと。
　HTTPリクエストに対して送信される。
　ファイル本体やその情報が含まれている。

　**ステートレス型**
　HTTPはステートレス型のプロトコルである。
　そのため、クッキーを利用してセッションを維持している。

:::note info
クッキー：
　サーバがクッキーを発行し、レスポンスヘッダに埋め込む。
　クライアントはそれを保存し、
　以後同じドメインと通信する際にヘッダーに追加して通信する。
　クッキーには期限があり、それを過ぎると自動的に削除される。
　内容は、セッションIDなど見られても問題ないもの。
:::

　**webサービス、webアプリ**
　webページ用のHTTPを利用したサービスのこと。
　検索エンジンやショッピングサイト、IP電話、動画共有サービスなど。

　webページとの違いは元々あるHTMLファイルを返すか、
　サーバ内プログラムが生成したHTMLを返すかである。

:::note info
背景：
　従来まではサービス毎にアプリケーション層プロトコルや、
　サーバクライアント用プログラムを用意していた。
　新しいサービスを提供する際に、新しいプロトコルを作成し普及させるより
　既存のHTTPを利用することで費用や労力を抑えることができる。
:::

<br>

### メール用プロトコル
　ステートフル型なので、終了コマンドが送られるまで通信は継続する。
 
**・SMTP**
　送信用プロトコル。
　メールソフトとサーバ、サーバとサーバ間で使用されている。

**・POP**
　受信用プロトコル。
　サーバからメールをダウンロードし、メールソフト側で管理する。

**・IMAP**
　受信用プロトコル。
　サーバ側がメールを保管する。

**・MIME**
　電子メールでASCII以外のデータを扱えるようにする拡張機能。
　MIMEタイプでデータ型を指定する。

<br>

### ファイル共有/転送プロトコル
**・SMB/AFP**
　LAN内でファイルやプリンタを共有する時に使用する。

**・FTP**
　インターネット上で、サーバなどにファイルを転送する時に使用する。
　コマンドで操作する。

　**コネクション**
　　FTPは、コントロールコネクションとデータコネクションの
　　2つの回線に分かれて通信を行う。
　　コントロールコネクションは、認証やコマンド送信、
　　データコネクション接続のための通信を行う。
　　一方データコネクションは、ファイルを転送する。

:::note info
なぜコネクションを分ける？：
　データ転送中でもコマンドを送ることができるため、
　効率化を図ることができる。
:::

　**モード**
　　データコネクションをサーバとクライアントのどちらから接続を開始するかによって、
　　アクティブモードとパッシブモードにわかれる。
　　アクティブはサーバから、パッシブはクライアントから開始する。

:::note warn
アクティブモードの注意点：
　ファイアウォールやルータは、外部から開始される通信を拒否してしまう。
　そのため、アクティブモードでは接続できない可能性がある。
:::

### 遠隔操作プロトコル
　遠隔操作を行うには、
　クライアント側は、クライアントソフトが必要であり、
　サーバ側は、操作を受け付けるプログラム(sshdなど)が必要である。

　クライアントソフトは、windowsでは、Tera TermやPuTTY。
　Macの場合は、ターミナルからクライアントソフトを起動することができる。

**・Telnet**
　遠隔地にあるコンピュータをコマンドを送って操作する。

**・SSH**
　データを暗号化して、遠隔地にあるコンピュータを操作する。
　暗号化には、ハイブリッド暗号方式が採用されている。
　SSHは、接続を22番ポートで受け付けている。

:::note info
デフォルトでは、利便性を考慮して電子証明書は利用しない。
:::

<br>

### DHCP
　LAN内のコンピュータに、プライベートIPアドレスを割当てる時に使用するプロトコル。
　DHCPサーバ機能を持った機器(家庭ではルータ)が、
　自身と接続したコンピュータに一意のIPアドレスを割り振る。

<br>

## トランスポート層
　データを適切なアプリケーションに届けるためのプロトコル群。
　ポート番号によってアプリケーションを識別している。

:::note info
ポート番号：
　インターネット上でパケットを送信する際に、
　IPアドレスによって宛先のコンピュータを識別することはできる。
　しかし、コンピュータ内には複数のアプリケーションが同時に起動している
　ため、どのアプリケーションにパケットを届けるのかを判断できない。
　そこで、各アプリケーションにポート番号を割り当てることで
　宛先を仕分けしている。

割当て：
　サーバが利用する各アプリケーション層プロトコル(HTTP, SSHなど)には、
　予め決められたポート番号(ウェルノウンポート)が割り当てられている。
　一方クライアント側は、毎回ランダムな番号(ダイナミックポート)が
　割り当てられて通信を行う。
:::

　トランスポート層プロトコルは、TCPとUDPの2つ。

### ・TCP
　転送速度を重視して、データを転送するプロトコル。
　IP電話や動画配信などリアルタイム通信が必要な時に使用される。

### ・UDP
　確実性を重視して、データを転送するプロトコル。
　そのため、通信はコネクション確立から始まるし、
　データが届かない場合は再送も行う。

:::note info
コネクション確立は、３ステップで行われるため
３ウェイハンドシェイクと呼ばれている。
:::

<br>

### データ形式
　トランスポート層が扱うデータは、
　TCPヘッダーが付くとセグメント、UDPヘッダーが付くとデータグラムと呼ばれる。

　TCPヘッダーにはコントロールフラグがあり、
　これによって回線の混雑状況やデータが正しく届いたかなど、
　通信を制御している。

<br>

## インターネット層
　異なるネットワーク間の機器が通信を行う際の、
　ルールを定義したプロトコル群。

### ・IP
　ネットワークの中核を担うプロトコル。
　主に以下3つが定義されている。
 
　**IPアドレスによる識別**
　　ネットワーク上の機器にIPアドレスを割り当てることで、
　　各機器を識別する。

　**データのパケット化**
　　転送するデータを分割し、パケット単位で通信する。
　　フラグメンテーションもしくは、パケット交換方式と呼ばれる。

　**ルーティング**
　　ルータが持つルーティングテーブルを元にして、
　　適切な経路を選択する。

### ・ICMP
　IPによる通信状況を確認するためのプロトコル。
　使用例は以下である。
 
　**宛先の存在確認**
 　　エコーメッセージによって宛先と通信可能か確認する。
   
　**通信制御**
　　通信回線が混雑しているかや経路が適切かなどを確認する。

　**ルータ探索**
　　自身が所属しているネットワークのルータを探す。

　**TTL(Time To Live)**
　　パケットが生存期間を超え消滅したことを知らせる。

### ・IPsec
　IPに認証と暗号化を追加したプロトコル。
　主にVPNで使用される。
 
<br>

### データ形式
　インターネット層が扱うデータは、パケットと呼ばれる。
　IPヘッダーには、送信元や宛先IPアドレス、
　パケットを１つのデータに復元するための情報などが格納されている。

<br>

## ネットワークインターフェース層
　隣接する機器間が通信を行う際のルールを定義したプロトコル群。

### ・イーサネット
　有線LANで接続された機器間が使用するプロトコル。
　ソフトウェアとハードウェア仕様を定義している。

### ・PPP
　コンピュータが1対1で通信する際に、
　仮想的な専用回線を構築するためのプロトコル。
　仕組みは、セッション確立や認証を経て通信を開始する。

### ・PPPoE
　イーサネットにPPPを組み合わせたプロトコル。
　イーサネットにはPPPの持つ仕組みがないため、
　PPPoEによってそれらを実現して通信する。

:::note info
プロバイダとのアクセス回線で使用されている。
:::

### ・WiFi
　無線LANで使用するプロトコル。

### ・ARP
　宛先のIPアドレスを元にMACアドレスを調べるためのプロトコル。
　仕組みは、ARPパケットをブロードキャストする。

<br>

### データ形式
　ネットワークインターフェース層が扱うデータをフレームという。
　フレームヘッダーには、
　プリアンブルやMACアドレスなどが格納されている。
　また、データ末尾にエラーチェック情報が格納されたトレーラも付加する。

:::note info
プリアンブルとは？：
　データの先頭を知らせるため、フレームの先頭にある情報。
　ネットワークカードは、電圧を受け取ってそれをデジタルデータに変換する。
　電圧の始まりを知らせるためにプリアンブルが必要である。
:::

**・ヘッダーは付け替えられる**
　宛先までに経由する機器にデータが着くたびに、
　フレームヘッダーは付け替えられる。
　例えば、あるルータにデータが到着すると、
　そのルータはフレームヘッダーを取り外し、宛先IPアドレスを確認する。
　次に、隣接するルータのMACアドレスをARPによって調べる。
　そしてデータにフレームヘッダーを付け直しデータを転送する。