前回はWebを支える3つの技術のうち、URIについてまとめた。
- URI
- HTTP
- HTML
概要(主にRESTについて)はこちら
URIについてはこちら
https://www.sunapro.com/web%e3%82%92%e6%94%af%e3%81%88%e3%82%8b%e6%8a%80%e8%a1%93%e2%91%a1uri/
今回はHTTPについて。
正直Webについての勉強と言えばこのHTTPくらいしかイメージがなかった。
それくらい存在感はあるけど、体系的に学ぶいい機会になったのでここでちゃんとまとめておく。
TCP/ IPとは
いきなりHTTPじゃないのかよって感じだが、HTTPはTCP/ IPというネットワークのプロトコルをベースにしている。
つまり、HTTPについて知る上で、TCP/ IPの基礎知識について知っておく必要があるというわけ。
まず、インターネットのネットワークプロトコルは階層型になっている。
階層型にする利点は、下の層の内容に左右されることなく上の層を実装できるということ。
階層型プロトコルは以下の通り。
階層名 | 役割 | 具体例 |
---|---|---|
アプリケーション層 | アプリケーションごとのやりとりを規定 | HTTP, NTP, SSH, SMTP, DNS |
トランスポート層 | データの分割や品質保証を規定 | UDP, TCP |
インターネット層 | ネットワーク間の通信を規定 | IP |
ネットワークインターフェース層 | ハードウェアに関する規定 | イーサネット |
ネットワークインターフェース層
一番下の層であり、物理的なケーブルやネットワークアダプタに相当する部分
インターネット層
ネットワークでデータを実際にやり取りする部分。
TCP/ IPではIPが相当する。
IPではデータの基本的な通信単位をパケットと呼ぶ。
IPでは自分のネットワークインターフェースでデータを送り出すことだけを保証している。
送り出したデータがどこへ行こうと知ったこっちゃない、後は任せたという大雑把なやつ。
トランスポート層
IPが保証しなかったデータの転送を保証する。
インターネット層の尻拭き的な役割。
TCP/ IPではTCPが相当する。
接続先の相手に対してコネクションを張って、データの抜け漏れをチェックする。
転送するデータがどのアプリケーションに渡るのかを決定するのはポート番号。
TCPによるコネクションの確立は3ウェイハンドシェイクと呼ばれる。
- クライアントからの接続要求(SYN)
- クライアントに対する確認応答(ACK)&サーバーからの接続要求(SYN)
- サーバーに対する確認応答(ACK)
アプリケーション層
具体的なインターネットアプリケーションを実現する層で、HTTPやDNS, メールなどが相当する。
TCPでプログラムを作る時はソケットと呼ばれるライブラリを使うのが一般的。
ソケットはネットワークでのやり取りを抽象化したAPIで、接続や送信、受診などの基本的な機能を備えている。
HTTPサーバやブラウザはソケットを用いて実装する。
これらが階層化されていてHTTPはその最上階にいる。
そのため、データの転送保証などは下位層に任せて、具体的なデータのやり取りの規定のみに専念できる。
HTTPのバージョン
HTTPはHTTP/0.9, HTTP/1.0, HTTP/1.1, HTTP/2のように機能追加と改良がされてきた。
HTTPキープアライブ
HTTP/1.1で実装された機能。
これはどういうものかというと、コネクションを継続して利用できる方式。
通常webページ内に画像が埋め込まれていた場合、
コネクションの確立→webページを受け取った後にコネクションを閉じる→画像を取得するためコネクション確立
と、HTTPリクエストごとにコネクションを確立しなければならなかった。
これが一連の流れを全てコネクションつなぎっぱなしでできるので無駄な通信を省くことができるようになった。
HTTPパイプライン
これもHTTP/1.1で実装された。
それまではHTTPレスポンスを受け取るまでは次のHTTPリクエストを送れなかったが、HTTPパイプラインではHTTPレスポンスを待つことなく複数のHTTPリクエストを送信することができる。
ただし、レスポンスの処理はリクエストを行った順番にしなければならないため、待ち状態が発生することもある。
ストリーム機能
HTTP/2で実装された機能。
これは1つのコネクション上に仮装の通信経路「ストリーム」を生成するというもの。
それぞれのストリームでは独立しHTTPリクエスト、レスポンスができる。
先ほどのHTTPパイプラインとは異なり、ストリームによる多重化ではレスポンスを受ける順番も自由なので、待ち状態が発生しない。
サーバープッシュ
これもHTTP/2で実装された機能。
それまではファイル内に画像が埋め込まれていた場合、
①ファイルのリクエスト、レスポンス、読み込み
②画像のリクエスト、レスポンス、読み込み
と、2回に分けてHTTP通信を行う必要があった。
サーバープッシュではあらかじめサーバー側で必要なファイルを判別して、HTTPリクエストなしに、事前にwebサーバーから転送することができる。
HTTPメソッド
HTTPメソッドクライアントからサーバへ様々な情報を伝えるにも関わらず、実はたったの8つしかない。
GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE, CONNECT
TRACE, CONNECTはあまり使われない。
POST
POSTはリソースを作成するのが最も代表的な機能だが、それだけではなく既存リソースへのデータの追加もできる。
リソースの作成ではレスポンスは201 Createdだがデータの追加では200 OKになる。
また、PUTやDELETEはPOSTで代用することもできる。
そもそもHTMLのフォームで指定できるメソッドはGETとPOSTのみ。
この制限からGETとPOSTが最もよく利用される。
ただしAjaxの発展とともに任意のメソッドを発行できるようになった。
PUT
PUTはリソースの更新だが、リソースがない場合はリソースの作成もできる。
この時、作成するリソースのURIはクライアント側が指定することになる。
POSTの場合は、新しく作成したリソースのURIがLocationヘッダで返ってくるが、
PUTの場合はクライアントは既にリソースのURIを知っているのでLocationヘッダで返ってこない。
このようにURIの決定権がPOSTの場合はサーバに、PUTの場合はクライアントにある。
そのため、PUTの場合はサーバの内部実装を熟知した上でクライアントで指定できるURIの制限をかけなければならず、サーバとの結合が密になる。
よって通常はPOSTを使う。
HEAD
リソースのヘッダ(メタデータ)を取得する。
OPTIONS
そのリソースがサポートしているメソッドの一覧(GET, POST, HEADなど)を返す。
OPTIONS自体はAllowヘッダに含めない。
べき等性と安全性
メソッドはべき等性と安全性で分類することもできる。
べき等性
ある操作を何度行っても結果が同じこと
安全性
操作対象のリソースの状態を変化させないこと
メソッドを分類すると以下の通り。
メソッド名 | べき等性 | 安全性 |
---|---|---|
GET, HEAD | ○ | ○ |
PUT, DELETE | ○ | × |
POST | × | × |
これらが重要なのは通信エラーが発生した時にリクエストをどう回復させるかに関わるから。
たとえばPOSTはべき等でも安全でもないため、通信エラーの後にもう一度POSTすると二重にリソースが作成される可能性がある。
ブラウザによって「もう一度送信しますか?」とダイアログが出るのはPOSTを再送しようとしている場合。
ステータスコード
- 1xx: 処理中
- 2xx: 成功
- 3xx: リダイレクト
- 4xx: クライアントエラー
- 5xx: サーバエラー
よく使われるステータスコード9選
- 200 OK
- 201 Created
- 301 Moved Permanently
- 303 See Other
- 400 Bad Request
- 401 Unauthorized
- 404 Not Found
- 500 Internal Server Error
- 503 Service Unavailable
紹介されていたのはこの9つだが、403 Forbiddenもよく見る気がする。
ページ自体は存在するものの、閲覧権限がなくて見れないってやつ。
ただ自分で実装する時はよく見るってだけで、通常のアプリでは403の状態でも404 Not Foundでそもそもページ自体存在しないよってレスポンスするように実装している気がするので、通常のアプリで見ることはあまりないのかもしれない。
303がちょっとわかりにくかった。
これはリクエストを処理した後、別のURIへ誘導するステータスコード。
たとえばフォーム送信後、完了ページへは GET でリダイレクトするようなケースが相当する。
503はサーバメンテナンスなどで一時的にアクセスできない場合。
ボディにはその理由が入る。
HTMLについて
Webを支える技術の3つ目はHTML。
他のハイパーメディアだと、AtomとかJSONとか。
HTMLやJSONについてはあまりまとめるほどのものでもないなって思ったのと、他のAtomとかそういうのはよくわからんて感じだったのでまとめは省略。
おわりに
本についてまとめてみたけど、まとめ作業を通してわりと概要はつかめたし重要そうな知識は定着したのではないかと思う。
大変だったけど、エンジニアとして必要な基礎知識と思うのでまとめてよかったかな。
最近はこういう根幹部分の技術に興味あり。
今は「マスタリングTCP/ IP 入門編」を読んでる。
参考
- Webを支える技術(書籍)
https://amzn.to/2AYsEy7
- Web技術の基本(書籍)
https://amzn.to/2YhQsFX
コメント