Web技術を理解する(通信プロトコル、IPとポート番号、ステートフルとステートレス)

## はじめに
書籍[『プロになるためのWeb技術入門』――なぜ，あなたはWebシステムを開発できないのか](https://www.amazon.co.jp/%E3%80%8E%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8F%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%EF%BC%8C%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B-ebook/dp/B09MVGM99L/ref=sr_1_1?crid=2RUFI5FRBVD4D&keywords=web%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80&qid=1645489804&sprefix=web%E6%8A%80%E8%A1%93%2Caps%2C205&sr=8-1)　を読みました。
![本](https://m.media-amazon.com/images/I/51TjNYBxrGL._SX260_.jpg)

下記のIT用語についての学びを書いていきます。

**IT用語**
- 通信プロトコル
- ポート番号
- リクエスト
- レスポンス
- ステートフル
- ステートレス
- クッキー

**※正確性に欠ける可能性がございますが、ご了承ください。間違いなどがありましたらご指摘くださると幸いです。**


## 目次
1. [通信プロトコル](#通信プロトコル)
1. [IPアドレスとポート番号](#IPアドレスとポート番号)
1. [リクエストとレスポンス](#リクエストとレスポンス)
1. [ステートフルとステートレス](#ステートフルとステートレス)


## 通信プロトコル

通信プロトコルとは、**コンピュータがネットワークを利用して通信するための取り決めのこと。**

### なぜ必要なのか？
なぜ通信プロトコルが必要なのか？
それは、メーカーやOS、CPUが違うコンピューター同士でも同じプロトコルを使用すれば互いに通信することができるからです。
逆に同じプロトコルを使用しなければ通信することはできません。


### 代表的なプロトコル
インターネットで代表的なプロトコルは`IP`, `TCP`, `HTTP`などや、
ファイル転送のための`FTP`、メール転送のための`SMTP` などもがあります。
もっと身近な例で言うとIPhoneユーザーならお馴染みの`AirDrop`も通信プロトコルです。



## IPアドレスとポート番号

IPアドレスとは
> IPアドレスはパソコン、スマートフォンなどでインターネット通信を行う場合に利用されるピリオドで区切られた４組の数字で、インターネット上の住所のことです。
> 例: 192.168.0.1
> インターネットに接続されたコンピュータはすべてIPアドレスを持っていて、そのコンピュータを識別することができます。

ポート番号とは
> 同一のコンピュータ内で通信を行っているプログラムを識別するときに利用されます。
> 例: 192.168.0.1:**80** (ポート番号は80)
> ポート番号は0番～65535番まであります。

IPアドレスを`建物の住所`に例えるなら、ポート番号は`部屋の番号`という感じです。

### TCP/IP
TCP/IPとは
> TCP/IPはインターネット上の標準であり、デファクトスタンダードとして世界中で最も広く使われている通信プロトコルです。
>インターネットを構築する上で必要な`IP`や `ICMP`, `TCP`, `UDP`, `TELNET`, `FTP` や`HTTP`などプロトコルのセットになっています。

このプロトコルのおかげでハードウェアやOSの違いを意識することなくネットワークに接続されたコンピュータとIPアドレスを利用することで通信することが可能になっています。

### プログラムの識別
コンピュータの上では複数のプログラムが動作させることができます。
Webブラウザや電子メール、SSHクライアントなどさまざまなアプリケーションプログラムを同時に利用できます。
その複数のプログラムを識別し、正しくデータを渡すように処理するためにポート番号が必要なのです。

### ポート番号の決め方
ポート番号を決定するには下記の2種類の方法があります。
- 標準で決められている番号
- ダイナミックな割り当て方法

#### 標準で決められている番号
> アプリケーションごとにどのポート番号を使うか固定的に決める方法。
> HTTP, TELNET, FTPなど広く使われているアプリケーションプロトコルでは、使用するポート番号が決められています。
> これを**ウェルノウンポート番号**と呼びます。
> このウェルノウンポート番号は0~1023までの番号が割り当てられています。

**ウェルノウンポート番号**
![ウェルノウンポート番号](https://eng-entrance.com/wp-content/uploads/2015/02/port.jpg)


ウェルノウンポート番号以外にも正式に登録されているポート番号があります。
これは**1024~49151**までの番号となっています。


#### 標準で決められている番号
> OSがアプリケーションごとに同じ値にならないように制御しながらポート番号を割り当てる方法。
> **49152~65535**までの整数が利用される。





## リクエストとレスポンス

インターネットの通信ではクライアントが出したリクエストをサーバーで処理してレスポンスを返します。
このようなプロトコルのことを`リクエスト/レスポンス型プロトコル`と呼びます。

### クライアントで行われること
クライアントは1つのリクエストを送信しレスポンスを受信する際に次のステップを行います
1. リクエストメッセージの構築
1. リクエストメッセージの送信
1. レスポンスが返るまで待機
1. レスポンスメッセージの受信
1. レスポンスメッセージの解析
1. クライアントの目的を達成するために必要な処理

### サーバで行われること
クライアントからリクエスを受けたサーバは次のステップを行います。
1. リクエスト待機
1. リクエストメッセージの受信
1. リクエストメッセージの解析
1. 適切なアプリケーションプログラムへの処理の委譲
1. アプリケーションプログラムから結果を取得
1. レスポンスメッセージの構築
1. レスポンスメッセージの送信

### HTTPメッセージ
リクエストメッセージとレスポンスメッセージをまとめて`HTTPメッセージ`と呼びます。
**リクエストメッセージの構造**
```
GET /test HTTP/1.1
Host: example.jp
```
1行目は`リクエストライン`と呼び、`メソッド`(GET), `リクエストURI`(/test), `プロトコルバージョン`(HTTP/1.1)からなります。
2行目以降は`ヘッダ`と呼ばれるメタデータが続きます。



**レスポンスメッセージの構造**
```
HTTP/1.1 200 OK
Content-Type: application/xhtml+xml; charset=utf-8

<html xmlns="http://www.w3.org/1999/xhtml">
...
</html>
```

1行目は`ステータスライン`と呼び、`プロトコルバージョン`(HTTP/1.1), `ステータスコード`(200), `テキストフレーズ`(OK)からなります。
2行目以降は`ヘッダ`です。
空行を挟んでHTMLデータが含まれています。これを`ボディ`と呼びます。



## ステートフルとステートレス
ステートフルとは
> サーバがクラインアントのアプリケーション状態を**保存する**制約
> 例: FTP

ステートレスとは
> サーバがクライアントのアプリケーション状態を**保存しない**制約のこと
> 例: HTTP

例
>例えば店員に例えた場合、ステートフルな店員は、来客の顔をよく覚えて、常連客が「いつものやつをお願い」というだけで、阿吽の呼吸で該当の商品を差し出してくれるでしょう。対してステートレスな店員の場合は、常連も初顔も関係なしに接客し、常連客から「いつもの」と言われても、「ちゃんと商品名を言ってくれませんか？」と、正式な注文を要請します。いわゆるお役所仕事的な対応をするのがステートレスな店員です。


HTTP通信は基本ステートレスな通信ですが、場合によってはステートフルにしないと困る時があります。
例えば以下のようにDBには保存しないが、ページを超えて保持しておきたい値が存在する場合です。
- ネット通販のカートの中身
- ログインしているユーザ情報


そこで利用するのが`クッキー`という技術です。
### クッキー
クッキーとは
> Webサーバーがクライアント側に情報を格納し、ログイン情報やネットショッピングの買い物かごの情報などをWebブラウザに記憶させるために利用します。

**クッキーを使ったログイン時の処理**
1. 初めてアクセスするユーザがコンピュータにリクエストを出します。
1. コンピュータ側がアクセスしたユーザを初めてであると認識します。
1. 初めてのユーザには user_id というキーで、 そのユーザのid を代入します。
1. 次に user_id = 1 というセッション情報を シークレットキー という鍵で暗号化してクッキーを生成します。
1. レスポンスと一緒に セッション情報が暗号化されたクッキー が送られ、ブラウザ側で保持されます。
1. ２回目以降アクセスする時は、リクエストと一緒に user_id の情報が乗ったクッキーと、コンピュータ側で保持したい値がコンピュータへ送られます。
1. 送られたクッキーを復号化して セッション情報 が存在していれば、ユーザを特定することができます。



## 最後に
この記事を書くにあたって下記の本も参考になりました。
- [マスタリングTCP/IP　入門編](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP-%E5%85%A5%E9%96%80%E7%B7%A8%EF%BC%88%E7%AC%AC6%E7%89%88%EF%BC%89-%E4%BA%95%E4%B8%8A%E7%9B%B4%E4%B9%9F-ebook/dp/B0827QNDNT/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)
- [Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)](https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042)

ただやっぱり触れたことのない技術の話などは難しいです。
なので、今後もまた読み返しをしたり、
いろんな技術を勉強していく中で、副次的にWebへの理解が深くなっていければと思ってます。




## 参照
- [AirDrop Wiki](https://en.wikipedia.org/wiki/AirDrop)
- [How does AirDrop work?](https://developer.apple.com/forums/thread/112352)
- [【初心者向け】ちゃんと理解するIPアドレス](https://qiita.com/Naughty1029/items/cfc63591d014cc0ffd76)
- [ステートレスとステートフルの例](https://www.cloud-for-all.com/azure/blog/difference-stateful-and-stateless#:~:text=%E4%B8%A1%E8%80%85%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%AA%E9%81%95%E3%81%84%E3%81%AF,%E3%81%AB%E3%82%88%E3%81%8F%E4%BE%8B%E3%81%88%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)