ネットワークはなぜ繋がるのか　第一章まとめ

## 概要
以下の本を元にネットワークの仕組みについて学習したので、備忘としてまとめます。
https://amzn.asia/d/fZlq877

今回は第一章までの内容をまとめています。

## 重要なワード
- ブラウザ
- HTTP
- IPアドレス
- ポート番号
- DNSサーバ
- Socketライブラリ（リゾルバ）
- プロトコル・スタック


## 処理の流れ
#### ブラウザがURLを解読し、HTTPリクエストメッセージを作成する


ブラウザはユーザーとWEBの橋渡しのような役割を果たします。
- 入力されたURLの解読
- HTTPリクエストメッセージの作成

HTTPはWebサーバにアクセスする際に利用されるプロトコルです。
※HTTPプロトコルを利用してWEBサーバにアクセスする流れをまとめます。

ブラウザはまず入力されたURLを解読します。
```
http://Webサーバ名/ディレクトリ名/,,,,/ファイル名
```
URLを解読すればどこにアクセスすべきかが判明します。

ブラウザは解読した結果を元にHTTPリクエストメッセージを作成します。

#### WebサーバのIPアドレスをDNSサーバに問い合わせる
HTTPのメッセージを作ったら、それをOSに依頼してアクセス先のWebサーバに向けて送信してもらいます（ブラウザはメッセージをネットワークに送り出す機能は持っていない）。
その際、URL内のドメイン名からIPアドレスを調べる必要があります。

IPアドレスはネットワーク上の住所のようなものです。
インターネットはTCP/IPの考えに基づいて作られています。
TCP/IPはサブネット（バブに何台かのパソコンが接続されたもの）という小さなネットワークをルーターで接続することによって全体のネットワークが出来ていると考えます。
サブネットには「ネットワーク番号」が割り当てられ、コンピュータには「ホスト番号」が割り当てられます。このアドレスをIPアドレスと呼びます。

人間はIPアドレスを直接覚えるよりも、それに変わるドメイン名を支えた方が便利な一方で、マシンは32ビットの決まった容量のデータを扱う方が効率的に処理を実行できるため、ドメイン名とIPアドレスが使い分けられています。
ドメイン名とIPアドレスを紐づけているのがDNSサーバです。

DNSサーバに対してはリゾルバを使用して問い合わせを行います。リゾルバの実態はSocketライブラリに入っている部品化したプログラムです。
SocketライブラリはOSに組み込まれているネットワーク機能をアプリケーションから呼び出すための部品を集めたものです（リゾルバはその中に入っているプログラム部品の一つ）。

リゾルバはDNSサーバに問い合わせるためのメッセージを作り、OS内部に組み込まれたプロトコル・スタックを呼び出して実行を依頼します（リゾルバもブラウザと同じくネットワークに対してデータを送受信する機能を持っていない）。

すると、プロトコルスタックがメッセージを送る動作を実行し、LANアダプタを通じてメッセージがDNSサーバに向けて送信されます。
※DNSサーバのIPアドレスはコンピュータにあらかじめ設定されているのでそれをつかう

DNSサーバは送られてきたメッセージの問い合わせの内容を調べ、その答えを応答メッセージに書き込んでクライアントに返します。

クライアントに届いた応答メッセージは、プロトコル・スタックを経由してリゾルバに渡され、リゾルバが中身を解読してIPアドレスを取り出し、アプリケーションにIPアドレスを渡します。
```
アプリケーション ⇄ リゾルバ ⇄ プロトコルスタック ⇄ DNSサーバ
```
このようにコンピュータの内部は多層構造になっており、それぞれのレイヤーで役割分担が行われています。上位層から仕事を依頼された時に下位階層に実行を依頼しながら処理を進めます。

#### DNSサーバは連携して動作する
DNSサーバは、サーバ内に登録されたドメイン名とIPアドレスの対応表を調べて、IPアドレスを回答します。
DNSサーバは情報を分散させて多数のDNSサーバに登録し、その多数のDNSサーバが連携してどこに情報が登録されているのが探し出す仕組みを持っています。
ドメイン名は以下のような形式になっています。
```
www.lab.glasscom.com

戸根 勤. ネットワークはなぜつながるのか　第２版 (p.84). 日経BP社. Kindle 版. 
```
このドットの区切りが階層の区切りを表し、階層化して情報を管理しています。
つまり「com事業部glasscom部lab課のwww」といった具合です。この１つの部署に相当するものを「ドメイン」といいます。comドメインの下にglasscomドメインがあり、その下にlabドメインがあり、、、、
この階層化されたドメインをDNSサーバに登録する際は、１つのドメインを一まとまりのものとして扱います。すると、ドメインの階層構造と同じ格好でDNSサーバが配置され、各ドメイン情報はそのドメインにあるDNSサーバに登録されることになります。

