「ネットワークはなぜ繋がるのか」読んでみたまとめ

# はじめに
https://www.amazon.co.jp/dp/4822283119

ネットワーク系の中で有名な書籍を読んだのでアウトプットしていきたいと思います。結論から言うと、この本を読むとネットワークの基本的な流れが掴めるので、TCP/IP や HTTP 等がどのように関連しているのか体型付けた知識を得ることができます。

ウェブ系の開発をしていると当たり前にできているリクエストやレスポンスについて理解が生まれるので非常におすすめでした。

なので得た知識をこちらでまとめたいと思います。また、この本は図が非常にわかりやすいため気になった方はぜひ実際に読んでみることを勧めます。

# 筆者のレベル
参考までに私がどれくらいのレベル感のエンジニアなのかざっくり言っておきます。
- エンジニア業務歴1年
- Rails や React を使った開発はそこそこできる
- HTTP はプロトコルってことまではわかる
- TCP/IP の違いは説明できない
- イーサネットも聞いたことはあるレベル

この本を読む前の状態としてはこんな感じでした。ウェブ開発は基本的にできるけどネットワークまでいくとよくわからんって感じのエンジニアでした。

それでは早速章ごとにまとめていきたいと思います。


# 前提
この書籍では一貫して探検ツアーという名目でブラウザからサーバーに通信を行い、サーバーで処理してクライアント側に返ってくるまでを紹介しています。

# 第1章 ウェブブラウザ
始まりはURLを入れるところからです。ブラウザの最初の仕事はURLを解読すること。
URLを見ると最初にプロトコルが書いてあるのでそれを見てブラウザがどのような通信を行うのか判断するようになっています。

最近だと `http` or `https` くらいしかブラウザで叩くことはそうそうないですかねー。

## HTTPプロトコルとは？
サーバーとブラウザ間で情報をやり取りする際に使われるプロトコルのこと。HTTPS は HTTP を暗号化したものなので中身としては同じもの。 

まずクライアントからサーバーに送る。その中には何をどうして欲しいのか書いてある。
返ってきたステータスコードが送られてくると状態がわかる。という仕組み

## DNSサーバー

接続先のIPアドレスを教えてくれるサーバー。ブラウザのURLを叩くとまず最寄りのDNSサーバーに問い合わせ、ドメインを頼りに遡っていく。見つけたらIPアドレスを返す。

#### IPアドレスが必要な理由
ドメイン名だけではどこのサーバーにアクセスすればいいかブラウザはわからないから。DNSサーバーがドメイン名と関連づいているIPアドレスを送ってくれることで宛先がわかる。

## socket

プロトコルスタックが利用するライブラリ、接続先とソケットを繋ぎ、ディスクリプタが返ってくる。このディスクリプタよってたくさんのソケットを識別する。接続完了すると送信可能な状態となる。

# 第2章 プロトコル、スタック、LANアダプタ
ブラウザから叩いてそれがOS内でどのように流れていくかを説明。

## ソケットの作成

データを送受信するための準備段階。ソケット制御情報のメモリを開け、ディスクリプタという番号札のような認識IDをプロトコルスタックはアプリケーションに明け渡す。

## ソケットの接続

```js
connect(<ディスクリプタ>, <サーバー側のIPアドレスとポート番号>, ・・・)
```

作成しただけではまだ制御情報をプロトコルスタックは知らないのでデータを送受信できない。ブラウザが分かっているだけではダメ。通信相手との間で制御情報をやり取りしてソケットに必要な情報を記録することが必要。

クライアントはディスクリプタと送信元IPアドレス、相手方のポート番号を元にプロトコルスタックに接続を依頼する。そしてコントロールビットのSYNを1にする。

受け取ったサーバー側は同様の情報を送り、さらにACKを1にした値を送ることでパケットを無事受け取ったことを知らせる

## ソケットを使って送受信

アプリケーションはプロトコルスタックにHTTPリクエストメッセージを送る。すぐ送るのではなく量とタイミングのバランスをとって送信する。量はMTU(1つのパケットで送信できる最大長)とMMS(MTUからヘッダー部分を除いた純粋なデータ量)が判断要素となる。タイミングはOSによるがアプリケーション側でオプション指定できる

