【学習メモ】キタミ式　Chap12　ネットワーク（12-4〜12-5）

#アウトプットする目的
資格取得がゴールではないが、基本情報技術者試験で書かれている内容をなるべく早く理解することで、根本的な問題解決ができるエンジニアに近く目的で学習。

Chapterかセクションごとに要約＋自分で調べた補足＋参照記事などをアウトプットします。

#12-4 データの誤り制御
データはネットワーク上で「0」か「1」を電気信号で送るが、電気信号の波形の乱れでデータ誤りが発生することがある。そのデータの伝送誤りに対処するパリイティチェック方式（**パリティチェック**や**CRC**など）を用いて、誤りを判定したり訂正したりする。

##パリティチェック
送信するビット列に対して、**パリティフィット**と呼ばれる検査用のビットを付加することでデータの誤りを検出するというもので、その方式は2通り。

- 偶数パリティ：ビット列の中の「1」の数が偶数になるように、ビット列の先頭に「0」か「1」を追加する。
- 奇数パリティ：ビット列の中の「1」の数が偶数になるように、ビット列の先頭に「0」か「1」を追加する。

パリティチェックで可能なのは、**1ビットの誤りを検出すること**なので、偶数個のビット誤りだと検出不能。誤り箇所も特定できず、誤り訂正も不可能。

##水平垂直パリティチェック
どの方向にビットを付加するかによって垂直パリティと水平パリティに分かれる。

- 垂直パリティ：データ単位で付加。
- 水平パリティ：データを並べた時の各ビット位置の単位で付加。
- 水平垂直パリティ:上記２つのパリティを組み合わせて使用。水平と垂直のパリティチェックを行うことで、交差部分の誤りがわかり誤り訂正が行える。

##CRC(巡回冗長検査)
CRC（Cyclic Redundancy Check）は、ビット列を特定の式（生成多項式と呼ばれる）で割り、そのあまりをチェック用のデータとして付加する方法。

- データを受信した側は、送信側と同一の生成多項式を使用して、受信データを割り算し、正常に計算ができるかでデータ誤りを判定。
- データの誤り訂正は行えないが連続したビットの誤り（バースト誤り）など複数ビットの誤りを検出できる。


#12-5　TCP/IPを使ったネットワーク
>「TCP/IP（Transmission Control Protocol/Internet Protocol）」は、コンピュータやアプリケーション同士の通信のために、現在最も多く使われている基幹ネットワークプロトコルである。インターネット、イントラネットを問わず、組み込み機器からPC、サーバ、スーパーコンピュータに至るまで、あらゆるコンピュータや通信機器がTCP/IPを使って通信やサービスを実現している。

- IP：複数のネットワークを繋ぎ、そのうえをパケットが流れる仕組み（詳細は後ほど）。
- TCP：正しくデータが送られたことを保証する仕組み（詳細は後ほど）。

両者が組み合わさることで**複数のネットワークを渡り歩きながらパケットを正しく相手に送り続けることができる**という仕組みになる。こうしたインターネットの技術を、そのまま企業内LANなどに転用したネットワークを**イントラネット**と呼ぶ。

##TCP/IPの中核プロトコル
「TCP/IP」という呼び方は、「TCP」と「IP」という2つの中核となるプロトコルから名付けられている。
※実際には「UDP」「ICMP」「ARP」など、幾つかの補助的なプロトコルも含む総称

![スクリーンショット 2020-09-11 14.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/fa1c1975-b19e-0a28-db9d-f1fe07569df3.png)

各階層の役割は次の通り。

>アプリケーション層は、TCPやUDPを使うアプリケーションに相当する。

>トランスポート層では、上位のアプリケーション間での通信を担当する。

>TCPやUDPが該当するネットワーク層では、2台のコンピュータ間での通信を担当する。

>IPが該当するネットワークインタフェース層は、イーサネットや無線LANなど、実際の物理的なネットワークデバイスやインタフェースとそのドライバに相当する。

##TCP/IPの実際の役割って？

TCP/IPを使うアプリケーションは、TCPかUDPのいずれかのプロトコルを利用して、他のコンピュータ上にあるアプリケーションと通信する。

IPは、**TCPやUDPが内部的に利用するためのプロトコル**であり、2台のコンピュータ間での通信を担当。①TCP・②UDP・③IPの特徴について見ていこう。

![スクリーンショット 2020-09-11 14.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/55dee72a-7e6c-a270-93e1-850bcf809441.png)

##①TCP（Transmission Control Protocol）とは
- 通信相手とのコネクションを確立してからデータを送受信する**コネクション型**の通信プロトコル
- パケットの順序や送信エラー時の再送等を制御して送受信するデータの信頼性を保証する。
- 1対1の「信頼性のある」通信を実現するが、通信に必要なコスト（手間）はやや高い
- WebサーバとWebブラウザ間、メールサーバとメールクライアント間など、ほとんどのネットワークサービスで利用される

