TCP/IPについて

TCP/IPについてまとめる！TCP/IPを学びわかったことはwebの仕組みを知る上で重要な内容であることがわかりました！
今や、FWがたくさんある中で実装をこなすことだけを考えればタスク内容によってはこなせる！私は2年してますが理解してなくても簡単なタスクはこなしてきました！
しかし、TCP/IPを理解しないで業務をこなすことはナンセンスでした！
(流石にサーバーとクライアントの仕組み、リクエストやレスポンスについては理解していましたが)

車の整備士が車のエンジンの仕組みや車が動く仕組みを理解しないで整備ができないのと同じです！

TCP/IPの仕組みを理解しないことはWebエンジニアとして本末転倒でした！
早くに知っておけばよかったと後悔してます！(正直、優先度を下げてました)
学び大事なことだとわかったので徐々に以下にまとめます。


<h3>1章 TCP/IPについて</h3>
TCP/IPは、webの通信プロトコルの一つである。
TCP/IPはデータを受け渡すプロトコル。

郵便を配達するルールと同じようにインターネットではデータのやり取りに応じてルールがあり
その一つにTCP/IPのプロトコルがある！
<h3>2章 通信サービスとプロトコル</h3>
Later.....

<h3>3章 アプリケーション層</h3>

<h4>アプリケーション層の位置付け</h4>
TCP/IPの位置付けとしてアプリケーション層はユーザーと一番接点が近い層に存在する。

アプリケーション層の役割はクライアントとサーバーの通信を実現する概念を持つ。
アプリケーション層で役割があるこれをアプリケーションプロトコルと呼ぶ。

<h4>アプリケーションヘッダー</h4>
アプリケーションヘッダーはアプリケーション層で付与されるヘッダをアプリケーションヘッダと呼ぶ。
アプリケーションヘッダーに何が書き込まれているのかの情報は「人が読めるテキストベース」と「機械だけが読み込めるバイナリデータ」が書き込まれる場合がある。


<h4>SSL/TLSについて</h4>
SSLはインターネットの通信を暗号化するプロトコル。SSL/TTLのプロトコルが可能となっているかを確認する部分はURL部分の先頭に「🔐」マークがあるかだ。
「🔐」がある場合は「https通信」が実現できている証である。


<h4>電子メールについて</h4>

- メールのやり取りがお互いのメールボックスを介して行われるところ！

- ユーザー名@ドメイン(メールボックスの住所)
  - クライアントになるのがメーラーと呼ばれるもの
  - 電子メールサービスのやり取りはメールサーバーとメーラーのやり取りで成り立っている！

SMTPとPOPというプロトコル！


<h4>文字コード</h4>

- コンピュータ内では「文字コード」と呼ばれる特殊な数値を使って文字コードを表します。
電子メールのような「文字」を扱うサービスは「文字コード」を使って通信を実現しています。

- 人間の言葉を機会がわかるように変換することを「デコード」、機械の言葉をm人間があわかるように変換することをエンコードと呼ぶ。

<h4>MIME</h4>
-電子メールでは実は制約が存在する。以下である。

1. 件名に日本語が使えない
1. テキストしか送れない
しかしながら、電子メールで件名に日本語を入力できたり、テsキスとデータだけでなく、画像ファイルなどを送ることができるのは「MIME」が役割を担っているからである。


<h3>4章 トランスポート層</h3>

4章 トランスポート層
トランスポート層の実現したいことは、「通信を実現すること」。
もっと具現化すると、「アプリケーション層のどのプロトコル」に送信するかまで責任を持つ必要がある。目的のプロトコルを特定するためにポートが必要。ポートはプロトコルの出入口である。ポート番号という番号を使って、どのプロトコルを渡すかを特定できる。

<イメージ>

![トランスポート層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849596/d5cd26ff-a6fe-9226-1a8f-972da2ad4d63.png)

トランスポート層には2つのプロトコルがある。
TCP/UDPだ。

TCP・・・相手に安全/確実にデータを届けるプロトコル。データが途中で破損するなど、何らかの原因でデータが送れない場合に再送出来る。通信サービスやwwwサービスでつかわれる。

