HTTP通信を基本からまとめてみた

## HTTPとは
『HTTP』は、TCP/IP通信のアプリケーション層にあるプロトコルの１つ。
Webページを呼び出すためのプロトコルのこと。
## HTTPリクエストとHTTPレスポンス
WebブラウザがWebサーバに対して出すリクエストを『HTTPリクエスト』と言う。
また、WebサーバがWebブラウザのリクエストに対して返すレスポンスを『HTTPレスポンス』と呼ぶ。
そして、その両者を『HTTPメッセージ』と呼ぶ。
## HTTPリクエストメッセージの例
HTTPリクエストを出すという事は、
HTTPリクエストメッセージをWebサーバに向けて送るという事である。
https://news.yahoo.co.jp/ のページからリンクをクリックして 
https://about.yahoo.co.jp/common/terms/ のWebページを表示するときに送った
HTTPリクエストメッセージの具体例は下記のようになる。
#### HTTPリクエストメッセージの具体例
```
GET /common/terms/ HTTP/1.1
Host: about.yahoo.co.jp
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: https://news.yahoo.co.jp/
Accept-Encoding: gzip, deflate, br
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Cookie: ...=...; ...
```
上記がHTTPリクエストメッセージの具体例で、HTTPリクエストメッセージの一般的な形式は、下記のようになる。

#### HTTPリクエストメッセージの一般形式

```
メソッド URL HTTPのバージョン
ヘッダ部（付加情報）
（空行）
ボディ部
```

1行目
まずは1行目の メソッド URLのパス HTTPのバージョン。（具体例より抜粋）

```
GET /common/terms/ HTTP/1.1
対比させると、メソッド は GET 、 URLのパス は /common/terms/ 、HTTPのバージョン は HTTP/1.1 となっている。
```
　
『GET』 は読み込みを意味するメソッドであり、GET /common/terms/は該当のパスを読み込むという意味になる。
『HTTP/1.1』 はHTTPのバージョンが1.1であることを意味する。

2行目
次に2行目の ヘッダ部（付加情報） で、具体例では、以下の部分となる。（具体例より抜粋）

```
Host: about.yahoo.co.jp
yahoo.co.jp の中にある about という名前のホストへアクセスする、という意味です（ホストについても、のちほど説明します）。
```
残りの行については省略しますが、その他、さまざまな接続情報がここに書かれる。

#### ボディ部に関する補足
この例では ボディ部 は存在しないが、例えばPOST（フォームデータ送信時に使うメソッド）であれば、
ボディ部にはフォームデータが入り、リクエストとしてサーバに送信される。
このような形式でリクエストを出すことが、HTTPという通信規約（プロトコル）として決まっていて、
HTTPリクエストは常に上記の形式で通信を行う。


## HTTPレスポンスメッセージの例
HTTPレスポンスを返すというのは、HTTPレスポンスメッセージをクライアントに向けて送るという意味。
先ほどのHTTPリクエストメッセージに対するHTTPレスポンスメッセージは、下記の通りとなる。

#### HTTPレスポンスメッセージの具体例

```
HTTP/1.1 200 OK
age: 0
content-encoding: gzip
content-length: 6271
content-type: text/html; charset=UTF-8
date: Wed, 14 Oct 2020 02:05:12 GMT
p3p: policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
server: ATS
status: 200
vary: Accept-Encoding
via: http/1.1 edge1441.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])
x-content-type-options: nosniff
x-xss-protection: 1; mode=block

<!DOCTYPE html>


<html lang="ja" prefix="og: http://ogp.me/ns# fb: http://www.facebook.com/2008/fbml">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="format-detection" content="telephone=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
```

上記がHTTPレスポンスメッセージの具体例で、HTTPレスポンスメッセージの一般的な形式は下記のようになる。

HTTPレスポンスメッセージの一般形式

```
HTTPのバージョン ステータスコード ステータス
ヘッダ部（付加情報）
（空行）
ボディ部
こちらも、1行ずつ見てみましょう。
```