DNSサーバから登録した情報を探し出しやすくするために、以下の方法がとられています。
>そして、その上位のDNSサーバーをさらにその上位のDNSサーバーに登録する、というように順に登録していきます。つまり、lab.glasscom.comというドメインを担当するDNSサーバーをglasscom.comのDNSサーバーに登録し、glasscom.comのDNSサーバーをcomドメインのDNSサーバーに登録するといった具合です。こうすれば、上位のDNSサーバーに行けば、下位のDNSサーバーのIPアドレスがわかり、そこに問い合わせメッセージを送ることができます。
戸根 勤. ネットワークはなぜつながるのか　第２版 (p.86). 日経BP社. Kindle 版. 

また全てのDNSサーバにはルートドメイン（全てのドメインの最上位階層のドメイン）のDNSサーバを登録されています。こうすることでクライアントがどこのDNSサーバからアクセスしてもルート・ドメインを経由して目的のDNSサーバにたどり着けるようになっています。

#### プロトコルスタックにメッセージ送信を依頼する
 IPアドレスを調べたら、アクセス先のWebサーバにメッセージを送信するようにOS内部にあるプロトコル・スタックに依頼します。
 プロトコル・スタックにメッセージ送信動作を依頼するときはSocketライブラリのプログラム部品を決められた順番で呼び出します。
 データの送受信を行うためには、送受信する両者の間をパイプで繋ぐ必要がありますが、そのパイプの出入り口のことを「ソケット」と言います。
 データ送信動作はいくつかのフェーズに分かれており、次の４つに要約できます。
 1. ソケットを作る
 1. サーバ側のソケットにパイプを繋ぐ
 1. データを送受信する
 1. パイプを外してソケットを抹消する

これらの４つの動作をOS内部のプロトコル・スタックが実行します。

ソケットを作るフェーズでは、Socketライブラリのプログラム部品を使って、プロトコル・スタックに作業を依頼します。
（ここから先のフェーズでも同様ですので、次のフェーズからは上記の記述は省略します）
ソケットができたら、「ディスクリプタ」というものが返ってくるので、アプリケーションはそれを受け取ってメモリに記録しておきます。
コンピュータは複数の送受信動作を同時進行で行うので、ソケットが複数存在する可能性があります。ディスクリプタはソケットを一意に識別するための番号札のようなもので、データ受信動作を実行するときにディスクリプタを示せば、どのソケットを使って接続するのかプロトコル・スタックが判断できます。

パイプを繋ぐフェーズでは、「ディスクリプタ」、「IPアドレス」、「ポート番号」の３つの値を指定して処理を行います。
ポート番号は、IPアドレスで特定したコンピュータのどのソケットに接続したいのかを指定するための番号です。
- ディスクリプタ：アプリケーションがソケットを識別するもの
- IPアドレスとポート番号：クライアントとサーバ間で相手のソケットを識別するもの

ポート番号はアプリケーションの種類によってあらかじめ決められているので、それを指定します。（Webだったら80番）
クライアント側のソケットのポート番号はプロトコル・スタックが接続動作を実行する時にサーバ側に通知されます。
相手と繋がったら、プロトコル・スタックは繋がった相手のIPアドレスやポート番号などの情報をソケットに記録します。これでデータを送受信できる状態になります。

送受信フェーズでは、クライアント側はソケットからデータを放り込んでやれば、サーバ側で然るべき処理を実行して、レスポンスメッセージを送り返してもらえます。
レスポンス・メッセージを受信する際は、「受信バッファ」と呼ばれるメモリー領域を確保しておき、そこに受信した内容が格納されます。受信バッファはアプリケーション・プログラムの内部に用意したメモリー領域なので、受信バッファにメッセージを格納した時点で、メッセージをアプリケーションに渡したことになります。

ブラウザがデータを受信し終わったら送受信動作は終わりです。そうしたらプロトコルスタックに切断フェーズに入るように依頼します。