UDP・・・データを早く届ける役割。データを早く送りつづけることに注力する。・送った後は責任を持たない。IP電話サービスや配信ストリーミングで使われる。


<相手に届ける>

データはいつも確実に届けるとは限らないので問題が起こった際に何らかの対応が必要だ。通信サービスに見合った方法で対応するのがトランスポート層だ。

<h4>TCP ~ 信用第一 ~ </h4>

### TCPは安全/確実にデータを届けることが役割。
通信は受信側と1vs1で行う。これをコネクション型通信と呼ぶ。3ステップで行う。

 - STEP1
    - 受信側がデータを受信できる体制であるかを確認する。確認後、データ通信を確立します

- STEP2
    - データを決められた大きさに分割し、TCPヘッダをつけて順番に送信する。トランスポート層で扱うデータをセグメントと呼ぶ

- STEP3
   - データを送り終えたら通信が終了する


### アプリケーション層に届ける
- STEP1 
  - TCPヘッダの情報を見てデータを順番通りにする

- STEP2
  - TCPヘッダをとってデータをくみなおす

- STEP3
  - アプリケーション層のプロトコルを渡す


### TCPの仕組み 確実に届ける方法

- 連絡方法は通信相手に通信状況を伝える手段としてコントロールフラグがある。
相手に伝えたい項目は「1」、そうでない場合は0にする。
通信の世界で一般的に相手に確認しながら通信する方法を「ハンドシェイク」と呼ぶ。
TCPの世界では「通信を行う連絡」をして、そのと受け取る側から、承諾する連絡を行い、
受け取り側の承諾に対し、送る側が承諾の連絡をする。この通信を3ハンドシェイクと呼ぶ。

### データ量の確認
送信する側のデータサイズを、セグメントサイズ、受信する側のデータサイズをウィンドウサイズと呼ぶ。


<h3>5章 ネットワーク層</h3>

イメージ

![ネットワーク層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849596/afaed1f4-bfee-e47a-b9a2-e70900a463eb.png)

Later....

<h3>6章  データリンク層と物理層</h3>
ネットワークの種類によって通信方法が異なる。同じルールに基づいて繋がっている一塊をデータリンクと呼ぶ。


ネットワーク層と物理層の橋渡し

イメージ
![ネットワーク層とデータリンク層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849596/8c689972-6d52-d395-9b13-8d2697ede337.png)


<h3>7章 ルーティング</h3>
7章　ルーティング
ルーターがどのように道案内するかをこの章で説明する

ルーターは単なる宛先を決める中継地点ではなく、届いたパケットの宛先を確認して次の転送先を決める役割を持つ。このような機能をルーティングと呼ぶ
ルーターは次の転送先が一つとは限らず、次の転送先をきめるための情報を持つ！この情報をルーティングテーブルと呼ぶ

ルーティングテーブル
1 宛先ネットワーク
2 ネクストホップアドレス
3 メトリック
4 出力インターフェース
5.経路の情報源
6.経過時間

経路の決め方は2通りある
- 1 静的ルーティング
   - あらかじめ管理者によって登録されたルーティングテーブルを使用し宛先まで届ける方法
   - 経路は固定になるので、経路中に一箇所でエラーが起こると届けられない

- 2 動的ルーティング
   - ルーター同士が情報交換し、最も適切な経路を使って届ける方法
   - ある経路に不具合が起きても自動的に届けられる！

ルーター同士の情報交換

- 動的ルーティングはあるルーターが繋がってる他のルーターから情報を得てルーティングテーブルを作成する。この仕組みを**ルーティングプロトコル**と呼ぶ。

- ルーティングプロトコルは2つある
   - IGPとEGP
      - IGPは会社などの組織に属するルーター同士がやりとりする

      - EGPは異なる組織に属するルーター同士がやり取りするためのプロトコル。

      ※主なルーティングプロトコルは省略。

ルーティングの仕組み