1行目
1行目は HTTPのバージョン ステータスコード ステータス。（具体例より抜粋）

```
HTTP/1.1 200 OK
対比させると HTTPのバージョン は HTTP/1.1 、 ステータスコード は 200 、ステータス は OK となっています。
```

HTTPのバージョンが最初に来るは、以降のメッセージ形式を最初に知らせる為。

『ステータスコード』は、リクエストに対してサーバがどう反応したかを示す番号になり、
今回の 200 であれば正常に動作したことを示す。
また、ステータスコードと対応するステータスも文字列として返ってくる。200 の場合は OK の文字列になる。

2行目以降
2行目以降は ヘッダ部（付加情報） となる。（具体例より抜粋）

```
age: 0
content-encoding: gzip
content-length: 6271
content-type: text/html; charset=UTF-8

...（省略）...
```

ヘッダ部では、サーバ情報やレスポンスデータの情報が記されていて、今の時点では、それぞれの内容を理解する必要はない。

#### ボディ部
今回のボディ部は、GETメソッド（読み込み用メソッド）に対するレスポンスで、
（<!DOCTYPE html>）以降が実際のWebページ（HTML, コンテンツ）になる。
Webブラウザはレスポンスメッセージで送られてきたコンテンツ（HTML文書）を、Webページとして表示する。

## HTTPリクエストの4つのメソッド
Webでは基本的に、あるリソースに対して4つのことが可能です。ここでいうリソースとは、Web上にあるWebページやデータのすべてです。たとえば、Yahooのニュース記事ページや、Facebookのコメント、Twitterのツイート、ブログの記事やコメントなどです。

それらのリソースは基本的に4つの操作が可能です。それがCRUD（クラッド）と呼ばれる操作です。


#### 4つの操作 - CRUD
CRUDは4つの操作の頭文字をとったものです。

英語	日本語
Create	作成
Read	取得
Update	更新
Delete	削除

FacebookのコメントやTwitterのツイートについて考えると、自分が今までに投稿したコメントやツイートを閲覧するとき、Read（取得）の操作を行い、投稿するときはCreate（作成）の操作をする。そして、誤変換などを発見して修正したいときは、Update（更新）の操作を行う。そして「この投稿は要らない」と思ったらDelete（削除）の操作によって削除できる。
ただし、Yahooのニュース記事などユーザ側が操作権限を持っていないリソースに対しては、Read（取得）以外の操作は許可されていない。

####HTTPリクエストでのCRUD
WebはHTTPというWeb用のプロトコルによって通信を行う。
※ここでいうメソッドは、方法論といった意味ではなく、単にHTTPリクエスト内でのCRUD操作をする際に使われる語句のことを言う。

HTTPリクエストメッセージ内では、CRUDのそれぞれに該当する下記の4つのメソッドが用いられる。

英語	日本語	HTTPメソッド
Create	作成	POST
Read	取得	GET
Update	更新	PUT
Delete	削除	DELETE

## URL

####URLはインターネット上のリソースの住所
https://www.google.co.jp/, http://news.yahoo.co.jp/pickup/1 のようなURLは「Uniform Resource Locator」の略称で、
日本語に訳すと「統一資源位置指定子」と書く。要するにURLは、インターネット上のリソース（資源）の位置を特定するために使用される文字列。
URLは、インターネット上に公開されている1つのリソースに対して1つだけ割り当てられており、いわば リソースをインターネット上で特定するための住所である。

#### URLの一般形式
URLの一般形式は、以下の通り。

```
（httpなどのプロトコル名）:（プロトコルごとに定められた形式）
```
URLの最初に付く記号はhttp以外にもいくつかある。

##### ftp
ftpはFTPを表すもので、FTP（File Transfer Protocol, ファイルトランスファープロトコル）とは、ネットワーク上でファイル転送を行うための通信プロトコルの1つ。FTPのURL形式は ftp://example.com/ のような形になる。HTTPでもファイルの転送を行うことができるので、あまり見かけなくなった。