##TCPはどうやって”信頼性のある通信”を実行するのか
###信頼性＝通信の信頼性＝送信したデータが送信した順番で正しく相手にまで届くことが保証され、何らかの理由で送信が失敗した場合には自動的に再送信するなどして、確実に相手にデータが届くことを保証されている通信ということ

でも、**どうして信頼性があると言えるの？**

###送信したパケットに対して必ず確認のための応答を送信するから
相手にデータが届いたことを必ず確認するという手法を採用している。データを送信する場合、それに対する確認応答を受け取って始めて送信が完了したと判断する。

###要するにこんな流れ
1. TCPパケットを送信する側では、データにTCPヘッダを付加し、IPパケットに載せて相手のマシンにまで送信する。
2. TCPパケットを受信した側では、TCPパケットからデータを取り出して上位アプリケーションに届けるだけでなく、**送信側に対して自動的に確認応答を返信する（この返信をACK＝Acknowledge（承認）という）**。
3. 送信側では、このACKを受け取って初めて送信が完了したとみなし、次の動作に移るが、しばらく待ってもACKが受信できなければ、送信が失敗したものとみなし、自動で全く同じTCPパケットの内容を再送する。

※確認応答の返信は、上位アプリケーションの指示とは関係なく、**TCPのプロトコル・スタック内で自動的に行われる**。このような仕組みになっているため、上位アプリケーションは、TCPプロトコルにおけるパケットのやりとりをまったく意識することなく、信頼性のあるストリーム通信機能を利用することができる。

![スクリーンショット 2020-09-11 14.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/e8f33b23-e8c4-a68c-d845-25fb3f2e44bd.png)

