【Webエンジニアの求人なのに】Day.4 TCP/IPを知らない　

##Webエンジニアの求人なのに TCP/IP を知らない

みなさんこんにちは。
プログラミングが趣味の地方事務職員をやっています（ @_ayk_study ）です。

先週末は私用で記事をアップできませんでした（言い訳）
Qiitaにアップする記事については、平日の朝の時間を活用して毎日コツコツ書き上げて必ず毎週末整理できるように改善していきます！

今週末もWebエンジニアの求人なのにシリーズをやっていきたいと思います。
毎度定番になってきました、下のツイートをきっかけにこれらのシリーズが誕生しました。

![3551F8E9-7F7E-4375-B809-9ACF4302652D[373].png](https://qiita-image-store.s3.amazonaws.com/0/256858/7206c878-93a6-ed63-413c-c5382a911457.png)

前回までの記事はこちら。

[【Webエンジニアの求人なのに】Day1.GETとPOSTの違い](https://qiita.com/_ayk_study/items/b2537c5f0fcaaa7ddf08)
[【Webエンジニアの求人なのに】Day2. 公開鍵暗号を知らない](https://qiita.com/_ayk_study/items/bdce50ff05546db4a9e4)
[【Webエンジニアの求人なのに】Day3.OSI参照モデル](https://qiita.com/_ayk_study/items/cceec70145d9560624b5)

では、今週もやっていきましょう。
やり方としては今までと変わらず、いろいろな参考サイトをもとに回答をつくるという流れです。

##TCP/IPとは何か（役割・背景など）

[【初心者向けに大体わかる】TCP/IPとは？](https://eng-entrance.com/network-tcpip)から引用すると、

>TCP/IPとはインターネットなどで一般的に使われるプロトコル（手順のようなもの）で、TCP「Transmission Control Protocol」とIP「Internet Protocol」を組み合わせたものだ。

プロトコルとは最近まとめた記事でも出てきました、通信規約のことですね。TCPとIPという通信規約があり、それを組み合わせたものだと言っています。

さらに、
①[Windowsネットワークの基礎：第6回　TCP/IPの概要](http://www.atmarkit.co.jp/ait/articles/1503/05/news135.html)
②[TCP/IP 4階層モデルとは？](https://thinkit.co.jp/story/2015/04/30/5800)
にTCP/IPの詳細が説明されていたのでいくつか引用します。

###TCP/IPの背景について
②のサイトに、OSI参照モデルとTCP/IP階層モデルの比較がありました。
**TCP/IPはOSI参照モデルよりも古いものなのですね。**

>インターネットで使われているTCP/IPプロトコルは、OSIモデルに沿っていません。OSIモデルが構築される以前から、実用的なネットワークとして稼働していたということもありますし、ネットワークの普及期に、多くの機種、OS、ネットワーク方式、アプリケーションが登場したから、OSIモデルのような詳細な階層分けが必要になったとも考えられます。
TCP/IPの実用化はOSIモデルよりも古いのですが、OSIモデルとは異なるものの、ちゃんと階層化されています。OSIモデルの7階層に対し、TCP/IPモデルは4階層で、かなり少なくなっています。TCP/IPが設計されたころの通信/ハードウェア/ソフトウェアの環境は、今と比べれば格段に簡素なものであり、アプリケーションの数、データの種類や表現方法などが限られていたため、OSIモデルより単純な構成で十分だったのでしょう。

![5800_main_8.png](https://qiita-image-store.s3.amazonaws.com/0/256858/763a5e36-2b91-6912-a437-2f0eeb0cd67a.png)
（②のサイトから引用）


###TCP/IPの役割について
上記の図からわかるように、TCP/IPは４階層のプロトコルです。
また、４階層のプロトコルは以下のような役割をもっています。
>1 アプリケーション層は、TCPやUDPを使うアプリケーションに相当する。（アプリケーション間のやりとり）
2 トランスポート層では、上位のアプリケーション間での通信を担当する。（プログラム間の通信、通信の制御）
3 ネットワーク層では、2台のホスト間での通信を担当する。2台のホストが異なるネットワークに属している場合は、このネットワーク層で（ルーターが）中継しながら、パケットを目的のホストまで届ける。（インターネットワークでの通信）
4 ネットワークインターフェース層は、イーサネットや無線LANなど、実際の物理的なネットワークインターフェースとそのドライバーに相当する。（同一ネットワーク上での通信、ハードウェア仕様など）

※インターネット層はネットワーク層ともいう？（サイトによって言い方が違ったので本記事ではネットワーク層で統一しています。）



またそれぞれの層の中でどのようなことが起こっているのかは、以下のとおりです。

>【アプリケーション層】　
ブラウザがリクエストメッセージを作成する。OSのTCP/IP処理ソフトがトランスポート層と呼ばれるところにデータを渡す
【トランスポート層】　
トランスポート層のTCPというプロトコルでTCPヘッダが付けられる（データの先頭にそういうデータがくっつく）
【ネットワーク層】　
続いてネットワーク層というところにデータは送られ、ここでIPヘッダ（行き先などのデータ）がくっつく
【ネットワークインターフェイス層】　
続いてMACヘッダなどのヘッダ情報がさらにくっつき、LANアダプタからデータが送られる

ネットワーク層などについては前回の[【Webエンジニアの求人なのに】Day3.OSI参照モデル](https://qiita.com/_ayk_study/items/cceec70145d9560624b5)で出てきましたね。また、ヘッダの話も出てきましたね。



![wi-netfig01.png](https://qiita-image-store.s3.amazonaws.com/0/256858/a3b31182-62a3-69d2-7165-7d980be862e2.png)
（①のサイトから引用）


また、TCP/IPとその関連プロトコルは様々あり、例えば、上記図に記載されているとおり、TCP、UDP、IP、ICMP等などのいろいろな種類のプロトコルがあり、それぞれ役割が異なります。


以下、詳しく見ていきましょう。
##TCP/IP関連プロトコル
TCP/IP関連プロトコルとは、TCPやIP以外のプロトコルを含めた言い方。（実際「TCP/IP」という言い方もほかにも関連するプロトコルはあるが、まとめて「TCP/IP」といっている）


####TCPプロトコル（トランスポート層）####
2つのアプリケーション間で「セッション指向」で「信頼性のある」双方向通信を実現するためのプロトコル。
セッション指向とは、あらかじめ2台のコンピューター間で通信回線を確立してから相互に通信する方式。
信頼性のある通信とは、送信したデータが正しく相手に届くことが保証され、何らかの理由で送信が失敗した場合には自動的に再送信するなどして、確実に相手にデータを届ける通信のこと。

####UDPプロトコル（トランスポート層）####
2つのアプリケーション間で「データグラム指向」の通信サービスを提供する。データグラム通信では、通信に先立って通信路を開設する必要はなく、データを一方的に送りつけるだけである。

####IPアドレス（ネットワーク層）####
「IP（Internet Protocol）アドレス」は、TCP/IPを使ったネットワークにおいて、お互いのシステム（ホストやノードとも言う）を区別するための重要な識別子である。TCP/IPネットワークではこのIPアドレスによって通信相手を識別・特定する。

IPv4では32bit、IPv6では128bitであり、ネットワークに接続される機器が増え、アドレス空間が不足するようになったことにより128bitのIPv6が開発されたとのこと。

※IPアドレスの設定
TCP/IPネットワークが正しく動作するためには、各ホストは、起動時に正しいIPアドレス（ネットワークアドレス＋ホストアドレス）を自分自身に割り当てる必要がある。他のホストと重複するようなIPアドレスを付けたり、自分の属しているのとは異なるネットワークアドレスを設定したりすると、他のホストと通信できなくなってしまう。
現在では、IPアドレスの設定は自動設定が普通である。

####IPプロトコル（ネットワーク層）####
「IP（Internet Protocol）」プロトコルはネットワーク層のプロトコルであり、2つのホスト間でのデータグラム指向のパケットの送受信を行う。TCPやUDPは、このIPプロトコルを使ってその機能を実装している。

※　TCP/IP通信でエラーなどが発生した場合、IPパケットの送信元に伝えるために使われるのは、ICMP（Internet Control Message Protocol）という補助的なプロトコル。IPv4とIPv6に応じて、ICMPv4とICMPv6がそれぞれ定義。

ほかにも関連プロトコルはありますが、今回はかなり詳細になってしまうため、割愛します。

##TCP/IPとは何か。に対する回答（案）
**「TCP/IPとは、ネットワーク上のデータのやりとりに使用されている、標準的な通信規約である。
アプリケーション層、トランスポート層、ネットワーク層、ネットワークインターフェイス層の４階層からなり、主なプロトコルとしてTCPとIPがある。
具体的な役割として、TCPは双方向通信・信頼性のある通信を行い、IPは、データの送り先を識別・特定するための識別子である。」**


##最後に：OSI参照モデルとどう違うの？
これは私のふとした疑問でしたが、調べてみると、**とにかくOSI参照モデルとTCP/IPは全くの別物だ**というように考えたほうがいいようです。
まず、作られた経緯が違う、作った機関が違うということと、ネットワークをつなぐための通信規約という点では同じ目的をもったものですが、現在ではTCP/IPが普及しており、事実上のルールはTCP/IPが担っているのではないでしょうか。

（参考：比較サイト）
[TCP/IP と OSI 参照モデル](http://x68000.q-e-d.net/~68user/net/osi7.html)
[TCP/IPをはじめから](https://www.infraexpert.com/study/tcpip.html)


さて、今回もざっくりでしたがTCP/IPについてまとめてみました。
細かいところは割愛しましたが、前回のOSI参照モデルと合わせてネットワーク上でのデータ通信についてかなり理解が深まったと思います。
何か間違っている記述がありましたらコメント欄にて、ご教示ください。


##他参考サイト
・公開されていたとある方のパワポ（かなり詳細）
[TCP/IPプロトコル階層と通信モデル](http://www.isc.meiji.ac.jp/~mizutani/ict/communication.pdf)