##### mailto
mailtoは、メールの宛先を表すもの。これはプロトコルではありませんが、mailto:taro@example.comなどのようにメールアドレスを表現できる一種のURL。mailto:taro@example.com というリンクをクリックすれば、自分が利用しているメール送信のためのソフトウェアが起動する。

##### file
fileは、自分のコンピュータ内のファイルを表すもので、これも通信プロトコルではありませんが、URLの一種。file:///users/taro/memo.txtのようなURL形式になります。Google Chromeで自分のコンピュータ内のファイルを開くと、このようなURLが表示される。

#### HTTPのURLの構成
###### HTTPのURLの一般形式
HTTPのURLは、上記のURLと同じものです。
HTTPのURLの一般形式は下記の通りで、この形でインターネット上のリソースを1つに特定できる。

```
http://ホスト名.ドメイン名:ポート番号/パス
```
##### ドメイン名
ドメイン名（Domain）とは、インターネット上のネットワークを特定するための住所で、例えば 『google.co.jp』というドメイン名は、日本（co.jp）におけるGoogleのネットワークの住所を表す。

###### ホスト名
ホスト名（Host）とは、ネットワーク上のコンピュータにつける識別用の名前で、例えば 『www.google.co.jp』は
ドメイン名が『google.co.jp』で、ホスト名が www になる。ホスト名をどのように決めるかは自由だが、
とくに 『www』は、Webサーバが起動しているホストの名前にすることが多い。

###### ポート番号
ポート番号（Port Number）は、通信プロトコルと密接な関係があり、例えばHTTPのプロトコルは80番と決まっている。したがって、ポート番号は省略できる場合がほとんど。例外的に「HTTPではあるものの80番ポートを使わずに3000番を使う」とした場合には、ポート番号を明記することで対応できるようになっている。

###### パス
パス（Path）とは、コンピュータ内のファイルの位置を表したもの。 / によってフォルダ名を区切ります。/news/tech/computer.html であれば、newsフォルダの中のtechフォルダの中にあるcomputer.htmlと指定できる。
パスが省略された場合には、index.html など、index.xxx がデフォルトで表示されます。

## IP
インターネット上にあるコンピュータの住所を特定するものは 『IPアドレス』であり、URLではない。URLはIPアドレスへ変換される。
『IPアドレス』は、コンピュータの住所で、『IP（Internet Protocol）』とは、インターネットのための通信プロトコルのこと。
インターネットの通信は『IP』によって成り立っている。
『IP』がインターネットのプロトコルであるなら、HTTPは何？と思うかも知れないが、HTTPは、IPによってインターネットが接続されているという前提があった上で、アプリケーション同士が通信するための通信プロトコルになる。つまり、IPこそがインターネットを成立させているプロトコルである。
WebブラウザがHTTPリクエストメッセージをWebサーバに向けて送るが、このアプリケーション間の通信がインターネットを介すとき、
HTTPリクエストメッセージはIPによって運ばれることになる。
そして、IPアドレスとは、ネットワーク上で個々のコンピュータを特定するための番号（住所）で、
ネットワークに繋がっている個々のコンピュータにはそれぞれ固有のIPアドレスが設定されている。
IPアドレスは、0~255（2の8乗=256通り、8ビット、1バイト）の数字が.区切りで4つ合わさった形として表現される。※172.217.161.35のようなイメージ。0.0.0.0から255.255.255.255まで住所を割り当てることができるため、
約43億通り（256 x 256 x 256 x 256 = 4,294,967,296）の住所パターンを作り出すことができる。

