TCP/IPによる通信処理の流れ

　最近、TCP/IPに関する技術書を読んだので、そのアウトプットとして記事を書きました。

# 前提となる、基本的な用語について
　いきなりTCP/IPについて説明するのではなく、説明に必要な用語をザックリまとめます。

![図1.プロトコルの階層構造.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448205/8986b87e-1e6f-85c5-ee0a-85f35b21a143.png)
 
## プロトコル
　コンピュータ同士の通信のために必要な約束事。これを遵守することで、コンピュータ同士のOSやCPUに違いがあっても、問題なく通信することができます。
## インタフェース
　上位層と下位層の間でサービスのやり取りをするときの約束事。
## パケット
　データ通信量の単位。コンピュータ同士の通信では、大きなデータをパケットに分割して送受信を行います。
## ヘッダ
　パケットの先頭にある、自身のアドレスや宛先のアドレス等の情報が書かれる部分。送信先と送信元で、同じインタフェースで情報をやり取りする際に、データ解析のために用いられます。

# OSI参照モデルとは
　通信に必要な機能を7つの階層に分けた、プロトコルの単純化モデル。国際標準化機構によって作成されました。現在は後述するTCP/IPのほうが広く普及しており、OSI参照モデルは通信の概念を理解するためのモデルとして利用されています。
 
**表1.OSI参照モデル各層の役割**

<table>
  <tr>
    <th>  </th> 
    <th>層</th> 
    <th>機能</th>
  </tr>
  <tr>
    <td>7</td>
    <td>アプリケーション層</td>
    <td>電子メールやファイル転送などのアプリケーション内で、通信に関係する部分を定める</td>
  </tr>
  <tr>
    <td>6</td>
    <td>プレゼンテーション層</td>
    <td>機器固有のデータ形式を、ネットワーク共通のデータ形式に変換する</td>
  </tr>
  <tr>
    <td>5</td>
    <td>セッション層</td>
    <td>通信路の確立や切断など、データ転送に関する管理を行う</td>
  </tr>
  <tr>
    <td>4</td>
    <td>トランスポート層</td>
    <td>通信路の確立や切断処理を実行し、データ転送の信頼性を保証する</td>
  </tr>
  <tr>
    <td>3</td>
    <td>ネットワーク層</td>
    <td>データ配達の経路選択を行い、宛先までデータを届ける</td>
  </tr>
  <tr>
    <td>2</td>
    <td>データリンク層</td>
    <td>通信媒体で直接接続された機器同士のデータのやりとりを仲介する</td>
  </tr>
  <tr>
    <td>1</td>
    <td>物理層</td>
    <td>0と1のデータを電圧やパルスに変換し、通信媒体に流し込む</td>
  </tr>
</table>

## 通信処理の例(OSI)
　例として、ホストAからホストBへメールでメッセージを送る場合を考えます。
 
![図2.OSI参照モデルで見る通信の例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448205/ff4904b6-abe1-3f68-9c05-211ca4efb7ba.png)

　ホストA(送信側)は、上位層から渡されたデータに、自身の階層の処理に必要な情報(宛先の情報など)をヘッダとして付与しています。
　ホストB(受信側)は、送信側とは逆の動作を行い、受信データをヘッダと上位層へ渡すデータに分割します。最終的に、受信側のアプリケーション層でメールのメッセージを読むことができます。

# TCP/IPとは
　文字通りTCPとIPの2つのプロトコルを指しますが、「通信に必要なプロトコル群の総称」という意味合いで説明されることがあります。

## TCP
　データ送信の開始前に、送信側と受信側の間で回線接続を行う、コネクション型のトランスポート層のプロトコル。信頼性のある通信を実現したい場合に利用されます。

## UDP
　回線接続等は行わず、任意のタイミングでデータを送信・受信する、コネクションレス型のトランスポート層のプロトコル。高速な通信やリアルタイム性が求められる通信を実現したい場合に利用されます。

## IP
　ネットワークを跨いでパケットを配送し、送信先にパケットを送り届けるためのプロトコル。IPアドレスという識別子を使って送信相手を識別します。
(IPアドレスについての詳細な説明は、本記事では割愛します)
 
