インフラ初心者が知っておくべき基礎知識まとめ【HTTP・IP・DNS・ポート】（🔰）

## はじめに
現在個人プロダクト開発を行っており、AWS上でデプロイすることを目指してインフラの学習を始めています。ネットワーク、インフラがそもそもどんものなのか自分なりにまとめました。

## HTTP
### HTTPとは
`Hypertext Transfer Protocol`（ハイパーテキスト・トランスファー・プロトコル）の略です。直訳すると「ハイパーテキスト送るためのルール」です。

基本的な考え方は、クライアントとサーバーがやり取りするメッセージの内容や手順を定めたものです。これがなければ、Webサイトを見たり情報をやり取りすることができません。

片方が日本語で話しかけたのに、もう一方が英語でお返事したのでは、コミュニケーションが成り立ちませんよね。
それと同じです。


クライアント（ブラウザ）がサーバーにリクエストを送信することを`HTTPリクエスト`と呼びます。
サーバーはリクエストを受け取り、応答メッセージを返すことを`HTTPレスポンス`と呼びます。

### プロトコルとは
プロトコルとは、「コンピューターやデバイス同士がデータをやり取りするための手順を定めたもの」です。ちなみにHTTP はプロトコルの一種です。抽象度がひとつくらい高いイメージです。

HTTPプロトコル以外は以下のようなものがあります。

`FTP（File Transfer Protocol）`
ファイルを送受信する際のルール。例えば、サーバーにファイルをアップロードしたり、ダウンロードしたりするのに使います。

`SMTP（Simple Mail Transfer Protocol）`
メールを送るためのルール。

### HTTP リクエスト
HTTPリクエスト には、以下の2つの情報が含まれています。

`「何を」`
具体的には URI（Uniform Resource Identifier） によって指定されます。URI は、アクセスしたいリソース（ページデータやファイル）を指し示します。
https://example.com/index.html の場合、index.html がリクエストしたいリソースです。

`「どうしてほしいのか」`
上記のファイルを対象に、どうして欲しいのかを指定します。これをメソッドといい、主に以下の種類があります。
| メソッド  | 説明                                                                                 | 主な用途                                      |
|-----------|--------------------------------------------------------------------------------------|---------------------------------------------|
| **GET**   | サーバーからリソースを取得するためのリクエスト。                                      | WebページやAPIからデータを取得する。         |
| **POST**  | サーバーにデータを送信するためのリクエスト。                                          | フォームの送信、データの登録処理など。       |
| **PUT**   | サーバー上のリソースを作成または更新するためのリクエスト。                            | データの更新や新規作成。                     |
| **DELETE**| サーバー上の指定されたリソースを削除するためのリクエスト。                            | データの削除処理。                           |
| **HEAD**  | GETリクエストと同じだが、レスポンスボディは含まれず、ヘッダーのみを取得するリクエスト。 | リソースの存在確認やメタデータの取得。       |

### HTTP レスポンス
HTTPリクエストを受け取ったサーバーは、処理の結果をクライアントに返します。これが HTTPレスポンス です。
主に以下の内容が含まれています。

`「ステータスコード」`
サーバーがリクエストをどのように処理したかを示す番号です。
| ステータスコード | 説明                                                                 | 用途                                               |
|-------------------|----------------------------------------------------------------------|-------------------------------------------------------|
| **200 OK**        | リクエストが成功し、サーバーが期待通りのレスポンスを返した。           | 通常の成功レスポンス。                                |
| **201 Created**   | リクエストによりリソースが新規作成された。                            | 新規リソースの作成時（POSTリクエストの成功）。    |
| **204 No Content**| リクエストは成功したが、返すデータがない。                            | データが不要な処理（DELETEリクエストの成功）。    |
| **301 Moved Permanently** | リソースが恒久的に別のURLに移動した。                                | URLの変更をクライアントに通知。                       |
| **400 Bad Request**| リクエストが不正でサーバーが処理できない。                           | 入力データの不備やフォーマットエラー。                |
| **401 Unauthorized**| 認証が必要だが、提供されていない、または失敗した。                   | 未認証のリクエストへの応答（ログインが必要）。    |
| **403 Forbidden** | リクエストは理解されたが、権限がないため拒否された。                 | アクセス権限がない場合。                              |
| **404 Not Found** | 指定されたリソースが見つからない。                                   | 存在しないURLや削除されたリソースへのリクエスト。     |
| **500 Internal Server Error** | サーバー内部でエラーが発生し、リクエストを処理できなかった。          | サーバー側のバグや処理の失敗。                        |