##### URLのホスト名とドメイン名は実はIPアドレス
URLの中のホスト名（コンピュータ名）＋ドメイン名（ネットワーク名）がインターネットの住所だと説明したが、
実は、ホスト名＋ドメイン名は特定のIPアドレスに対応している。例えば www.google.co.jp が 172.217.161.35 と対応している場合、
どちらを使っても同じコンピュータへたどり着ける。
www.google.co.jp と 172.217.161.35 で人間にとって認識しやすいのは、当然www.google.co.jp である。
つまりホスト名＋ドメイン名は人間用に作られたIPアドレス。172.217.161.35 といった数字の羅列はコンピュータが内部的に扱うのに便利な形。
※ホスト名＋ドメイン名のことを FQDN（Fully Qualified Domain Name） と呼ぶ。

##### DNSサーバがURLとIPアドレスの対応表を持っている
広大なインターネットの世界で、www.google.co.jp というFQDNのIPアドレスは 172.217.161.35 だとわかるには、
何らかのシステムがその対応表を常に持って、その表の管理・保守を続ける必要があり、
そのシステムが 『DNS（Domain Name System、ドメイン・ネーム・システム）』 である。
※以下では、DNSのシステムが動作しているサーバのことを 『DNSサーバ』 と呼ぶ。

WebブラウザのURL入力欄に https://www.google.co.jp/ と入力してアクセスしたとき、
以下のような流れで、www.google.co.jp というFQDN（ホスト名＋ドメイン名）のIPアドレスを取得できる。

Webブラウザは、DNSサーバに「www.google.co.jp のIPアドレスを教えてくれ」とリクエストを送り、
DNSサーバはその対応表を持っているため、www.google.co.jp のIPアドレス 172.217.161.35 をレスポンスとして返す。
このようにDNSからFQDNに対応するIPアドレスをもらって、ようやくインターネットを介した通信ができる。
DNSサーバからIPアドレスを教えてもらう操作を 『名前解決』と呼ぶ。

##### DNSサーバの階層構造とFQDNの名前解決

www.google.co.jp は . でいくつかに区切られている。www, google, co, jpです。
この中で、もっとも広い領域を示すのが、日本を示す 『jp』 。
次にあるのが 『co』 で、これは commercial（商用、営利目的）という意味を示す。
その次にあるのは、日本の営利目的の会社である google のドメインとなる。
www はホスト名で、googleドメインの中の www というホストを指定している、という意味になる。

この階層構造が、そのままDNSサーバの階層構造になり、『名前解決』では、この階層構造が重要な点となっている。

##### 例 : www.google.co.jp の名前解決（IPアドレスを取得）するとき、下記の手順で　『名前解決』を行う。

① ルートDNSサーバ に「jp のDNSサーバはどこにありますか？」とリクエストを送り、レスポンスとして jp のDNSサーバのIPアドレスを受け取る。
② jpのDNSサーバに「co.jp のDNSサーバはどこですか？」とリクエストを送り、co.jp のDNSサーバのIPアドレスを受け取る。
③ co.jp のDNSサーバに「google.co.jpはどこですか？」とリクエストを送ると、google.co.jp のDNSサーバのIPアドレスが返ってくる。
④ google.co.jp のDNSサーバに、「www.google.co.jp のホストはどこですか？」と聞いて、そのIPアドレスを受け取る。
⑤ 『www.google.co.jp』　のIPアドレスがわかったため、Webサーバへアクセス（HTTPリクエストを送信）できる。

##### グローバルIPアドレスとプライベートIPアドレス
IPアドレスはネットワーク上で個々のコンピュータを特定するための番号（住所）で、
ネットワークに繋がっている個々のコンピュータは固有のIPアドレスが設定されている、と説明したが、厳密には少し異なる。
実際にはコンピュータではなく、インターネット上に数多くある1つの小さなネットワークに対して1つのIPアドレスが与えられていて、
そのIPアドレスのことを 『グローバルIPアドレス』 と呼ぶ。
グローバルIPアドレスこそ、インターネット上で唯一のIPアドレスとなる。
したがって、172.217.161.35 というIPアドレスが指し示すのは小さなネットワークで、
小さなネットワークはグローバルIPアドレスによって一意に決まる。
小さなネットワーク内、つまり家庭や会社などの小さな組織内の個々のコンピュータに与えられているIPアドレスのことを
『プライベートIPアドレス』 と呼ぶ。『プライベートIPアドレス』は、192.168.0.100のように192.168.xxx.xxxのような形をしていることが多い。

