ネットワークの仕組み～前提編

# ネットワーク入門の入門
本や記事を読んだ学習記録として綴っています。
厳密性がない部分がありますが、「だいたい合ってる！」くらいの温かい目で見てもらえると嬉しいです。
細かいツッコミは優しくお願いします…！😅

# 前提

## クライアントとサーバーとは
- webサイトを見る、youtubeを見る、Amazonで商品を買う などサービスを提供する側を`サーバー`という。
- 逆に、サービスを利用する側を`クライアント`という。
- webサイトのデータやyoutubeの動画データ、amazonのアカウントのデータや商品データは`サーバー側`で保存されている。 

<br>

## プロトコルとは
- コンピュータ同士がネットワークを通じて通信するために決められた共通のルールのこと。

    :::note info
    よくある比喩
    - 日本語や英語：プロトコル
    - 会話・コミュニケーション：通信
    - 話の内容：データ
    
- 通信を行うためには、必ず同じプロトコルを互いに使用しなければならない。
- プロトコルさえ互いに同じであれば、異なるメーカーやCPU、OS同士でも通信ができる。

<br>

## Webは HTTP、HTML、URI でできている
- HTTP（HyperText Transfer Protocol）
    - Webページのデータを送受信するためのルールのこと。

- HTML（HyperText Markup Language）
    - Webページの構造を記述するためのマークアップ言語のこと。

- URI(Uniform Resource Identifier)
    - Web上の特定のリソース（Webページ、画像、動画など）」を識別するための文字列（アドレス）のこと。

<br>

## リクエストとレスポンスとは
-  クライアントはサーバーに`リクエスト（要求）`を送り、サーバーは`レスポンス（応答）`を返す。
- リクエスト：「Qiitaの○○という記事のHTMLデータをくれよ。」
- レスポンス：HTMLデータがレスポンスとして返ってくる。

<br>

## データのやり取りを行っているのはアプリケーションではなく、OSのプロトコル・スタック

- アプリケーション（例：ブラウザ、メールソフト）は直接データを送受信しているわけではなく、OSのプロトコル・スタックに依頼している。

![図１](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761004/db9f5e4f-3414-dcaa-373c-727366596cfe.png)
*図１：データ送信の階層構造*

1. アプリケーション側で送信するデータを準備する
1. アプリケーション側の`Socketライブラリ(ソケットAPI)`を使用して通信の準備する
1. SocketライブラリがOSのプロトコル・スタックに「このデータを送信してください」と依頼する
1. OSの`プロトコル・スタック`がデータに対して、あれこれしてLANドライバに送信依頼をする
1. LANドライバでは、あれこれした送信するデータを電気信号や光信号に変換する など
1. LANアダプタを通じて、送信される

:::note info
仲介役
- アプリケーションとOSのプロトコル・スタックの仲介役が`Socketライブラリ`
- OSとハードウェアの間の仲介役が`ドライバ`
:::


<br>

## ソケットって何ぞや
:::note info
- ソケット：通信の窓口であり、データの出入り口のようなもの
- コネクション：通信経路のことで、ソケットをつなぐパイプのようなもの
:::

- 以下の２つのソケットをコネクションでつなぐことで、データの送受信ができる
    - クライアント側のプロトコル・スタックのTCPのソケット
    - サーバー側　　のプロトコル・スタックのTCPのソケット
- 一方のソケットが抹消されれば、もう片方のソケットも抹消される。つまり、この状態で通信動作は終了される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761004/3772ff3e-052b-c1c9-61d0-2ec911435bfc.png)

:::note info
データをソケットに渡すと、OSのプロトコル・スタックがそれを適切に処理し、相手のソケットまで届けてくれます。
:::

<br>

## プロトコル・スタックへの解像度を少し上げる
:::note info
結論
アプリケーションのSocketライブラリがプロトコル・スタックのTCPやUDPの処理を呼び出す。

TCPがコネクションを作成して、データのやり取りを行う。

- Socketライブラリのメソッド
    - socket()
    - connetct()
    - write()
    - close()
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761004/1c3a8fad-394b-6cfd-d71f-bfd73e00b2f0.png)

*図２：Socketライブラリからプロトコル・スタックへの依頼
(これはあくまでイメージです。実際はもっと複雑ですので、あまり文句を言わないでくださいね！)*

<br>

## 送信するデータとは？
:::note info
結論
1. Socketライブラリで`コネクションが確立`される
1. アプリケーションがSocketライブラリの`write()`でTCPに送信するデータを渡す
1. 大きいデータを送信する場合は、TCPがデータを分割する(パケット化)
1. TCPで`ヘッダ(TCPヘッダ)`をデータに付加する
1. IPで`ヘッダ(IPヘッダ)`をデータに付加する
1. IPがドライバ・ソフトに送信依頼をする
:::

- TCPによるデータの分割（パケット化）
    - MTU：１つのデータを運ぶことのできるデジタルデータの`最大長(1500B)`のこと
        - MTU(1500B) = IPヘッダー(20B) + TCPヘッダー(20B) + 送信するデータ(最大1460B)
    - MSS：IPヘッダーとTCPヘッダーを除いた１つのパケットで運べるTCPデータの最大長 
        - MSS = 送信するデータ(1460B)

<br>

## UDPってなんぞや。TCPとは違うんか？
:::note info
結論
- TCPは、コネクションを作成してデータのやり取りをする
- UDPは、コネクションを作成せずにデータを送る

とりあえず。

- 確実にデータを相手に届けたいときは、TCP
    - Webサイトやメール送信、ファイル転送など

- データの欠損があったとしても、速さを重視するときは、UDP
    - 動画・音声ストリーミング、オンラインゲームなど
:::

- 今後、登場する`名前解決`ではUDPを使用している

<br>


# 出典

- 『ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識』
- 『マスタリングTCP/IP―入門編―(第6版)』