TCP/IPとは

#はじめに#
　TCP/IPとは世界中のコンピュータを相互に通信させるためのプロトコルのことで、コンピュータ界の世界共通語のようなものです。インターネット・プロトコル・スイートとも呼ばれており、インターネットを機能させるためにはこの通信規約が必要不可欠で、インターネットを理解する上で非常に重要な要素の一つになっています。
　概念的な話になるためなかなか理解しづらく、我々初学者にとっては大きな壁になっているものの一つだと思います。


　そこで今回はTCP/IPについてなるべく簡潔に、ざっくりとイメージが掴めるような内容にしていきたいと思います。

　誤り等ありましたらご指摘いただけますと幸いです。


#TCP/IPとは#
　TCPとIPという通信規約（プロトコル）も実際にあるのですが、ここではコンピュータ同士が通信する際に使われている主要なプロトコル群という意味で使っていきたいと思います。

一言で通信といっても、さまざまな通信が存在しています。
例えばメール一つ送るのにも、

　①どんな内容のメールか
　②どうやって送るのか
　③誰に送るのか

など、さまざまな要素があります。
TCP/IPは、これらの要素を分割して、それぞれに役割を持たせた**階層モデル**になっています。

それでは、どのような階層に分かれているのか見ていきましょう。

TCP/IPでは、大きく４つの階層に分かれています。

１．アプリケーション層
２．トランスポート層
３．インターネット層
４．ネットワークインターフェース層

それでは順番に見ていきたいと思います。


#アプリケーション層#
　アプリケーション層では、アプリケーションで扱われるデータをやりとりします。具体的には、ファイルの送信、HTMLの閲覧、メールの送受信などが挙げられます。

主なプロトコルは下記の通りです。
・HTTP
・SMTP
・FTP
・DNS etc.


中でもよく使われるHTTPについて少し詳しく見ていきます。
　WebサイトのURLにhttp://〜などと書かれているアレです。これはHTTPというプロトコルを使って”〜”というドメインに要求しますよ〜という意味です。HTTPはリクエスト、レスポンスという二つの通信から成り立っています。

◆リクエスト
　コンピュータが別のコンピュータに対して、「Webサイトのこのページを見せて！」という要求を送るのがリクエストです。リクエストは、リクエストの手段（データの取得、送信など）、リクエスト先のURI、要求しているデータのドメインなどの情報が含まれています。リクエスト元のコンピュータのことをクライアントと呼びます。

◆レスポンス
　クライアントからのリクエストを受けて、「Webサイトのこのページを見せてあげよう！」とデータを返してくれるのがレスポンスです。レスポンスには、要求に対する成否、要求されたHTMLデータなどが含まれています。データを返す側のことをサーバーと言います。



#トランスポート層#
　トランスポート層では、データを適切なアプリケーションに振り分けるための階層になります。相手先のコンピュータの、どのアプリケーションに通信を送るかを指定し、コネクションを確立するという役割を担っています。
　一体どのようにして通信先のアプリケーションを振り分けているのでしょうか。これには、**ポート番号**というものが関係しています。

◆ポート番号とは
　ポート番号は16ビットの整数で構成されており、0〜65535番まであり、これを送ることでどのアプリケーションに通信するかを判別することが出来ます。例えば、クライアントからHTTP通信が行われた場合、ポート番号80番がトランスポート層のプロトコルで指定されてパケットを送ります。（パケットとは、データを小分けにしたもののことです。）すると受け取ったサーバー側はHTTPサーバーで受け取ることができ、通信を行うことが出来ます。代表的な通信のポート番号はあらかじめ決められています。

　・SSH：20番
　・SMTP：25番
　・HTTP：80番
　・HTTPS：443番　etc.

これらのポート番号は、**ウェルノウンポート番号**と呼ばれています。


トランスポート層のプロトコルにはTCP・UDPというものがあります。
それぞれの特徴についてまとめていきます。