##### グローバルIPのネットワークからコンピュータを特定するにはポート番号が活躍する
プライベートIPアドレスを利用すると、1つ問題が発生する。プライベートIPアドレスを持っているクライアントがサーバへリクエストを送っても、所属するネットワークの外にリクエストが出ると、リクエストに設定された クライアント（リクエストの送信元）のIPアドレス の情報が書き換わる。そのため、サーバが受け取ったリクエストに設定されているクライアントのIPアドレスは「所属するネットワークのグローバルIPアドレス」になっている。つまり、サーバにとっては「具体的にどのコンピュータが自分に向けてリクエストを送ったのか」がわからない、という問題である。
これを解決する方法の1つが NAPT（Network Address Port Translation） という技術で、NAPTは IPマスカレード とも呼ばれる。
「P（Port）」とあるように、NAPTではポート番号を利用する。
ポート番号には、送信元ポート番号と宛先ポート番号があり、宛先ポート番号はHTTPの場合80で決まっていますが、送信元ポート番号には決まりがない。
そこで、適当な送信元ポート番号を設定することで、これとグローバルIPアドレスからコンピュータを特定できるようにしたのが『NAPT』である。
『NAPT』の技術により、リクエストを送ったコンピュータへレスポンスが届く。

## TCP/IPモデル
##### TCP/IPモデルの階層構造
TCP/IPモデルは5つの階層によって成り立っている。

| 5階層 　　　　　　　　　　　　　　　　　　| プロトコル例 　　　　　| プロトコル例 　　　　　　|
|:--------------|------------:|:------------:|
| アプリケーション層 | HTTP, SMTP, POP, FTP, DNS, NTP等 | アプリケーション同士がデータをやり取りするための通信プロトコル群|
| トランスポート層   | TCP, UDP | アプリケーションがしっかりデータを送れるように通信路を確保する|
| インターネット層   | IP等        | 複数のネットワークを相互に接続した環境（インターネット）で、個々のコンピュータ間のデータ送受信を実現する|
| データリンク層    | PPPoE等         | 電気信号の伝送路を確保する |
| 物理層         | 回線、ケーブル等       | 物理的に繋がっていて電気信号を送れるようにする |

###### アプリケーション層の役割
アプリケーション層は、実際にユーザが使うようなアプリケーションの通信を可能にするためのプロトコル群。例えば、HTTPはWeb用データを送受信するためのプロトコルであり、SMTP, POP, IMAPはメール送受信のためのプロトコルで、アプリケーションごとに送受信するデータの形式が違うため、それぞれ別で定義されている。コンピュータ同士の通信は、アプリケーション層の通信からスタートするため、アプリケーション層はTCP/IPモデルの中で最上位に位置する。

##### トランスポート層の役割
トランスポート層の役割は、通信路を作ってデータを通信相手に届ける こと。トランスポート層にはTCPとUDPがあり、
TCP（Transmission Control Protocol）は、コネクション型の通信プロトコルで、信頼性が高く、確実にデータを届けるプロトコル。
ただし、高い信頼性のための手続きが増えるため、通信開始するまでに手間がかかるプロトコル。
HTTPも基本的にはTCPを使用して通信しているため、Webページ内の単語が一部表示されないなどのデータ受信ミスはない。
データを確実にすべて届けるためにはTCPを利用し、TCP/IPモデルの名のとおり、通常のインターネット通信では、
TCPがトランスポート層のプロトコルとして採用されている。
UDP（User Datagram Protocol）は、高い信頼性を持ったTCPと違って、コネクションレス型の通信プロトコルで、
高速通信が可能ですが、信頼性は低くなる。
UDPは、音声通話やビデオ通話などリアルタイム性を重視して多少のデータ転送ミスを許せる通信に使用される。
例えば、ビデオ通話でたまに映像が止まったり音声が届かなかったりしますが、これはUDPがトランスポート層のプロトコルとして採用されているため。