##②UDP（User Datagram Protocol）とは
- 事前に送信相手と接続確認を取ったりせず一方的に竹と送り付けるコネクションレス方の通信プロトコル。
- パケットの再送制御など一切行わないため信頼性に欠ける（＝**送信したパケットの到着順序が入れ替わったり、（混雑などによって）消失したりする可能性があるという意味で**）がその分高速。
- 1対1もしくは1対多で、「信頼性のない」通信を実現する。通信コストは非常に低い。
- TCPと比較すると、**相手にデータが届いたかどうかの確認や、通信路の開始／終了、送信失敗時の再送信処理などがない分、高速・軽量**。エラー検出や失敗時の再送信が必要なら、アプリケーション自身で対応する。
- DNSサービスのパケット(単純な問い合わせとその応答をUDPパケット1つずつで済ませている）、ビデオ配信やオンラインゲーム（全てのデータが確実に届くことよりも、リアルタイム性の方が重要なため）で使われる。

##③IP（Internet Protocol）とは
- 経路制御を行い、ネットワークからネットワークへパケットを運んで相手に送り届ける通信プロトコル。
- ネットワーク上の2台のコンピュータ間で片方向の「データグラム指向」の「ベストエフォート」通信を行う。
- ベストエフォート通信とは、相手に届くように最善の努力はするが、場合によっては（例：ネットワークの混雑時など）送信に失敗することもある、という通信形態）を行うというもの。
- 送信失敗時の再試行は、必要なら**上位プロトコル（TCPの場合）か、アプリケーション自身（UDPの場合）で行う。**

##IPアドレスはネットワークの住所
- IPによって構成されるネットワークでは、コンピュータやネットワーク機器などを識別するためにIPアドレスという番号を割り当てて管理する（192.168.1.1等）。
- 32bitの数値で表されるが、あまりに長いので8bitずつに区切り、それぞれを10進法で表したのが、「192.168.1.1」

##グローバルIPアドレスとプライベートIPアドレス

###グローバルIPアドレス
インターネットの世界で使用するIPアドレス。

###プライベートIPアドレス
企業内などLANの中で使えるIPアドレス。**LAN内で重複がなければ**システム管理者が自由に割り当てることが可能。

##IPアドレスの構成
先ほどの「192.168.1.1」」が何を意味するのか？

「192.168.1」：頭の24bitがネットワークアドレス＝**どのネットワーク**にいるのかを示す。
「.1」：後ろの8bitがホストアドレス＝**どのコンピュータにいるのか**を示す。

ただし、↑は一例であって、後述するように、**32bitの中の何bitをネットワークアドレス部に割り振るか**が規定されており、それによって持つことのできるホストの数が変化する。

##IPアドレスのクラス
IPアドレスは32bitの数値で、それぞれの値が一意であれば、システム管理者が自由に好きな数値を選択して、各ホストに付けることができる。

が、IPアドレスの付け方には幾つかの基本的な規定がある！それがこちら。

![スクリーンショット 2020-09-12 10.49.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606290/12911b2b-516f-3d24-d88f-22c0a1b4f474.png)

例：
クラスA：0.0.0.0 ~ 127.255.255.255
クラスB：128.0.0.0 ~ 191.255.255.255
クラスC：192.0.0.0 ~ 223.255.255.255

##ブロードキャスト
- 同一ネットワーク内の全てのホストに対して、一斉に同じデータを送信すること
- 宛先として「ホストアドレス分がすべて1となるIPアドレス」を指定する
- 「ネットワーク内の全員」宛なので、ホスト同士がルーターを使わずに通信できる

※ブロードキャストの反対の言葉として、**特定の1台のみに送信することをユニキャスト**という。
※複数だが不特定多数ではなく、**決められた範囲内の複数送信する場合はマルチキャスト**という。

##サブネットマスクでネットワークを分割
###サブネットマスク：IPアドレスのどの部分がネットワーク部で、どの部分がホスト部かを示す情報

つまり、**どこが「どのネットワークですよ～」を表している部分で、どこが「どのコンピュータですよ～」を表している部分**かを定義するものを指す。

サブネットマスクを2進数で表記した際の「1」の部分と対応するところが、IPアドレスの「どのネットワークですよ～」を示す部分。

サブネットマスクを2進数で表記した際の「0」の部分と対応するところが「どのコンピュータですよ～」を示す部分。

###でも、「ネットワーク部とホスト部を分ける」ってどういうこと？

IPアドレスとサブネットマスクを組み合わせることで、ネットワークの範囲（サブネット）を限定させる（イメージ：”マスク”で覆い隠す）ということ。

###ネットワークの範囲を限定させる背景って？

- ネットワークに大量のホストをまとめちゃうと通信トラフィックが多くなりすぎて通信効率が下がってしまう(ブロードキャストの例を思い出してほしい。通信速度激落ちくんになる)
- 「たくさんのホストは不要で、部署ごとにネットワークを分けたい！」などのニーズがある

こうした背景によりIPアドレスとサブネットマスクを組み合わせて小規模のネットワーク（＝サブネット）を構築し、効率良く通信が行えるようになるというわけだ！

##MACアドレスとIPアドレスの違い

わかりやすいまとめがあったので、こちらを参照するとわかりやすい。

[Qiita:MACアドレスとIPアドレスの違い](https://qiita.com/cironaga/items/6a0c909e31f986c9f825)

##DHCPは自動設定する仕組み
LANにつなぐコンピューターの数が増えてくると、1台ずつに重複しないIPアドレスを割り当てることが困難になってくる。そこで、DHCP（Dynamic Host Configuration Protocol）を利用すると、LAN内のパソコンやスマートフォンなどにIPアドレスなどの情報を自動で割振り（設定）してくれる！

ネットワークの知識が少なくても無線LANやハブによる機器の増設が簡単に行えるのは、「DHCP」機能が自動でネットワーク情報を配信（設定）しているため！

##NATとIPマスカレード
LANの中ではプライベートIPアドレスを使っていうのが一般的ですが外のネットワークとやり取りするためにはグローバルIPアドレスが必要。

では、**プライベートIPアドレスしか持たない各コンピュータはどうやって「外のコンピュータ」とやり取りするのか？**

###NAT
グローバルIPアドレスとプライベートIPアドレスと一対1で結びつけて相互に変換を行う。同時にインターネット接続できるのはグローバルIPアドレスの個数分のみ。

###IPマスカレード（＝NAPT）
複数のプライベートIPアドレスを持つ端末が、グローバルIPアドレスを使ってインターネット接続を利用する仕組みを実現するもの。IPアドレスの変換時にポート番号も合わせて書き換えるようにすることで、1つのグローバルIPアドレスでも複数のコンピュータが同時にインターネット接続をすることが可能！

##ドメイン名とDNS
###ドメイン=覚えにくいIPアドレスに対して、文字で別名をつけて紐付けたもの

- ドメイン名とIPアドレスとを関連づけて管理するのがDNS（Domain Name System）。
- 「www.tanakakun.co.jpのIPアドレスを教えて！」「219.101.198.19のドメイン名教えて！」とDNSサーバーにリクエストすると、対応するIPアドレスやドメイン名が返ってくる。

#参考

[【IT入門】データの誤り制御に関して](https://kk90info.com/%E3%80%90%E5%AD%A6%E7%BF%92%E3%80%91%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%AA%A4%E3%82%8A%E5%88%B6%E5%BE%A1%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6/)
[TCP/IP（Transmission Control Protocol/Internet Protocol）](https://www.atmarkit.co.jp/ait/articles/1611/10/news035.html)
[第14回　信頼性のある通信を実現するTCPプロトコル（その1） (2/3)](https://www.atmarkit.co.jp/ait/articles/0312/25/news001_2.html)
[第8回　アドレス・クラスとさまざまなIPアドレス (1/3)](https://www.atmarkit.co.jp/ait/articles/0301/17/news003.html)
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典:サブネットマスク (subnet mask)](https://wa3.i-3-i.info/word11975.html)
[Qiita:MACアドレスとIPアドレスの違い](https://qiita.com/cironaga/items/6a0c909e31f986c9f825)
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典:DHCP](https://wa3.i-3-i.info/word1959.html)