ルーターの中の仕組みについておさらい
1.パケットを受け取り、ネットワーク層に渡す
2.ルーティングテーブルをみて、転送するルーターを確認

3. 次に転送するルーターのMacアドレスを書き込み、送り出す。

転送流れ
ipアドレスは最終目的地を、Macアドレスは経由地をさします！



tracertコマンドについて
tracertコマンドはWindowsで使うコマンドのようです。

Macで同様の機能を持つコマンドは「traceroute」です。これは、ネットワーク経路を追跡するためのコマンドで、特定のホストへの接続経路を表示します。

```bash
traceroute [ホスト名またはIPアドレス]
```

例えば、Googleのサーバーへの経路を調べる場合は
```bash
traceroute google.com
```
### 注意点

- tracerouteは、tracertと比べて出力の形式が少し異なる場合ある
- Macのターミナルでは、特定のオプションを追加してより詳細な情報を得ることもできます。例えば、`-m`オプションで最大ホップ数を指定できる

これで、Macでもネットワークの経路を確認することができます。



<h3>8章 セキュリティ</h3>
<h4>セキュリティについて</h4>
TCP/IPには直接関係はないが通信をすることはセキュリティにも関わっている。
通信する際に、悪者が様々な攻撃手法で悪用する。その点について、まとめる！

まず、攻撃手法は以下である
- 盗聴
盗聴は、通信中のパケットを不正にコピーされ、個人情報を盗まれる

- 改竄
通信中のパケットを盗まれて情報を不正に書き換えられること

- 不正アクセス
他人のコンピュータに許可なく侵入すること
- Dos攻撃/DDos攻撃
サーバーなどに大量のデータを送りつけ、機能を麻酔させること

<h5>それぞれの対策</h5>

 - 🔷暗号化、複合化
 情報を守るための最も基本的な仕組み。第三者が読めないように暗号化し、元に戻すことを複合化と呼ぶ

 - 🔷電子署名
データが改竄されてないかを判断する仕組み！データを特殊な方法で数値化し、暗号化したものを電子署名。

   - 送信側
     - データを数値化する
     - 数値化したデータを暗号化

   - 受信側
     - 暗号化されたデータを複合化
     - 複合化したデータを同じ方法で数値化し、数値が等しければ改竄なしとなる！


 - 🔷認証局による保証
認証局が通信の仲介者となり、通信に問題ないことを保証する！

   - 送信側
      認証局に証明書の発行を申請

   - 認証局
     申請者の身元の確認や身元を保証する証明書の保証/管理を行う

   - 受信側
     認証局に証明書の有効性を確認


 - ファイアウオール
送られてくるパケットを全て無条件に受け入れては安全性を担保できません。パケットを制御する機能を持ったソフトウｴアやハードウエアを利用します。これらを「ファイアウオール」と呼ぶ


<h4>ファイアウォールの仕組みについて</h4>

- 階層ごとにヘッダの内容に応じたチェック項目を設け、クリアしたデータだけを階層に渡す方法仕組みである。不審なデータをふるい落とす！どの階層にどんな制限を設けるかは管理者が決定する。

Ex.
<アプリケーション層>
ウイルスの侵入を避けるために決められた形式ファイルしか受け付けない


<トランスポート層>
決められたポート宛のパケット以外は受け付けない

<ネットワーク層>
許可されたipアドレスからのパケット以外は受け付けない


<h4>プロキシサーバー</h4>

- クライアントに代わってインターネットに接続し、要求に応じた通信サービスを受けて結果をクライアントに提供するサーバーをプロキシサーバーと呼ぶ
メリットは3つあル。

 1. 安全性
      - ユーザー認証機能やサービスの利用制限を設定しておけば、クライアントの安全を一括して守れる

2. 匿名性
   - 外部のサーバとアクセスするのはあくまでもプロキシサーバーなのでクライアントの固有の情報が外に漏れない

3. 利便性
   - プロキシサーバーはすべてのユーザーが閲覧したwebサイトの情報を一時的に保管する。プロキシサーバー内に保管されているWEBサイトを要求されると、外部サーバーとやり取りせずクライアントに返す！