##### インターネット層の役割
インターネット層、とりわけIPの役割は、個々のコンピュータにIPアドレスを割り当てて、識別すること。
IPアドレスを伝って目的の通信相手までデータを転送する。それを実際に実現する機器が ルータ である。

##### ルータはIP通信のための機器
自分のコンピュータが所属するネットワークのIPアドレスは変更されることがある。どのタイミングでIPアドレスが変更されるかは、インターネットサービスプロバイダ（ISP）との契約内容などによる。今日と明日で自分のネットワークのIPアドレスが変わっている、ということは珍しくはない。
IPアドレスが変更されても同じコンピュータへ通信できるのは、ルータという機器のおかげで、ルータはネットワークとネットワークを繋ぐための機器。ルータはインターネット層（IP）における通信を支える機器であり、ルータのおかげでインターネットに繋がっていると言える。
ルータはIPアドレスを利用して、データを目的のコンピュータまで届ける働きをし、内部では「ルーティングテーブル」と呼ばれる形で情報を持ち、宛先IPアドレスを元にデータを届けるためのルートを特定する。なお、IPアドレスが変更された場合は、ルーティングテーブル内の情報も追随して更新される仕組みになっている。
ルータはルータ同士やコンピュータに接続され、データをバケツリレー形式で運んでいく。あるコンピュータからデータが送信され、ルータ1が受け取り、ルータ1は宛先IPアドレスとルーティングテーブルを見比べて次はルータ2に送信すればいい…ということを判断する。これを繰り返し、最終的に目的地である宛先IPアドレスのコンピュータへ届く仕組みになっている。

##### データリンク層
データリンク層は、このあと触れる「物理層」で直接接続された機器間の通信を可能にする。
具体的にはLANボード（コンピュータに内蔵されている通信装置）などの機器を制御・識別し、そのための伝送路を確保する。

###### 物理層
物理層では、LANボードなどから送出されたデータを電気信号に変換し、ケーブルなどの物理的な伝送媒体に流し込む機能を提供する。
コンピュータのデータを電気信号に変え、無線LANやLANケーブルで繋がっているルータまで運び、光ファイバケーブルなどを伝って外へ出る。
そして、張り巡らされた電線を伝って日本国内のネットワーク（インターネット）に流れていく。
 国内から海外のネットワークについては、海の底に「海底ケーブル」と呼ばれる電線が敷かれていて、それを伝って海外までインターネットが繋がっている。
海底ケーブルがすべて切断されてしまうと、海外のコンピュータには届かなくなりますが、そうならないように海底ケーブルは増えており、整備されている。
インターネット上のすべてのコンピュータが物理的に繋がっている。

###### 階層構造の役割
通信プロトコルの階層構造によって、明確に役割が分担され、各通信プロトコル自身の責任を持つ範囲が小さくなったおかげで、
自分の役割外の機能は、下層のプロトコルに全てを任せる。
例えば、HTTPはアプリケーション間の通信のことだけを考え、しっかり通信路を確保しているかはTCPに、インターネットに繋げられるかはIPに、
回線が繋がっているかはデータリンク層や物理層に完全に任せる。



##参考サイト
[ネットワークやTCP/IPやHTTPの基本（初学者向け）]
(https://qiita.com/ryosuketter/items/ba54d595a31f4ad0a58f)
[インターネット通信の仕組み]
(https://techacademy.jp/my/java-servlet/java-servlet/web-application#chapter-1)
[TCP/IPの基礎の基礎を理解していますか？]
(https://ascii.jp/elem/000/000/424/424788/index-2.html)
[TCP/IPとは – ネットワークの基礎知識]
(https://shinmeisha.co.jp/newsroom/2020/01/20/tcp-ip%E3%81%A8%E3%81%AF/)