通信周りに疎いエンジニアがTCP/IPの要点を頑張って教えます

#はじめに
昔から通信周りの知識が足りない事は自覚していましたが、
なんとか仕事はできていたので、騙し騙し日々を過ごしていました。
しかし最近、自分の携わるサービスの通信プロトコルが変更されることになり、
否応なしに通信周りについて学ぶことになりました。
一通り学んだ後に、もっと早く知っておけば良かったなと感じて後悔しましたが、
仕方ないので、情報の整理と復習も兼ねて学んだ事を一通りまとめておきました。
僕と同じように通信周りに苦手意識を持っている人がこの記事を読んで理解して頂ければ幸いです。

**この記事のターゲット**

- TCP/IPの階層モデル(OSI参照モデル)という言葉になんとなく苦手意識を持っている人
- 通信プロトコルの用語を聞くと(ー'`ー;)ムムッっとなってしまう人
- 社会人４年目にして通信周りに未だ苦手意識を持っているエンジニア

**この記事の要約**

- TCP/IP階層モデル
 - 送信時は上から下の層にデータが流れて、送信データには各層のヘッダが付加される
 - 各層は役割分担されていて、それぞれ明確な役割をもっている
 - 送信先の各層は、送信元の自分と同じ層が送った情報を元に役割を果たす
 - 通信時は各層のプロトコルを組み合わせて行う
- 各層の役割
 - アプリケーション層：サービスで使うデータを取り扱う
 - トランスポート層：ポート番号を元に宛先のアプリケーション層にデータを渡す
 - インターネット層：IPアドレスを元にデータを宛先のインターネット層まで届ける
 - ネットワークインターフェース層：MACアドレスを元にデータを宛先のNICまで届ける

##TCP/IP階層モデル
TCP/IP階層モデルは、コンピュータの通信の仕組みをOSI参照モデルよりも粗い粒度でを表したものです(表1)。OSI参照モデルは全部で7層ありますが、**TCP/IP階層モデルは全部で4層**です。OSI参照モデルよりも簡単そうな気がしたので、横着な僕はこちらのモデルで勉強することにしました。

表1: TCP/IP階層モデルとOSI参照モデル
![スクリーンショット 2015-09-19 午前1.22.34.png](https://qiita-image-store.s3.amazonaws.com/0/50185/45a2c5ad-1a30-be83-ccde-0b1cbfec93bb.png)

この階層モデルで重要なことは以下の４つです。

**⑴送信時は上から下の層にデータが流れて、送信データには各層のヘッダが付加される**
送信時、アプリケーション層で作成したデータは、トランスポート層に渡され、
その後、トランスポート層からはインターネット層に渡され、
さらに、インターネット層からはネットワークインターフェース層にデータが渡されます。
ここで重要なのが、各層を通過する時には通過層のデータを、
送信データにヘッダという形で付加しするということです。
受信時はこの逆にデータが流れていきます。

![スクリーンショット 2015-09-19 午前1.22.53.png](https://qiita-image-store.s3.amazonaws.com/0/50185/74efee4e-d78b-2144-8c8b-2a948e3ce8db.png)
図1: TCP/IP階層モデルにおけるデータの流れ

**⑵各層は役割分担されていて、それぞれ明確な使命をもっている**
例えば、トランスポート層はTCPやUDPと言ったプロトコルを持っていますが、この層の使命は「アプリケーション層からもらったデータを宛先のアプリケーション層に渡す事」であり、TCPやUDPというのは、「使命を果たす手段」になります。
各層には複数のプロトコルが存在し、それらのプロトコルを全くの別物としてとらえてしまい、TCP/IP全体像の理解をし辛くしているように思います。TCPもUDPも宛先のアプリケーション層にデータを渡すという使命は同じです。手段（プロトコル）は違えど使命は同じと思えば、なんとなく理解できそうな気がしますね。

**⑶送信先の各層は、送信元の自分と同じ層が送った情報を元に使命を全うする**
例えば、インターネット層の使命は「IPアドレスを元に、データを宛先のコンピュータまで届ける事」です、送信元のインターネット層では自分と宛先のIPアドレスの情報を送り、送信先では自分のIPアドレス宛かをチェックし、自分宛でない場合は宛先のIPアドレスを元にデータを転送し、自分宛の場合はデータを受け取ります。

**⑷通信時は各層のプロトコルを組み合わせて行う**
よくある例として、webページを表示する場合は
アプリケーション層のプロトコルはHTTPで、トランスポート層はTCP、インターネット層はIP、ネットワークインターフェース層はEthernet。というように、各層で複数のプロトコルから適切なものを選んで通信を行います。また、TCP/IPという言葉は、TCPプロトコルとIPプロトコルをあわせて通信する事を指すだけでなく、アプリケーション層からネットワークインターフェース層までのプロトコルすべてを指してTCP/IPとも呼びます。

## TCP/IP階層モデルの各階層について
次に、TCP/IP階層モデルの各層について説明していきます。
各層についての要点を説明し、代表的なプロトコルを示します。

### アプリケーション層
この層を一言で言えば、アプリケーションで使用するデータを取り扱う層です。
アプリケーションエンジニアの方には最も馴染みのある層で、
ウェブサービスの制御もこの層で行います。

####代表的なプロトコル
|プロトコル|用途|
|:--|:--|
|HTTP(S)|ウェブページのデータのやり取りを行う。HTTPはセキュアに行う|
|SMTP|メール送信する|
|SSH|セキュアにコンピュータを遠隔操作する|
|SSL|セキュアにデータのやり取りを行う|
|DHCP|ネットワークに参加したコンピュータにIPアドレスを動的に割り当てる|
|DNS|URLとIPアドレスの対応付けを行う|

### トランスポート層
この層を一言で言えば、ポート番号を元に宛先のアプリケーション層にデータを渡す層です。
アプリケーション層のデータを宛先のアプリケーション層に届けるには、
予め送信先との接続を確立させる必要があります。
送信元で使用するポートを自動的に決定した後、送信先のポートに接続を確立させます。
接続後は送信元ポートにデータを流す事で、宛先のポートにデータが届けられるようになります。

これをclient_1とhttpサーバであるserver_1のコンピュータ間で通信する場合を例にとって説明します。
client_1では通信に使用するポートを自動的に割り当てます。
ここでは49999ポートが割り当てられたとしましょう。
次に、client_1の49999ポートとserver_1の80ポートで接続を確立させます。
以降は49999ポートにアプリケーション層からデータを流すと、
server_1の80ポートにデータが届き相手のアプリケーション層に無事データが届けられます。

補足ですがクライアント側で割り当てるポートをダイナミックポートと言い、
クライアントからサーバに接続する時に、クライアント側のアプリケーションから自動的に割り当てられます。

###代表的なプロトコル
|プロトコル|説明|
|:--|:--|
|TCP|正確性重視でデータを送信する|
|UDP|速度重視でデータを送信する|
※トランスポート層は主に上の２つだけ覚えておけば良いようです。

### インターネット層
この層を一言で言えば、IPアドレスを元にデータを宛先まで届ける層です。

データを宛先まで届ける役割はルータが担っており、ルータが宛先までの経路を探索（ルーティング）して、データが宛先まで届けられます。クライアントが異なるネットワークにデータを送信する時にはルータに対してデータが送信され、複数のルータを経由することで相手まで届けられます。

###代表的なプロトコル
|プロトコル|説明|
|:--|:--|
|IP|IPアドレスを元に相手までデータを届ける|
|ICMP|通信時のエラーを検出する|
|ARP|ネットワーク内の指定IPを持つMACアドレスを調べる|

### ネットワークインターフェース層
この層を一言で言えば、MACアドレスを元にデータを宛先まで届ける層です。
コンピュータのNICには世界でただ一つのMACアドレスが割り振られております。
MACアドレスに対応するIPアドレスを取得するにはARPで取得します。
データ転送先のIPアドレスをブロードキャストし、該当するIPアドレスを持つマシンのみ
応答パケットを送り返すことでMACアドレスとIPアドレスの対応付けを行います。

###代表的なプロトコル
|プロトコル|説明|
|:--|:--|
|イーサネット|ケーブルによってデータを転送する|

#さいごに
結構単純な事なのになぜ今までちゃんと調べなかったのだろうかと、まとめていて反省する事ばかりでした。ただ、これらについて学び直し、各層に関連する技術についての理解を深め、自サービスで扱うプロトコルのヘッダ情報等学び直す事で、エンジニアとして一段階成長できた気がしました。