データが大きい時は分割してそのデータそれぞれにTCPヘッダーをつける。そしてクライアントとサーバーはお互いシーケンス番号とACK番号を送り合いパケットがちゃんと送信できたか確認し合う。TCPは送信失敗すると送り直す機能があるため。ACK番号だけでは非効率なのでウィンドウ制御方式を採用し、受信側の最大要領分は気にせず送っていく。

最後にレスポンスメッセージが返ってくるのでプロトコルスタックはアプリケーションに通知する。

## 切断

FIN:1 とACK番号を送り合い close を認識する。切断されたらソケットは抹消するが、すぐに抹消してしまうと切断のためのやり取りが失敗していた際に不具合が発生してしまう可能性が生まれてしまうので数分待ってから切断する。

## IP とイーサネットのパケット送受信動作

### パケットの仕組み

IP(IP用のヘッダー) と MAC(イーサネット用のヘッダー) という二つの道筋がある。IPはゴールとなる最終地点 MAC はそこに行き着くまでのに経由する駅の様なもので次の駅のみの情報が記載される。イーサネットはMACアドレスを頼りに次のハブやルーターを中継する。IPはIPアドレスのルートを調べ次のルーターにいく様イーサネットに依頼する。

## 概要

TCPはTCPヘッダーを付加したものと通信相手のIPアドレスをIP担当部分に渡す。IP担当部分はそのデジタルデータにMacヘッダーとIPヘッダーを付与する。そしてそれをハードウェアに渡す。このハードウェア内で電気や光の信号に変わる。IPヘッダーには宛先IPアドレスと送信元IPアドレスをつける。そしてMacヘッダーにMACアドレスを付与する。しかし相手先の次のIPアドレスは経路表を見て分かるがMACアドレスは分からない。その宛先MACアドレスを調べるために必要なのがARP。ブロードキャストを機能を通して取得するかARPキャッシュで直ぐに返してくれることもある。

## イーサネットの基本

多数のコンピュータが色々な相手と自由に安価に通信するために考案された通信技術。宛先MACアドレス、送信元MACアドレス、イーサタイプという3つの性質を持つ。

LANアダプタがデジタルデータを信号に変換。その中でMAC回路がコントロールする。MAC回路は送信パケットにプリアンブルとスタートフレームデリミタをつけ、フレームチェックシーケンスを末尾につける。プリアンブルは通信のための間隔時間を伝えるもの。スタートフレームデリミタはデータが始まる知らせ。フレームチェックシーケンスはデータに抜け落ちがないか調べるためのもの。

パケットが完成したらハブに送る。その動作には全二重モードと半二重モードがある。半二重モードは衝突の危険を避けるためのモード。衝突が怒ったらジャミング信号を出す。

TCPとUDPの違い。抜け落ちても再度送信する必要があるのはTCPを使う。抜け落ちても良いデータはUDPを使う

# 第３章 ハブ、スイッチ、ルーター

インターネットに繋がるための経由する機器達の解説

クライアントからリピータハブ・スイッチングハブ・ルーターという繋がりを見ていく。

## LANケーブル

信号をいかに劣化させないかがポイント

#### ツイストペアケーブル(より対線)

電気信号のため、ノイズの影響を受けやすい。電線を撚り合わせることでそういったクロストークの影響を少なくさせることができる

## リピータハブ

つながってているケーブル全てに信号を送る。受け取った側がMACアドレスをみて受信するかどうか判断する。

## スイッチングハブ

スイッチングハブのポートのMAC回路にはMACアドレスが割り当てられていない。そのため全パケットをとりあえずバッファメモリーに格納する。

MACアドレステーブルでMACアドレスを調べて、該当するポートから信号を送信する。そのテーブルはパケット受信時に登録更新を行っている。

## ルーター

ルーターの各ポートにはMACアドレスとIPアドレスが割り当てられていて、送られてきた「IPアドレス」で中継先を判断する。

経路表のIPアドレスとネットマスクを通してネットワーク番号を抽出して判断する。

### パケット受信動作

ルーターにはMACアドレスが割り振られているので該当するパケットのみ受信。MACヘッダーを破棄し、次の宛先となるMACアドレスをセットするためIPヘッダーのIPアドレスを見る。経路表を元に最もネットワーク番号が長い。つまり絞り込まれるものを探す。

ネットマスク欄が `0.0.0.0` の行はデフォルト経路と呼ばれ、そこに登録したルーターはデフォルトゲートウェイと呼ばれる。

