零。追加の常識
OSI(Open System Internetwork)参照モデル:
- アプリケーション層
アプリケーションにネットワーク通信インターフェースを提供
-
表現層
-
セッション層
-
トランスポート層
データ転送ユニットはメッセージ
- ネットワーク層
データ転送ユニットはパケット
- データリンク層
データ転送ユニットはフレーム
- 物理層
データ転送ユニットはビット bit
OSI7 層は研究用の理論モデルであり、実際の応用では煩雑すぎるため、TCP/IP 参照モデルがあります:
P.S.ここでの TCP/IP はプロトコル体系、またはプロトコルファミリを指し、SNMP、ICMP、UDP、DNS など様々なネットワークプロトコルを含みます
- アプリケーション層
HTTP、FTP、DNS など
- トランスポート層
TCP、UDP など
- ネットワーク層
IP など
- データリンク層
HTTP はアプリケーション層プロトコルであり、内部はトランスポート層の TCP とネットワーク層の IP なので、HTTP も 3 ウェイハンドシェイク、4 ウェイハンドシェイクが必要です
したがって、接続の確立/解放のオーバーヘッドが存在し、パフォーマンス最適化として HTTP/1.1 バージョンではデフォルトでパーシステント接続ですが、HTTP/1.0 にはありません
さらに、いくつかの概念を簡単に区別する必要があります:
- プロキシ
転送機能を持つアプリケーション
- ゲートウェイ
他のサーバー通信データを転送するサーバー
- トンネル
Client と Server 間の通信接続を維持できるアプリケーション
- トンネル
一.URI と URL
-
URI(Uniform Resource Identifier):統一資源識別子、特定のインターネ���トリソースを識別する文字列
-
URL(Uniform Resource Locator):統一資源位置指定子、特定のインターネットリソースの場所を識別する文字列
URL に不可欠なのはスキーム(Scheme)、ホスト名(Host)、リソースパス(URL Path)です
したがって URL は URI のサブセットであり、または URL は URI の一部と言えます
二.HTTP メソッド
- GET:リソースの取得
1.0/1.1 サポート、常用
- POST:エンティティ本体の転送
1.0/1.1 サポート、常用
- PUT:ファイルの転送
1.0/1.1 サポート、一般的なウェブサイトでは该方法を使用しません。PUT メソッド自体に認証メカニズムがなく、誰でもファイルをアップロードできるため、セキュリティ問題が存在するためです
- HEAD:メッセージヘッダーの取得
1.0/1.1 サポート、常用
- DELETE:ファイルの削除
1.0/1.1 サポート、PUT メソッドと同じ問題が存在
- OPTIONS:サポートするメソッドの問い合わせ
1.1 サポート
- TRACE:パスのトレース
1.1 サポート、Max-Forward ヘッダーフィールドと組み合わせてパスをチェック
- CONNECT:トンネルプロトコルでプロキシに接続することを要求
1.1 サポート、SSL(Secure Sockets Layer 安全ソケット層)、TLS(Transport Layer Security 転送層セキュリティ)と組み合わせてトンネルで TCP 通信を実現
- (LINK):リソースとの接続を確立
1.0 サポート、1.1 で廃止
- (UNLINK):接続関係を切断
1.0 サポート、1.1 で廃止
三.HTTP ステータスコード
- 1XX:Informational(情報ステータスコード)
受信したリクエストを処理中
- 101:Switching Protocol、プロトコル切り替え、Upgrade ヘッダーフィールドと組み合わせてプロトコル切り替えを要求、あまり一般的ではない
- 2XX:Success(成功ステータスコード)
リクエストが正常に処理完了
- 200:OK、リクエストが正常に処理
- 204:No Content、リクエストは正常に処理されたが返すリソースがない(レスポンス本体が空)
- 206:Partial Content、リクエストの一部内容を要求、レスポンスヘッダーの Content-Range が範囲を示す
- 3XX:Redirection(リダイレクトステータスコード)
リクエストを完了するために追加操作が必要
- 301:Moved Permanently、永久的リダイレクト、ブラウザは自動的にブックマークを更新すべき
- 302:Found、一時的リダイレクト、ブックマークを更新しない
- 303:See Other、302 に似ているが、GET メソッドで新しい URL にアクセスすることを要求
注意:仕様では 301、302 に遭遇してもリクエストメソッドを変更しない(元々 POST なら引き続き POST を使用)と規定しているが、*事実上の標準*はほぼすべてのブラウザが 301、302、303 に遭遇すると GET メソッドに変更する。これは仕様と一致しない
- 304:Not Modified、リソースは見つかったが、リクエスト条件(If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since)を満たさない
注意:304 は 3XX に属するが、*リダイレクトとは関係ない*
- 307:Temporary Redirection、一時リダイレクト、302 と同じ意味
事実上の標準を是正するために導入されたステータスコード、302 を厳密に遵守してメソッドを変更しないことを望んだが、現在ブラウザは必ずしもそうしない。標準は再び失敗
- 4XX:Client Error(クライアントエラーコード)
サーバーはリクエストを処理できない
- 400:Bad Request、リクエストメッセージに構文エラーが存在
- 401:Unauthorized、認証が必要(BASIC 認証または DIGEST 認証)または認証失敗を示す
- 403:Forbidden、特定リソースへのアクセスリクエストが拒否
- 404:Not Found、サーバーはリクエストされたリソースを見つけられない、理由を説明したくない 403 レスポンスの代わりとして使用可能
- 405:Method Not Allowed、メソッド不支持、あまり一般的ではない
- 412:Precondition Failed、前提条件失敗、あまり一般的ではない
- 417:Expectation Failed、期待失敗、あまり一般的ではない
- 5XX:Server Error(サーバーエラーコード)
サーバーはリクエスト処理中にエラー発生
-
500:Internal Server Error、サーバーはリクエスト実行中にエラーが発生
-
503:Service Unavailable、サーバーが過負荷またはメンテナンス中
四.HTTP メッセージヘッダー
HTTP メッセージヘッダー = メッセージヘッダー + 空行(CR+LF) + メッセージ本体
= 開始行(リクエスト行/ステータス行) + ヘッダー + 空行 + メッセージ本体
= 開始行 + リクエスト/レスポンスヘッダーフィールド + 一般ヘッダーフィールド + エンティティヘッダーフィールド + 空行 + メッセージ本体
P.S.この*空行(CR+LF)*を軽視してはいけません。HTTP ヘッダーインジェクション攻撃が存在するのはこの空行があるためです
###1.開始行
開始行はリクエスト行とステータス行に分かれます(それぞれ HTTP リクエストメッセージとレスポンスメッセージに対応):
-
リクエスト行:リクエストに使用するメソッド、URI、HTTP バージョンを説明
-
ステータス行:返すレスポンスの HTTP バージョンとステータスコードを説明
###2.ヘッダーフィールド
| ヘッダーフィールド名 | 説明 |
|---|---|
| Accept | ユーザーエージェントが処理可能なメディアタイプ |
| Accept-Charset | 優先する文字セット |
| Accept-Encoding | 優先するコンテンツエンコーディング |
| Accept-Language | 優先する言語(自然言語) |
| Authorization | Web 認証情報 |
| Expect | サーバーの特定動作を期待 |
| From | ユーザーの電子メールアドレス |
| Host | リクエストリソースがあるサーバー |
| If-Match | エンティティタグ(ETag)を比較 |
| If-Modified-Since | リソースの更新時間を比較 |
| If-None-Match | エンティティタグを比較(If-Match と逆) |
| If-Range | リソースが更新されていない場合、エンティティ Byte の範囲リクエストを送信 |
| If-Unmodified-Since | リソースの更新時間を比較(If-Modified-Since と逆) |
| Max-Forwards | 最大転送ホップ数 |
| Proxy-Authorization | プロキシサーバーがクライアントに要求する認証情報 |
| Range | エンティティのバイト範囲リクエスト |
| *Referer* | Web 認証情報 |
| TE | 転送エンコーディングの優先度 |
| User-Agent | HTTP クライアントプログラムの情報 |
| ヘッダーフィールド名 | 説明 |
|---|---|
| Accept-Ranges | バイト範囲リクエストを受け入れるかどうか |
| Age | リソース作成からの経過時間を推算 |
| ETag | リソースのマッチング情報 |
| Location | クライアントを指定 URI にリダイレクト |
| Proxy-Authenticate | プロキシサーバーのクライアントに対する認証情報 |
| Retry-After | 再度リクエストを送信する時機の要求 |
| Server | HTTP サーバーのインストール情報 |
| Vary | プロキシサーバーキャッシュの管理情報 |
| WWW-Authenticate | サーバーのクライアントに対する認証情報 |
| ヘッダーフィールド名 | 説明 |
|---|---|
| Cache-Control | キャッシュの動作を制御 |
| Connection | ホップバイホップヘッダー、接続の管理 |
| Date | メッセージ作成の日時 |
| Pragma | メッセージ指示 |
| Trailer | メッセージ末端のヘッダー一覧 |
| Transfer-Encoding | メッセージ本体の転送エンコーディング方式を指定 |
| Upgrade | 他のプロトコルにアップグレード |
| Via | プロキシサーバーの関連情報 |
| Warning | エラー通知 |
| ヘッダーフィールド名 | 説明 |
|---|---|
| Allow | リソースがサポートする HTTP メソッド |
| Content-Encoding | エンティティ本体に適用するエンコーディング方式 |
| Content-Language | エンティティ本体の自然言語 |
| Content-Length | エンティティ本体のサイズ(単位:バイト) |
| Content-Location | 対応するリソースの URI に代わる |
| Content-MD5 | エンティティ本体のメッセージダイジェスト |
| Content-Range | エンティティ本体の位置範囲 |
| Content-Type | エンティティ本体のメディアタイプ |
| Expires | エンティティ本体の有効期限日時 |
| Last-Modified | リソースの最終更新日時 |
P.S.その他のヘッダーフィールドおよびより詳細なヘッダーフィールド情報は 博客園:HTTP メッセージ を参照
###参考資料:
- 《図解 HTTP》
コメントはまだありません