「ネットワークはなぜつながるのか」を読んで

# はじめに
本記事では、ネットワーク基礎知識を学ぶための技術書としてまず名前があがる名著の一つ、「ネットワークはなぜつながるのか」の要点と読了後の感想をまとめていきます。
約600ページにもわたるボリューミーな本なので、とりあえず要点だけ把握したい方や、どのくらいのレベル感なのか知りたい方はぜひご一読ください。

# どんな本なのか？
普段私たちが私生活や業務のなかで、何気なく使用しているインターネット等を含む ***「ネットワーク」*** の仕組みやそれを支える技術について体系的に学べる本です。

***「ネットワーク」*** はなんとなく想像のつく通り巨大で複雑なシステムですが、この本では**ブラウザにURLを入力してからwebページが表示されるまでの道のり**を、探検ツアー形式で初心者にもわかりやすく解説してくれます。

***HTTP***、***IP***、***LAN***、***ルーター***、***インターネット***などについて、各々については多少の知識はあるけれど、それぞれがどのように関わりあっているのかは知らないんだよなぁ、という方におすすめです。

# 要約
## 第１章 - webブラウザ
- ***HTTPリクエスト・メッセージを作成する***
    - ブラウザの最初の仕事は***URL***を解読すること
    - ブラウザは***HTTPリクエスト***をつくり、***HTTPレスポンス***を受信する
- ***WebサーバーのIPアドレスをDNSサーバーに問い合わせる***
    - ブラウザはURL上のドメイン名から***IPアドレス***を***DNSサーバー***に問い合わせる
- ***世界中のDNSサーバーが連携する***
    - ***DNSサーバー***はサーバー内に登録されたドメイン名とIPアドレスの対応表を調べて、***IPアドレス***を回答する
- ***プロトコルスタックにメッセージ送信を依頼する***
    - ***プロトコル・スタック***が***ソケット***（クライアントとサーバーの通信窓口のようなもの）を使用して、以下の順番でwebサーバーとやり取りする
        1. ソケット作成
        1. サーバー側のソケットとパイプを接続
        1. データを送受信
        1. パイプを外し、ソケットを抹消
## 第２章 - プロトコル・スタック、LANアダプタ
- ***ソケットを作成する***
    - ***ソケット***の実態は通信制御用の情報
        - 通信相手のIPアドレス、ポート番号、通信状態など
    - ***プロトコルスタック***は***ソケット***に記録された情報を参照しながら動く
    -  アプリケーション（webブラウザ）は***ディスクリプタ***という番号札のようなもので***ソケット***を識別する
    -  クライアントとサーバー間ではお互いのIPアドレスとポート番号でソケットを識別しあっている
- ***サーバーに接続する***
    - ***接続する***とは、クライアント側の***IPアドレス***や***ポート番号***などの***制御情報をサーバー側に伝え***、データを送受信するための***メモリー領域（バッファメモリー）を確保する***こと
    -  ***TCPヘッダー***には送信元、宛先の***ポート番号***や、開始、終了、エラーの判断等を管理するための情報が格納される
    -  ***TCPヘッダー***を用いて接続先（サーバー）の***ソケット***を特定する
- ***データを送受信する***
    - ***シーケンス番号***と***ACK番号***でパケットが受信側に届いたことを確認する
    - ***ウィンドウ制御方式***：パケット送信後、ACK番号の返却を待たずに次々とパケットを送る方法
- ***サーバーから切断してソケットを抹消***
    - データを送り終わったサーバーは***TCPヘッダー***の***コントロールビット***に***FIN***をセットし、クライアントに送信することで、切断動作に入ることを伝える
    - 上記が完了したのち、数分待ってから***ソケット***を抹消する
- ***IPとイーサネットのパケット送受信動作***
    - ***MACヘッダー***はイーサネット用のヘッダーで***MACアドレス***が格納される
    - ***IPヘッダー***には***IPアドレス***が格納される
    - TCP担当部分が作成したデータの中身には関知しない
    -  ***ルーター***の***経路表***を用いてパケットを渡す次のルーターを判断する
    -  ***MACアドレス***を調べるときは***ARP***を使う
    -  ***LANアダプタ***は送信パケットに***プリアンプル***、***スタート・フレーム・デリミタ***、***FCS***という３つのデータを付与する
    -  ***LANアダプタ***は***パケット***を***電気や光の信号***に変換する