アドレス変換機能によってプライベートアドレスとグローバルアドレスを対応づける。

# 第4章 アクセス回線、プロバイダ

ここからインターネットの内部。普段あまり意識することは少ない。

## 概要

アクセス回線とは、インターネットと家庭や会社のLANを結ぶ通信回線を指す。基本はLANと同じだが、距離も数も大規模なのでそれに適応したシステムが構築されている。

## ADSL

電話線を利用して高速に通信を行う。

インターネット接続ルーターは、MACヘッダー、PPPoEヘッダー、PPPヘッダーの3つをつけてADSLモデムにパケットを送付する。

ADSLは変調方式で信号化する。

## FTTH

光ファイバを用いたアクセス回線。
光を反射させて信号を送る。

## BAS

ADSLやFTTH等のアクセス回線からインターネットに向けて流れたパケットはBASに届く。

本人確認と設定値通知の機能がある。ログイン機能はPPPoEを用いる。ダイアルアップ機能をイーサネットに適応したもの。PPPoEはPPPメッセージをイーサネットのパケットに入れてやりくりする。

BASから送られてきたTCP/IP設定値はインターネット接続用ルーターのBAS側ポートに設定される。これでインターネット接続用ルーターの準備は完了。

## PPPoA

そのままセルに格納する方法。ADSLモデムとルーター一体側を用いることで実現できる。

## POP

多数のプロバイダのネットワークを相互に接続したものの中から、ユーザーが契約しているプロバイダの設備に繋がる。これをPOPという。

NOCはプロバイダの中核となるPOPから入ってきたパケットがそこに集まってくる。POPの規模の大きなものがNOC。

## BGP

プロバイダ同士の接続のために経路情報を交換し合う必要がある。この経路情報交換はルーターが自動で行い、その仕組みをBGPと言う。

## IX

プロバイダ接続の中心となる設備。プロバイダ同士が一対一で相互に接続しなければならない手間を省いてくれる。

# 第5章 ファイアウォール、キャッシュサーバー

相手方のサーバー側で最後に待ち受けている部分

## ファイアウォール

サーバーの手前に設置するアクセスを制限する機能。パケットフィルタリング型が現在主流。IPアドレスやMACアドレス等を見て通過させるか判断できる、

## 負荷分散

DNSサーバーのラウンドロビン機能でもできるが、純粋に順番を変えることしか出来ない。そのため、サーバーが落ちてしまった場合にそのサーバーだけスキップするといった柔軟な振り分けをすることができないというデメリットがある。

## 負荷分散装置、ロードバランサー

上記DNSサーバーの欠点を解消するための装置。Webサーバーの能力を見て振り分けることで柔軟な負荷分散を行うことが可能となる。

## キャッシュサーバー

プロキシを用いてデータをキャッシュするサーバー。データが同じならキャッシュサーバー代わりに出すことで素早い挙動を実現。

## フォワードプロキシ

プロキシとは「代理」という意味。メインであるサーバーの代理として用いられる。

クライアント側で最初に送るサーバーをキャッシュサーバーにさせること。フォワードプロキシサーバーは受け取ったURL先に転送する。

## リバースプロキシ

サーバー側に置くプロキシのこと。キャッシュサーバーと同様。


# 第6章 Webサーバー

パケットの中身を取り出してアプリケーションに渡す。そしてクライアントに返す。 

サーバーアプリケーションとクライアントは1体1でやり取りする。ソケットをコピーして実現。サーバーOSはマルチタスクあるいはマルチスレッドと呼ぶ機能によって同時に処理を行うことができるのでそれを利用した仕組み

Content-Type で中身を判断する。これで探検ツアーは終わり。

# 感想

この本を読んでネットワークの仕組みが少し理解できました。TCPで送信状態を管理し、IPがパケットを伝達する。責務を分かつことで柔軟性をもたせた仕組みはあらゆるソフトウェア開発においても参考にできる仕組みだと思ったので普段の開発でも応用していきたいと思います。

データが最終的に光の信号となり、それをデジタルデータに変換しそれを更に文字列として呼び戻す。これを長距離で実現したのはすごいことだなと。

より詳しい説明を知りたいとおもった方はぜひ読んでみてください。

# 参考文献

https://www.amazon.co.jp/dp/4822283119