`「レスポンスヘッダー」`
サーバーから送られる追加情報（コンテンツの種類やデータサイズ）。
Content-Type: text/html → コンテンツがHTMLであることを示す。
Content-Length: 1234 → コンテンツのサイズを示す。

`「レスポンスボディ」`
実際のデータ（HTMLファイルや画像データ）。ブラウザがこれを受け取ってWebページを表示します。

## IPアドレス
### IP アドレスとは
IPアドレスとは、ネットワーク上の機器を識別するためのインターネット上の住所です。
インターネットでページを閲覧したり、メールの送受信を行うには、データの送信元や送信先を識別しなくてはいけないが、この識別に使われる番号がIPアドレスです。


### IP アドレスの種類
IP アドレスにはパブリック（グローバル） IP アドレスとプライベート（ローカル） IP アドレスの2種類があります。

| 分類              | パブリックアドレス                              | プライベートアドレス                          |
|--------------------|-----------------------------------------------|---------------------------------------------|
| **使用範囲**      | インターネット全体で利用される。                 | LAN（ローカルネットワーク）内で利用される。     |
| **一意性**        | 世界中で一意である必要がある。                   | 同じネットワーク内で一意であればよい。         |
| **接続先**        | インターネット上の他のデバイスと通信可能。         | 直接インターネットには接続できない。|
| **主な使用例**    | Webサーバー、クラウドサービス。                  | 家庭内ルータ、PC、スマート家電。              |
| **アドレス範囲**  | 全体的に割り当てられる。           | 10.0.0.0 ～ 10.255.255.255<br>172.16.0.0 ～ 172.31.255.255<br>192.168.0.0 ～ 192.168.255.255 |

![スクリーンショット 2025-02-02 14.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838211/ac29f83a-67ff-55a4-e157-ba43646b87f7.png)
引用　https://www.cman.jp/network/term/ip/

### IP アドレスの割り当て
パブリック IP アドレスは世界共通で割り当てられ使用するため、勝手に好きな番号を使用することはできません。パブリック IP アドレスはどのように割り当てられるのでしょうか。

パブリック IP アドレスは、ICANNと呼ばれる国際的な機関が管理しており、国やプロバイダー（ISP）によってあらかじめ使用できる範囲が決められています。
その下部組織として、日本ではJPNIC（一般社団法人日本ネットワークインフォメーションセンター）が管理しており、その配下に各プロバイダー事業者が位置しています。
一般ユーザー、企業は、プロバイダーからIPアドレスの割り当てを受けることで、使用が可能となります。

ちなみにIPアドレスの「割り当て」と「割り振り」は意味が異なります。

ICANNなどの上位レジストリから下位レジストリに対してIPアドレスを与えることを「割り振り」と言い、プロバイダなどからエンドユーザーにIPアドレスを与えることを「割り当て」と言います。

### IP アドレスのバージョン
IP アドレスには IPv4 と IPv6 があります。
1981年に開発されたIPv4は、インタネッターネット初期から使用されていましたが、32ビットのアドレス空間をもち、約43億個のアドレスと提供していました。

当時は43億個で十分と考えられていましたが、IoTデバイスなど、接続するデバイス数が爆発的に増加したことを受け、IPv6が1998年に提案されました。

| 特徴                | IPv4                                       | IPv6                                      |
|---------------------|--------------------------------------------|-------------------------------------------|
| **アドレスの長さ**  | 32ビット（約43億個）                       | 128ビット（ほぼ無限）                     |
| **表記形式**        | 10進数（例: 192.168.1.1）                  | 16進数（例: 2001:0db8::1）                |
| **アドレス枯渇**    | 枯渇している                              | 解決済み                                  |



### IP アドレスの CIDR 表記
IP アドレスは、CIDR 表記という方法で表記することができます。10.0.0.0/16 のように表記します。
この16という数字がネットワーク部とホスト部を分ける基準のビットとなります。今回の例でいうと、16ビットまでがネットワーク部、残りの16ビットがホスト部という具合です。

ネットワーク部分が同じIPアドレスは同じネットワーク（例えば、同じローカルネットワークやVPC）に属します。一方、ホスト部分はそのネットワーク内でのデバイスを一意に識別します。

https://qiita.com/TakanoriVega/items/f567d71c9f400d45db28

### IP アドレスの表記
IP アドレスは、IPv4 の場合、192.168.1.1 のように表記します。これは32ビットの正整数値を4組にわけて表記したものです。では、192.168.1.1を32ビットの正整数値で表現してみましょう。