- ***UDPプロトコルを用いた送受信動作***
    - ***UDP***ではコネクションを作成しないため、高速だがデータを送りなおす仕組みがない
    -  通常のデータの送受信では***TCP***、DNSサーバーへの問い合わせなど、短い制御用のデータを送受信する場合は***UDP***を使用する
    -  音声や動画データを送る場合も***UDP***を使用する 
        -  → ***完全性***より***リアルタイム性***が大事だから

## 第３章 - ハブ、スイッチ、ルーター
- ***ケーブルとリピータハブの中を信号が流れていく***
    - ***LANアダプタ***で信号に変換された***パケット***は***ツイストペア・ケーブル***を通って***リピータハブ***に向かっていく
    - ***リピータハブ***はつながった***ケーブル全部***に信号を送信する
- ***スイッチングハブの中継動作***
     - ***スイッチングハブ***は***宛先MACアドレス***でどのポートから信号を送信するか判断する（リピータハブと違い必要なケーブルにだけ送信する）
- ***ルーターのパケット中継動作***
    - ***ルーター***は***中継部分***と***ポート部分***で構成される
    - 各ポート部分には***MACアドレス***と***IPアドレス***が割り当てられている
    - 中継部分は***IPヘッダー***の***宛先IPアドレス***で中継先を判断する
- ***ルーターの付加機能***
    - ***アドレス変換***
        - ***グローバルIPアドレス***と***プライベートIPアドレス***を変換する
    - ***パケット・フィルタリング***
        - パケットを中継する際に、***MACヘッダー***、***IPヘッダー***、***TCPヘッダー***を調べて事前に設定した条件と合致しない場合はパケットを捨てる仕組み
## 第４章 - アクセス回線、プロバイダ
- ***ADSL技術を用いたアクセス回線の構造と動作***
    - ***アクセス回線***とは、インターネットと家庭や会社のLANを結ぶ***通信回線***のこと
    - ***インターネット接続用ルータ***ーは***MACヘッダー***、***PPPoEヘッダー***、***PPPヘッダー***の３つをつけて、***ADSLモデム***にパケットを送る
    - ***ADSLモデム***は***パケット***を***ATMセル***に分割し、***電気信号***に変えて***スプリッタ***に送信する
    - その後信号は***DSLAM***（電話局）を通過して、***ATMセル***に戻り、***BAS***（ルーターの一種）に届く
    - ***BAS***は***ATMセル***を***パケット***に戻し、インターネット内部に中継する
- ***光ファイバを用いたアクセス回線（FTTH）***
    - ***FTTH***とは、***光ファイバ***（光信号）を用いたアクセス回線
    - ***ADSL***の代わりに***光ファイバ***を使って***インターネット接続用ルーター***と***BAS***を接続する
- ***アクセス回線で用いるPPPとトンネリング***
    - ***BAS***は***PPPoE***の仕組みを使って、***本人確認***と***設定値通知***の機能を実現している
    - ***PPPoE***は***PPP***メッセージ（本人確認用のパスワードなど）をイーサネットのパケットに入れてやり取りする
    - ***トンネリング***とはインターネット接続用ルーターから送られてきたパケットをプロバイダのルーターに向けて送信する仕組み
- ***プロバイダの内部***
    - プロバイダのルーターがインターネットの入口
    - ***ADSL***などのアクセス回線が***BAS***を介してつながっているプロバイダ設備を***POP***と呼ぶ
    - ***POP***から入ってきたパケットは***NOC***(POPの大規模版)に集まっていく
- ***プロバイダをまたがって流れるパケット***
    - インターネット内部では、***BGP***という仕組みを使って、***プロバイダ間***で***経路情報***を交換しているため、サーバー側のプロバイダがクライアント側と違う場合、パケットは他プロバイダに中継される
    - プロバイダ間の接続のインターフェースとなる***IX***という設備がある
        - ***IX***の中心には高速で巨大なスイッチングハブである***レイヤ2スイッチ***がある
## 第５章 - ファイアウォール、キャッシュサーバー
- ***Webサーバーの設置場所***
    - 以下の3ケースがある
        - ***社内LAN***に設置し、***ルーター***で直結する
        - ***社内LAN***とは分離した***公開サーバー用LAN***に設置し、***ファイアフォール***で中継する
        - ***接続事業者***の***データセンター***に設置する