##TCP##
　TCPの特徴は高信頼性にあります。送信するパケットの順序制御や再送制御を行います。つまり、パケットを正しい順番で送ったり、送るのに失敗した際は再度送信したりすることで、確実にデータを送信するというわけです。
　また、TCPはコネクション指向の通信をします。通信相手との間で通信を始める前に、準備をしてから行います。

　コンピュータA「コンピュータBさーーん、聞こえてるーーー？？」
　コンピュータB「はいはーーーい！聞こえてるよーー！」

イメージとしてはこんな感じです。

　このようにTCPは信頼性が高い通信なので、ファイル転送など確実データを送信する必要がある場面で使われます。

##UDP##
　対してUDPは信頼性のない通信になります。送信する際は順番もバラバラで、パケットが届いたかどうかは保証されていません。代わりに、高速で通信することができるという特徴があります。
　また、UDPはコネクションレスな通信を行うので、通信前にいちいち相手先に確認をとったりはしません。

　したがってUDPは信頼性よりもリアルタイム性が重視される場面で使われます。例えば電話やテレビ会議などです。


　このようにトランスポート層ではTCP・UDPといったプロトコルを使って送信先のアプリケーションを振り分け、コネクションを確立する役割を担っています。


#インターネット層#
　インターネット層ではコンピュータAからコンピュータBへデータを送る役割を担っています。そもそもどのコンピュータに情報を送るのか、という部分をやってくれています。コンピュータにはそれぞれ「ルータ」というものが接続されており、このルータにはリクエストされたデータをどのパソコンが持っているのか、という情報が入っています。(これを**ルートテーブル**と呼びます。)コンピュータAがリクエストを送ると、ルータが「そのデータはコンピュータBが持っているよ！」と言ってリクエストを転送してくれます。このことを**ルーティング**と呼びます。

　代表的なプロトコルには、「IP」「ICMP」「ARP」が挙げられます。中でも最もよく使われる**IP**について少し詳しく見ていきます。


##IP##
　IPとは*InternetProtocol*の略で、インターネットにおいて通信相手を特定する**IPアドレス**という番号に基づいて、パケットを届けるプロトコルになります。IPアドレスについては、[こちら](https://qiita.com/ktsuda103/items/085723f132ec53dea7bb "IPアドレスってなに？")でまとめていますので興味のある方は見てみてください。
　つまり、IPで通信を行うことで、ネットワークに接続された機器のIPアドレスを識別し、特定のコンピュータを宛先としてデータを届けることが出来ます。

　
#ネットワークインターフェース層#
　ネットワークインターフェース層はNICを動かすためのデバイスドライバになります。NIC(*Network Interface Card*)とは、簡単に言うとコンピュータ機器をネットワークに接続させるための装置です。また、デバイスドライバとは、OSがハードウェアを制御するためのソフトウェアです。つまり、ネットワークインターフェース層はNICを使って、データをネットワークへと送信する役割を担っています。

　主要なプロトコルにはEthernetやPPPなどが挙げられます。



#まとめ#

　TCP/IPとはコンピュータ同士が通信するために定められたプロトコル群のことで、これらは役割ごとに階層に分かれているということでした。

　大まかな通信の構造としては、

・ネットワークインターフェース層で機器をネットワークに接続。
・インターネット層で別のネットワークにある機器をIPアドレスで識別してデータを送信。
・トランスポート層で機器の中の特定のアプリケーションへ（ポート番号で識別）、コネクションを確立してデータを送信。
・アプリケーション層でデータを送受信。

このような流れになっています。


とりあえず今の段階ではこんな感じでざっくりとイメージを掴んでおけばいいかなと思います。



　TCP/IPはインターネットが作られた当初から使われている通信手段です。余程革新的な技術が発明されない限りは、おそらく今後も使われていく技術になると思いますので、覚えておいて損はないでしょう。