192.168.1.1 は次の4つのオクテット（8ビットの単位）から構成されます。
```
192    168    1    1
```

各オクテットを8ビットの2進数に変換。
```
192  = 11000000
168  = 10101000
1    = 00000001
1    = 00000001
```

すべてのオクテットを連結し、1つの32ビット値を作成。
```
11000000 10101000 00000001 00000001
```

この2進数を10進数に変換します。各オクテットは 8ビット（1バイト） なので、それぞれの重み（桁）を考慮して 256の累乗を掛ける。
```
(192 × 256³) + (168 × 256²) + (1 × 256¹) + (1 × 256⁰)
= (192 × 16777216) + (168 × 65536) + (1 × 256) + (1 × 1)
= 3221225472 + 11010048 + 256 + 1
= 3232235777
```

IPv4アドレス 192.168.1.1 を32ビットの正整数値で表現すると、3232235777 になります。

###  IP アドレスの確認
今自分が使用しているパソコンのIP アドレスを調べてみましょう。

`パブリックIPアドレスの場合`
自分はMacを使っているため、以下コマンドで確認することができました。

```
curl ifconfig.me
```

https://qiita.com/hypermkt/items/0c9670f73c9cf63f55d3

`プライベートアドレス`
1. 画面左上のAppleマークをクリックし、「システム環境設定」を洗濯。
1. 「ネットワーク」をクリック。
1. 左側のリストから使用している接続を選択。
1. 接続状況の下に、IPアドレスが表示。

## DNS
### ドメインとは
ドメインとは、インターネット上の住所を構成する文字列の一部です。

例えば、GoogleのWebサイトは 「google.com」 というドメインを持っています。
もしドメインがなかったら、Googleを開くためには 「142.250.74.78」 みたいな数字の羅列（IPアドレス）を覚えなければなりません。
「google.com」 のようなわかりやすい名前（ドメイン） を使うことで、簡単にアクセスできるようになります。

![スクリーンショット 2025-02-02 14.15.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838211/c3a64297-7f92-cc57-692b-e37bf3d4d95d.png)
引用　https://www.kagoya.jp/howto/it-glossary/domain/web-01/

### DNSとは
DNS（Domain Name System）とは、インターネット上の「住所変換システム」 です。

例えば、google.comを開いた場合を想定します。
1. ブラウザで「google.com」を開く
1. DNSが「google.com」に対応するIPアドレスを探す
1. IPアドレス「142.250.74.78」を見つける
1. そのIPアドレスのサーバーにアクセスし、Googleのページを表示

 DNSがなかったら？
毎回「142.250.74.78」とか「192.168.1.1」みたいな 数字のIPアドレスを覚えないといけません。DNSのおかげで、簡単にWebサイトにアクセスできます。

### ドメイン名と IP アドレスの対応
www.google.com の IP アドレスを調べ方ですが、以下コマンドで確認することができます。
```
nslookup www.google.com
```
表示された結果の中の「Address:」に続く数字が、現在の「www.google.com」のIPアドレスの一つです。

## ポート番号
### ポート番号とは
ポート番号は、コンピュータがどのサービス（アプリ）と通信するかを区別するための番号です。簡単に言うと、建物（IPアドレス）の中にある部屋（ポート）を指定するものです。もし、IPアドレスだけでは、送られてきた様々な種類のデータが、サーバー内のどのアプリケーションやサービスがデータを処理すべきかまで判断できません。


https://qiita.com/t-furusato/items/0397459ecb39cecc2d81


### 代表的なポート番号
代表的なポート番号として、ウェルノウンポートと呼ばれるものがあります。これはは、よく使われるポート番号（0〜1023番） のことで、世界共通の標準ポートとして定められており、インターネットやネットワークで広く使われています。

### 代表的なウェルノウンポート（Well-Known Ports）

| **ポート番号** | **サービス名** | **用途** |
|--------------|-------------|------------------------------|
| **20** | FTP (データ転送) | ファイル転送プロトコルのデータ転送用 |
| **21** | FTP (制御) | FTPの接続・コマンド送信用 |
| **22** | SSH | リモートログイン（暗号化された通信） |
| **23** | Telnet | リモートログイン（暗号化なし、非推奨） |
| **25** | SMTP | メール送信（送信サーバー） |
| **53** | DNS | ドメイン名をIPアドレスに変換 |
| **80** | HTTP | Webサイト（暗号化なし） |
| **123** | NTP | 時刻同期（ネットワーク時間プロトコル） |
| **143** | IMAP | メール受信（サーバーに保存したまま） |
| **443** | HTTPS | Webサイト（暗号化あり） |