- ***ファイアウォールの仕組みと動き***
    - 主流な方式は***パケットフィルタリング型***
        - ***パケット***を中継する際に、***MACヘッダー***、***IPヘッダー***、***TCPヘッダー***を調べて事前に設定した条件と合致しない場合はパケットを捨てる仕組み
    - 外から社内LANにはアクセスできないようにしたり、公開用サーバー用LANからはレスポンスのときのみ、外部のネットワークへアクセスできるようにできる
    - ***ファイアウォール***ではヘッダーしかチェックしていないため、パケットの中身に***危険なデータ***が含まれている場合はそれを防ぐことはできない
- ***複数サーバーにリクエストを振り分けてサーバーの負荷を分散***
    - サーバーの処理能力がリクエストに追いつかなくなったときの対応策の一つとして***分散処理***がある
        - サーバーを複数台用意して処理を分担する方法
    - 以下の2通りの方式がある 
        - ***ラウンドロビン方式***：DNSサーバーに用意したサーバーのIPアドレスを同じドメイン名で複数登録しておくことで複数サーバーに順番でリクエストを送る
        - ***負荷分散装置***：***負荷分散装置（ロードバランサー）*** のIPアドレスをDNSサーバーに登録しておき、***負荷分散装置***が各サーバーの負荷状況（CPUやメモリの使用率）を見て、リクエストを振り分ける
- ***キャッシュサーバーを利用したサーバーの負荷分散***
    - ***キャッシュサーバー***：***プロキシ***という仕組みを使って***データ***を***キャッシュ***（保持）するサーバー
    - ***キャッシュサーバー***を***クライアント***と***webサーバー***の間に置き、一度レスポンスしたことのあるリクエストがクライアントから来た場合はwebサービスを介さずにレスポンスを返却する
    - webサーバー側ではなく、クライアント側にプロキシを置く方法を***フォワードプロキシ***と呼ぶ
- ***コンテンツ配信サービス***
    - ***複数の主要なプロバイダ***に設置した***キャッシュサーバー***を***webサーバー運営者***に貸し出すサービスのこと
    - これを利用することで、アクセス時のインターネットの***トラフィック***を押さえることができ、かつwebサーバー運営者は***キャッシュサーバー***をコントロールすることができる
## 第６章 - webサーバー
- ***サーバーの概要***
    - 基本的な機能はクライアントと同じ。若干違う点もあるので一応記載する
        1. ソケット作成
        1. ソケットを接続待ち状態にする
        1. クライアントからの接続を受け付ける
        1. データを送受信
        1. パイプを外し、ソケットを抹消
- ***サーバーの受信動作***
    - ***LANアダプタ***で受信した信号をデジタルデータに変換する
    - その後、***LANドライバ***が***MACヘッダー***から***プロトコル***を判断し、***プロトコルスタック***に***パケット***を渡す
- ***Webサーバーソフトがリクエストメッセージの意味を解釈して要求に応える***
    - ***リクエストメッセージ***の***URI***に記載されたパス名を***実際のディレクトリのパス名***に変換してから読み込みを行う
    - パスで指定されたファイルが***HTMLドキュメント***や***画像ファイル***の場合はそのまま送り返すだけだが、***プログラムファイル***だった場合は、その***プログラム***を起動して、それが出力するデータをクライアントに送り返す
- ***ブラウザがレスポンスメッセージを受け取り画面に表示***
    - ***webサーバー***がレスポンスしたメッセージを受け取った***ブラウザ***は***Content-Type***の値でデータの種類を判断する
        - text/html
        - image/jpeg
        - application/json
        - など
    - データの種類に応じて画面表示の***プログラム***を呼び出して、***OS***に指示を出しながらデータを表示させる
    - ブラウザが自分で表示機能を持っていないデータ種類の場合は***専用のアプリケーション***を呼び出す
# 感想
結論からいうと、読んで良かったなと思いました。

私は普段仕事としてエンジニアをやっていますし、基本情報技術者の資格くらいはもっていたのですが、思いのほか初めて知る情報がとても多かったです。
IT系のお仕事をされている方であれば、業務上こういったインフラ寄りの知識が必要になることも少なくないですし、間違いなく読んで損しない内容になっていると思います。

ITパスポートレベルを持っている、あるいは半年～１年以上エンジニアとしての業務経験がある方なら、難しくない程度の難易度なので、ぜひご一読することをおすすめします！（ただ量はかなり多いです。私は1か月くらいかけました。）

最後に、本記事の内容についてご指摘、ご質問などありましたら、どしどしコメントいただけると嬉しいです。
以上、ご覧戴きありがとうございましたmm