# TCP/IPとOSI参照モデルの比較
　TCP/IPの階層モデルは、OSI参照モデルに当てはめることができます。

**表2.OSI参照モデルとTCP/IPの関係**

<table>
  <tr>
    <th>OSI参照モデル</th> 
    <th>TCP/IP階層モデル</th>
    <th>機能</th>
    <th>使用規格/プロトコル</th>
  </tr>
  <tr>
    <td>アプリケーション層</td>
    <td rowspan ="3">アプリケーション層</td>
    <td rowspan ="3">Webアクセスやメールなど、ユーザがアプリを操作するために認識しやすい形でデータを表現する</td>
    <td rowspan ="3">HTTP、SMTP</td>
  <tr>
    <td>プレゼンテーション層</td>
  </tr>
  <tr>
    <td>セッション層</td>
  </tr>
  <tr>
    <td>トランスポート層</td>
    <td>トランスポート層</td>
    <td>アプリのポート番号を識別して、アプリ間の通信を実現する</td>
    <td>TCP、UDP</td>
  </tr>
  <tr>
    <td>ネットワーク層</td>
    <td>インターネット層</td>
    <td>IPアドレスをもとにパケットを転送する</td>
    <td>IP</td>
  </tr>
  <tr>
    <td>データリンク層</td>
    <td rowspan ="2">
      ネットワークインタフェース層<br/>
      (ハードウェア)
    </td>
    <td rowspan ="2">
      ・同一ネットワーク内でデータの転送を行う<br/>
      ・0と1のデータを物理的な信号に変換して伝える
    </td>
    <td rowspan ="2">イーサネット、無線LAN</td>
  <tr>
    <td>物理層</td>
  </tr>
</table>

## 通信処理の例(TCP/IP)
　TCPによるメール送信を例とします。

![図3.TCP-IP階層で見る通信の例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448205/08a7f592-3808-01b4-3257-092f5531b53e.png)

　送受信時の各層での処理内容は、以下の表の通りです。
 
**表3.OSI参照モデル各層の役割**

<table>
  <tr>
    <th>処理順</th> 
    <th>ホスト</th> 
    <th>層</th>
    <th>処理内容</th>
  </tr>
  <tr>
    <td>1</td>
    <td>送信側</td>
    <td>アプリケーション層</td>
    <td>・送信データの形式を変換<br>・コネクションの確立を依頼</td>
  </tr>
  <tr>
    <td>2</td>
    <td>送信側</td>
    <td>トランスポート層</td>
    <td>・コネクションを確立<br>・ヘッダ付与(送受信ホストのアプリのポート番号など)</td>
  </tr>
  <tr>
    <td>3</td>
    <td>送信側</td>
    <td>インターネット層</td>
    <td>・データを渡すルータ、ホストを決定<br>・ヘッダ付与(送信元/宛先IPアドレスなど)</td>
  </tr>
  <tr>
    <td>4</td>
    <td>送信側</td>
    <td>ネットワークインタフェース層</td>
    <td>・データ送信<br>・ヘッダ付与(送信元/宛先MACアドレスなど)</td>
  </tr>
  <tr>
    <td>5</td>
    <td>受信側</td>
    <td>ネットワークインタフェース層</td>
    <td>ヘッダ解析<br>・宛先MACアドレスが自分宛か調べる<br>・上位層の処理を行うプログラムを特定し、データを渡す</td>
  </tr>
  <tr>
    <td>6</td>
    <td>受信側</td>
    <td>インターネット層</td>
    <td>ヘッダ解析<br>・宛先IPアドレスが自分のホストか調べる<br>・上位層の処理を行うプログラムへデータを渡す</td>
  </tr>
  <tr>
    <td>7</td>
    <td>受信側</td>
    <td>トランスポート層</td>
    <td>ヘッダ解析<br>・確認応答を送信側ホストへ返す<br>・ポート番号で識別したプログラムにデータを渡す</td>
  </tr>
  <tr>
    <td>8</td>
    <td>受信側</td>
    <td>アプリケーション層</td>
    <td>メールアプリが、送信されたデータを受信する</td>
  </tr>
</table>