### HTTP/HTTPS 通信
ブラウザでウェブページを開く際に、ポート番号を指定することができます。

https://www.google.com/ をブラウザで開く際に https://www.google.com:443 を指定しても同じページが開かれますが、https://www.google.com:22 とするとページが開かれません。

それは、なぜでしょうか。

`443の場合`
ブラウザで 「https://www.google.com」 を開くと、実際には ポート443（HTTPS） で通信しています。
つまり、以下の2つのURLは 同じ意味 になります：

https://www.google.com（ポート番号省略）
https://www.google.com:443
そのため、どちらのURLでも同じページが開かれる というわけです。

`22の場合`
ポート22 は、SSHというリモートログイン用のプロトコルに割り当てられています。
つまり、ポート22で接続しようとすると、Googleのサーバーは 「これはWebページではなく、SSHの接続要求だ」と判断します。

Googleのサーバーは SSH接続を受け付けていないため、ブラウザには「接続できません」 というエラーが表示されます。

### ポート番号の確認
今自分が使用しているパソコンで使用しているポート番号とそのポート番号を動かしているプログラムを調べてるには以下のコマンでで確認することができます。

```
sudo lsof -i -P -n
```
また、特定のポートを調べるには以下の通りです。今回は、80番で確認します。
```
sudo lsof -i :80
```

## Cookie とセッション
### ステートレス
HTTPは特徴としてステートレスであると言われます。「ステートレス（stateless）」とは、サーバーが前回のやりとり、いわば状態を覚えていないことを意味します。簡単に言うと、毎回、リクエスト（通信）が独立している ので、前の通信の情報を覚えていないということです。

一見ステートフルであるほうが便利そうではありますが、何件ものクライアントの通信をサーバーが保持しクライアントごとに処理をするとサーバーの負担が大きくなってしまうため多くの処理を返す必要のあるWebサーバーはステートレスであることが適しています。

### Cookie とセッション
HTTPは「ステートレス」なので、ログインしても 次のページに移動するとサーバーは誰がログインしているのか分からなくなるという問題があります。

そこで、ログイン状態を維持するために Cookieとセッションが使われます。

`Cookie（クッキー）`
Cookieとはクライアントに保存された内容です。
ログイン情報であればログイン処理を行ったあとに、Webサーバーはレスポンスヘッダの中のSet-Cookieヘッダ内にユーザーIDやパスワードなどを入れてクライアントに送り返します。
そして送られてきたCookieはクライアントに保管され、また同じサーバーにリクエストを送るときに同じCookieが送られるのでユーザー情報の識別ができるという仕組みになります。

`セッション（Session）`
CookieはHTTPのリクエストヘッダやレスポンスヘッダを利用しているため第三者から個人情報やユーザー情報などの重要な情報を盗まれる恐れがありセキュリティ上大きな問題があります。

セッションIDはWebサーバーで生成されてCookieに入れられてWebクライアントに送られます。
次回以降WebクライアントはセッションIDをリクエストに含めてサーバーに送ることでサーバーはセッションIDをもとにクライアントの状態を復元することができます。

| **項目**        | **Cookie**                          | **セッション（Session）**              |
|---------------|---------------------------------|----------------------------------|
| **データ保存場所** | **クライアント**       | **サーバー側**                     |
| **保存するデータ** | ユーザーIDやログイン情報など          | セッションID |         
| **セキュリティ**  | **リスクあり** | **比較的安全**        |
| **サーバー負荷**  | **ほぼなし（クライアント側で処理）** | **負荷あり（セッション管理が必要）** |
| **主な用途**    | ユーザー設定・ログイン情報の保存      | ログイン管理・ショッピングカートなど  |

## さいごに
本記事では、ネットワークとインフラの基礎として、HTTPの仕組み、IPアドレス、DNS、ポート番号、Cookieとセッション などについて整理しました。
今後は、これらの知識を活かしながら、AWS上でのデプロイ に取り組み、実際にアプリケーションを公開できるように進めていきたいと思います。また、セキュリティやパフォーマンスの最適化についても学び、より実践的な知識を身につけていく予定です。
学習を続けながら、知識を体系的に整理し、実際の開発や運用に活かせるようにしていきたいと思います。ここまで読んでいただき、ありがとうございました！