知っておきたいTCP/IP入門編

こんにちは！Life is Tech!でWebサービスプログラミングコースでメンターをやっておりますがはくです！
この記事は[Life is Tech ! メンター Advent Calendar2017](https://qiita.com/advent-calendar/2017/lit-mentor)の18日目の記事です。

昨日はにーざが書いてくれました。ノンデザイナーズ・デザインブック読んだことないのでぜひ概要をまとめてほしかったです！これからも頑張って！

さて、18日目ですが、みなさん普段インターネットよく使ってますよね。でもインターネットが繋がっている仕組みについてはよく知らないと思います！ということで今回は知識ベースでネットワークアーキテクチャTCP/IPについて書いていこうと思います。

#アジェンダ
今回はまず序章で全体の概要をざっと説明し、後半詳しい話をしていきたいと考えています。
1.プロトコル&TCP/IPとは
2.OSI7階層モデル&TCP/IPモデルについて
3.インターネット層について
4.トランスポート層について
5.アプリケーション層について
6.まとめ

#1. プロトコル&TCP/IPとは
まず、プロトコルとはコンピュータとコンピュータを繋ぐ時に決められた**ルール**です。
分かりやすく人間に例えると、言語みたいなものです。日本語を話す人と英語を話す人ではコミューニケーションが成り立ちませんよね。それと同じでコンピュータもプロトコルが違うと通信できません。

昔は、それぞれのコンピュータが独自にプロトコルを作成し、通信を実現させておりました。しかし、プロトコルが各メーカーごとに違うので、メーカーの違う機器の間で通信することができなかったことも多かったらしいです。

そして、コンピュータが発達しネットワーク同士をつなげる必要性が高まり、自由に通信出来る環境を望んだ結果、コンピュータ間の通信を標準化[^1]するネットワークアーキテクチャ[^2]**TCP/IP**が生まれました。TCP/IPを用いて繋げられたネットワークのことを主に**インターネット(正確にはThe Internet)**と言います。

#2. OSI7階層モデル&TCP/IPモデルについて
OSI7階層モデルはISO(国際標準化機構)が提唱した通信に必要な機能を7つの階層に分けることによって、プロトコルを分かりやすくしたものです。ネットワークのプロトコルについて話す時はこのOSI7階層モデルに基づいて話されることが多いです。

TCP/IPモデルもOSIと同じく通信を階層に分け、プロトコルを分かりやすくしたものであるであるが、TCP/IPモデルはプロトコルを実装する際に必要なプログラムは何かという観点で階層化されています。

それぞれどのような階層分けがされていて、どのように対応しているのかを下図にて示します！
<img width="793" alt="スクリーンショット 2017-12-13 0.36.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/145867/e30ebc51-e245-679d-c272-23301b196782.png">
[1]

インターネットでは送信側が上の層から下の層にデータを伝えていき、逆に受信側では下の層から上の層へとデータを伝えていきます。

それではTCP/IPを語る上では重要な層(レイヤー)についてそれぞれ何をやっているかを話していきたいと思います！

#3. ネットワーク層について
**主なプロトコル:IP**
ネットワーク層は異なるネットワークにいるコンピュータをつなげる役割をします。
####IP(Internet Protocol)について
IPは主に3つの役割があります。主な2つを説明します。

- IPアドレス

IPアドレスはネットワークに繋がっているすべてのコンピュータに割り振られ、識別するために使います。
IPアドレスはネットワーク部とホスト部に別れ、語弊を恐れず分かりやすく言うとルータを特定するのが**ネットワーク部**、ルータに接続されているコンピュータを特定するのが**ホスト部**です。
そして、どこまでがネットワーク部でどこまでがホスト部なのかを表すのは**サブネットマスク**[^3]です。

例: 慶應義塾大学湘南藤沢キャンパスのネットワーク「CNS」に接続されたコンピュータの場合
IPアドレス 133.27.45.111
サブネットマスク 255.255.255.0
この場合ネットワーク部は133.27.45までで、ホスト部は残りの111です。

IPアドレスを自動的に割り振る仕組みのことをDHCPと言います。(詳しくは調べてね)


- 経路制御(ルーティング)

経路制御とは、どこにデータを送ればいいかを制御することです。どこに送り出せば宛先のIPアドレスに届くかという情報をそれぞれが経路制御表(ルーティングテーブル)にまとめてネットワークの道案内をしています。

例:
<img width="983" alt="スクリーンショット 2017-12-13 1.50.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/145867/c6646f51-1070-61b7-538c-7f096e303f53.png">
[2]
**ホストA(10.1.1.30)からホストB(10.1.2.10)にデータを送る場合**
1. まずホストAが持つ経路制御表には10.1.1.0/24しか書かれていないため、この場合は0.0.0.0/0(デフォルトルート)で定められている宛先(10.1.1.1)に送られます。
2. 次にルーターAだが10.1.2.0/24への経路情報を持っているため、そこで定められた宛先(10.1.0.2)に送られます。
3. 次に送られたルーターBも10.1.2.0/24への経路情報を持っており、かつその宛先が10.1.2.1とネットワークアドレスが一致する宛先なのでこれにてIPにて行う経路制御が完了します。

#4. トランスポート層について
**主なプロトコル:TCP,UDP**
トランスポート層はどのアプリケーションにデータを渡すかを制御します。郵便物に例えるとネットワーク層が住所で、トランスポート層が宛名です。

トランスポート層ではどのアプリケーションにデータを渡すか識別するためにポート番号を割り振っています。2の16乗個割り振る事ができ、0~65535の範囲で割り振られます。

標準で決められているものもありTCPでは以下のものが有名だと思います！

| ポート番号   |サービス名     |
|:-----------|:------------|
| 22       |  ssh       | 
| 80     |  http       |
| 143       |  imap       |
| 443         |  https       |

トランスポート層のプロトコルでは主に**TCP(Transmission Control Protocol)とUDP(User Datagram Protocol)**の2つがあり、TCPでは信頼性を重視しており、UDPでは高速性やリアルタイム性を重視してものです。また、TCPにはポート制御以外にもスリーウェイハンドシェイク[^4]や再送制御[^5]等の仕組みがあり、ネットワークをしっかり繋げたり、通信している間に失ったデータを修復するという機能もあります。



#5. アプリケーション層について
**主なプロトコル:DNS,HTTP,HTML,SSH,IMAP**
アプリケーション層はみなさんが主に使っているWebブラウザやメーラー等のアプリケーションが使用するプロトコルです。ここではWebブラウザでWebサイトを閲覧する際に用いる3つのプロトコルについて説明します！
#### DNS(Domain Name System)
私達が普段インターネットを使う時にはURLを打ち込んで使いますよね。DNSはURL(ドメイン)とIPアドレスの対応表を持って変換を行っています。
DNSはその対応表を階層ごとに分散して持っており、例として*www.example.jp*の情報はどのように取得出来るかを示します！

![080-03.jpg](https://qiita-image-store.s3.amazonaws.com/0/145867/75395a12-def4-814c-d18b-20b2ebd0c0ec.jpeg)
[3]

1.まず自宅のルーターやプロバイダなどのDNSがルートDNS[^6]に問い合わせます。ルートDNSは.jpのDNSサーバーのIPアドレスを返します。
2.次に自宅のルーターやプロバイダなどのDNSが.jpのDNSに問い合わせを行います。.jpのDNSはexample.jpのDNSサーバーのIPアドレスを返します。
4.最終的にexample.jpのDNSがIPアドレスを持っているので問い合わせは完了します。

このようにしてDNSはURLをIPアドレスへと変換しているのです！

#### HTTP(Hypertext Transfer Protocol)
HTTPはWebサーバー間で主にHTMLなどの転送に用いられるプロトコルで、WebブラウザでURLにアクセスしたらHTTPで**リクエスト**(要求コマンド)をサーバーに送り、その回答となる**レスポンス**をサーバーから受け取ります。

リクエストには主に以下の種類があります！

| コマンド  |説明     |
|:-----------|:------------|
| GET       |  指定したURLのデータを取得  | 
| POST     |  指定したURLにデータを送信   |
| PUT       |  指定したURLのデータを保存  |
| DELETE     |  指定したURLのデータを削除 |

レスポンスには内容の他にレスポンスコードが帰ってきます。有名なレスポンスコードは以下の様なものです！

| コード  |説明     |
|:-----------|:------------|
| 200      |  成功  | 
| 301     |  リダイレクト   |
| 400       |  リクエストの不正  |
| 403  |  リクエストの拒否 |
| 404     |  リソースが見つからない   |
| 408       |  リクエストのタイムアウト  |
| 500  |  サーバ内部エラー |

#### HTML(HyperText Markup Language)
みなさんご存知HTMLはWebサイトを記述するためのマークアップ言語で、W3Cという団体が標準化しています。W3Cの東アジアをホストする事務所は慶應SFCの⊿館にあります(これが書きたかっただけ)

#6. まとめ
インターネットの仕組みについて自分なりに重要なところをざっくりさらってみましたがいかがでしたか？
インターネットを使うにはここには書き切れないくらいたくさんの技術に支えられています。
もしもっと詳しく知りたければぜひぜひ聞いてください！

明日は最近よくご飯に行くいのっちがめちゃくちゃ面白いことを書いてくれます！たのしみ！！！


###参考文献
竹下隆史, 村山公保, & 荒井透. (2012). マスタリング TCP/IP 入門編. 株式会社 オーム社.

###引用 
[1]竹下隆史, 村山公保, & 荒井透. (2012). マスタリング TCP/IP 入門編. 株式会社 オーム社. P73 図2.8より引用
[2]竹下隆史, 村山公保, & 荒井透. (2012). マスタリング TCP/IP 入門編. 株式会社 オーム社. P160 図4.22より加筆して引用
[3]JPNIC「インターネット10分講座：DNS」https://www.nic.ad.jp/ja/newsletter/No22/080.html



[^1]: 標準化とは異なるメーカーのものでも互換性をもって利用できる規格を作ることです。例えばCDやDVDとかってメーカーが違っても問題なく再生できるじゃないですか。これらはISOという団体がCDやDVDという規格を標準化した結果、生まれたものです。
[^2]: さまざまなプロトコルを体系的にまとめたもの。TCP/IPはIP,TCP,HTTPなどのプロトコルをまとめたものである。
[^3]: IPアドレス(IPv4の場合)は本来32ビットの正整数値で表されており、10進数で表す際には8ビットごとに区切られている。サブネットマスクはネットワーク部を1で記述することによって、どこまでがネットワーク部なのかを表している。2進数で11111111は10進数で255なので255.255....のような表記となる。また、/24などのビット数をIPアドレスの後に記載することでどこまでがネットワーク部なのかを記載することもある。
[^4]: スリーウェイハンドシェイクとは接続をする際に、3回のやりとりで確認しあうことである。
[^5]: 受信できてないことを送信側に伝え、もう一度送ってもらう機能のこと
[^6]: 全世界に13個あり、DNSの階層に最上位に位置し、下位のDNSの情報をもつDNSサーバー。日本ではWIDEプロジェクトが運用を行っている。