HTTP / 2ぞのパス

翻蚳者からここに、HTTPプロトコルずその履歎の抂芁がありたす-バヌゞョン0.9からバヌゞョン2たで。







HTTPはWebピアシングプロトコルです。 すべおのWeb開発者はそれを知る必芁がありたす。 HTTPの仕組みを理解するず、Webアプリケヌションを改善できたす。







この蚘事では、HTTPずは䜕か、どのようにHTTPが今日のようになったかに぀いお説明したす。







HTTPずは䜕ですか



それでは、HTTPずは䜕かを芋おみたしょう。 HTTPは、TCP / IPを介しお実装されるアプリケヌション局プロトコルです。 HTTPは、クラむアントずサヌバヌが盞互にやり取りする方法、コンテンツがむンタヌネット䞊で芁求および送信される方法を決定したす。 アプリケヌションレベルのプロトコルでは、これは単なる抜象化であり、ネットワヌクノヌドクラむアントずサヌバヌが盞互に察話する方法を暙準化するこずを理解しおいたす。 HTTP自䜓はTCP / IPプロトコルに䟝存しおいるため、クラむアントずサヌバヌ間でリク゚ストを送受信できたす。 デフォルトでは、TCPポヌト80が䜿甚されたすが、他のポヌトも䜿甚できたす。 たずえば、HTTPSはポヌト443を䜿甚したす。







HTTP / 0.9-最初の暙準1991



文曞化された最初のHTTPバヌゞョンは、1991幎にリリヌスされたHTTP / 0.9でした。 これは、GETずいう1぀の方法で、䞖界で最も単玔なプロトコルでした。 クラむアントがサヌバヌ䞊のペヌゞを取埗する必芁がある堎合、圌はリク゚ストを行いたした。







GET /index.html
      
      





そしお、サヌバヌから次のようなものが来たした







 (response body) (connection closed)
      
      





以䞊です。 サヌバヌは芁求を受信し、応答ずしおHTMLを送信し、すべおのコンテンツが送信されるずすぐに接続を閉じたす。 HTTP / 0.9にはヘッダヌがありたせん。唯䞀の方法はGETであり、答えはHTMLで提䟛されたす。







そのため、HTTP / 0.9は残りの歎史の最初のステップでした。







HTTP / 1.0-1996



HTML応答専甚に蚭蚈されたHTTP / 0.9ずは異なり、HTTP / 1.0は他の圢匏画像、ビデオ、テキスト、その他の皮類のコンテンツも凊理したす。 新しいメ゜ッドが远加されたしたPOSTやHEADなど。 芁求/応答の圢匏が倉曎されたした。 芁求ず応答に远加されたHTTPヘッダヌ。 さたざたなサヌバヌ応答を区別するために、ステヌタスコヌドが远加されたした。 ゚ンコヌドのサポヌトが導入されたした。 マルチパヌトタむプ、認蚌、キャッシュ、コンテンツのさたざたな゚ンコヌディングなどが远加されたした。







これは、HTTP / 1.0の単玔なリク゚ストずレスポンスの倖芳です。







 GET / HTTP/1.0 Host: kamranahmed.info User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) Accept: */*
      
      





芁求に加えお、クラむアントは個人情報、必芁な応答の皮類などを送信したした。 HTTP / 0.9では、ヘッダヌが存圚しなかったため、クラむアントはそのような情報を送信したせんでした。







同様の芁求に察する応答の䟋







 HTTP/1.0 200 OK Content-Type: text/plain Content-Length: 137582 Expires: Thu, 05 Dec 1997 16:00:00 GMT Last-Modified: Wed, 5 August 1996 15:55:28 GMT Server: Apache 0.84 (response body) (connection closed)
      
      





応答の先頭はHTTP / 1.0HTTPおよびバヌゞョン番号であり、ステヌタスコヌドは200、ステヌタスコヌドの説明です。







新しいバヌゞョンでは、芁求および応答ヘッダヌはASCIIで゚ンコヌドされたしたすべおのHTTP / 0.9はASCIIで゚ンコヌドされたしたが、応答本文は任意のコンテンツタむプ画像、ビデオ、HTML、プレヌンテキストなどになりたす。クラむアントぞのコンテンツの皮類。したがっお、頭字語HTTPの「ハむパヌテキスト」ずいうフレヌズは歪みになっおいたす。 HMTP、たたはハむパヌメディア転送プロトコルは、おそらくより適切な名前になりたすが、それたでに誰もがすでにHTTPに慣れおいたした。







HTTP / 1.0の䞻な欠点の1぀は、同じ接続䞭に耇数の芁求を送信できないこずです。 クラむアントがサヌバヌから䜕かを取埗する必芁がある堎合、クラむアントは新しいTCP接続を開く必芁があり、芁求が完了するずすぐにこの接続は閉じられたす。 埌続のリク゚ストごずに、新しい接続を䜜成する必芁がありたす。







なぜこれが悪いのですか 10個の画像、5個のスタむルファむル、5個のJavaScriptファむルを含むペヌゞを開くず仮定したす。 このペヌゞを照䌚する堎合、合蚈で20のリ゜ヌスを取埗する必芁がありたす。぀たり、サヌバヌは20の個別の接続を䜜成する必芁がありたす。 新しいTCP接続ごずに「トリプルハンドシェむク」ずそれに続くスロヌスタヌトが必芁になるため、この接続数はパフォヌマンスに倧きく圱響したす。







トリプルハンドシェむク



「トリプルハンドシェむク」ずは、クラむアントずサヌバヌ間の䞀連のパケットの亀換であり、TCP接続を確立しおデヌタ転送を開始できたす。









翻蚳者泚  SYN-シヌケンス番号を同期したす。 ACK- 「確認番号」フィヌルドが有効になりたす。







TCP接続を確立する







トリプルハンドシェむクの完了埌にのみ、クラむアントずサヌバヌ間のデヌタ転送が開始されたす。 クラむアントは最埌のACKパケットを送信した盎埌にデヌタを送信できたすが、サヌバヌはただACKパケットが芁求を完了するこずを期埅しおいたす。







ただし、䞀郚のHTTP / 1.0実装では、新しいConnectionkeep-aliveヘッダヌを远加するこずでこの問題を解決しようずしたした。これは、サヌバヌに「ねえ、バディ、この接続を閉じないでください、ただ有甚です」ず蚀いたす。 ただし、この機胜は広く普及しおいなかったため、問題は匕き続き重芁でした。







HTTPはコネクションレス型プロトコルであるずいう事実に加えお、状態サポヌトも提䟛したせん。 ぀たり、サヌバヌはクラむアントに関する情報を保存しないため、各リク゚ストには過去のリク゚ストを考慮せずに、サヌバヌが必芁ずするすべおの情報を含める必芁がありたす。 そしお、これは火灜に燃料を远加するだけです。クラむアントが開く膚倧な数の接続に加えお、繰り返しデヌタを送信し、ネットワヌクを䞍必芁に過負荷にしたす。







HTTP / 1.1-1999



HTTP / 1.0から3幎が経過し、1999幎にプロトコルの新しいバヌゞョンがリリヌスされたした-HTTP / 1.1には倚くの改良が含たれおいたす









持続的な接続たたはストリヌミングデヌタの利点を感じるためには、応答でContent-Lengthヘッダヌが利甚可胜でなければならないこずに泚意しおください。 これにより、クラむアントは転送がい぀完了するかを理解でき、次の芁求を送信する通垞の連続した芁求の堎合か、次の応答の埅機を開始するストリヌミングの堎合こずができたす。

しかし、このアプロヌチにはただ問題がありたした。 デヌタが動的で、サヌバヌが送信前にコンテンツの長さを認識できない堎合はどうなりたすか この堎合、氞続的な接続を䜿甚できたせんか この問題を解決するために、HTTP / 1.1は、情報を小さな郚分チャンクに分割しお送信するメカニズムであるハンク゚ンコヌディングを導入したした。









機胜HTTP / 1.1-䌚話甚の別のトピック。この蚘事では、このトピックに぀いお長々ず説明したせん。 このトピックに関する膚倧な量の資料を芋぀けるこずができたす。 HTTP / 1.0ずHTTP / 1.1の重芁な違い、およびスヌパヌヒヌロヌにはRFCぞのリンクを読むこずをお勧めしたす 。







HTTP / 1.1は1999幎に登堎し、長幎にわたっお暙準のたたでした。 そしお、それはその前身よりもはるかに優れおいたしたが、時間ずずもに時代遅れになり始めたした。 Webは絶えず成長および倉化しおおり、Webペヌゞの読み蟌みには毎日より倚くのリ゜ヌスが必芁です。 今日、暙準のWebペヌゞは30以䞊の接続を開かなければなりたせん。 あなたは蚀うでしょう「しかし...結局... HTTP / 1.1では垞に接続がありたす...」。 ただし、HTTP / 1.1は垞に1぀の倖郚接続のみをサポヌトしたす。 HTTP / 1.1はデヌタをストリヌミングするこずでこれを修正しようずしたしたが、これは問題を完党には解決したせんでした。 キュヌの先頭をブロックする問題 ヘッドオブラむンブロッキング -䜎速たたは倧芏暡な芁求が埌続のすべおを芁求したずきキュヌの順序で実行されたため。 HTTP / 1.1のこれらの欠点を克服するために、開発者は回避策を考案したした。 この䟋は、CSSむメヌゞで゚ンコヌドされたスプラむト、CSSファむルずJSファむルの連結、 ドメむンシャヌディングなどです。







SPDY-2009



Googleはさらに進んで、Webペヌゞの遅延を枛らしおWebを高速化し、セキュリティを向䞊させるこずを目暙に、代替プロトコルの実隓を開始したした。 2009幎に、圌らはSPDYプロトコルを導入したした。







ネットワヌク垯域幅を増やし続けるず、パフォヌマンスが向䞊するように芋えたした。 ただし、特定の時点から、スルヌプットの増加がパフォヌマンスに圱響を䞎えなくなるこずが刀明したした。 䞀方、遅延の倧きさで操䜜する堎合、぀たり応答時間を短瞮する堎合、パフォヌマンスゲむンは䞀定になりたす。 これがSPDYの䞻なアむデアでした。







違いが䜕であるかを明確にする必芁がありたす遅延時間は、送信者から受信者にデヌタを送信するのにかかる時間ミリ秒単䜍を瀺す倀であり、スルヌプットは1秒あたりの送信デヌタ量1秒あたりのビット数です。

SPDYには、倚重化、圧瞮、優先順䜍付け、セキュリティなどが含たれおいたした。次のセクションでは兞型的なHTTP / 2プロパティを分析し、HTTP / 2はSPDYから倚くを取埗したため、SPDYの話に飛び蟌みたせん。







SPDYは、HTTPをそれ自䜓に眮き換えようずしたせんでした。 これは、アプリケヌションレベルに存圚するHTTP䞊の遷移局であり、回線を介しお送信する前に芁求を倉曎したした。 それは事実䞊の暙準になり始め、ほずんどのブラりザはそれをサポヌトし始めたした。







2015幎に、Googleは2぀の競合する暙準が存圚しないこずを決定し、SPDYずHTTPを組み合わせおHTTP / 2を生み出したした。







HTTP / 2-2015



HTTPプロトコルの新しいバヌゞョンが必芁であるこずは既におわかりだず思いたす。 HTTP / 2は、コンテンツを䜎遅延で転送するように蚭蚈されたした。 HTTP / 1.1ずの䞻な違い









HTTP / 2







1.バむナリプロトコル



HTTP / 2は、バむナリ圢匏に切り替えるこずにより、HTTP / 1.xに存圚しおいた遅延の増加の問題を解決しようずしおいたす。 バむナリメッセヌゞは自動的に高速で解析されたすが、HTTP / 1.xずは異なり、人間が読むこずはできたせん。 HTTP / 2の䞻なコンポヌネントは、フレヌムフレヌムずストリヌムストリヌムです。







フレヌムずストリヌム。



HTTPメッセヌゞは1぀以䞊のフレヌムで構成されおいたす。 HEADERSフレヌムはメタデヌタに䜿甚され、DATAフレヌムはメむンデヌタに䜿甚され、HTTP / 2仕様で芋぀かる他のタむプのフレヌムRST_STREAM、SETTINGS、PRIORITYなどがありたす 。







各HTTP / 2芁求ず応答は、䞀意のストリヌム識別子を受け取り、フレヌムに分割されたす。 フレヌムは単なるバむナリデヌタです。 フレヌムのコレクションは、ストリヌムず呌ばれたす。 各フレヌムには、どのストリヌムに属するかを瀺すストリヌム識別子が含たれ、各フレヌムには共通のヘッダヌが含たれたす。 たた、ストリヌム識別子が䞀意であるずいう事実に加えお、各クラむアント芁求が奇数のIDを䜿甚し、サヌバヌからの応答が偶数であるこずを蚀及する䟡倀がありたす。







HEADERSずDATAに加えお、RST_STREAM-ストリヌムの䞭断に䜿甚される特別なタむプのフレヌムも蚀及する䟡倀がありたす。 クラむアントはこのフレヌムをサヌバヌに送信しお、このストリヌムが䞍芁になったこずを通知できたす。 HTTP / 1.1では、サヌバヌが応答の送信を停止する唯䞀の方法は、接続を閉じるこずでした。これにより、以降の芁求に察しお新しい接続を開く必芁があったため、遅延時間が増加したした。 たた、HTTP / 2では、クラむアントはRST_STREAMを送信し、特定のストリヌムの受信を停止できたす。 同時に、接続は開いたたたになり、残りのスレッドが機胜したす。







2.倚重化



HTTP / 2は、前述のように、芁求ず応答にフレヌムずストリヌムを䜿甚するバむナリプロトコルであるため、远加のストリヌムを䜜成せずに、すべおのストリヌムが単䞀のTCP接続で送信されたす。 サヌバヌは、同様の非同期方匏で応答したす。 これは、応答が順序どおりではなく、クラむアントがスレッド識別子を䜿甚しお、パケットがどのスレッドに属しおいるかを理解するこずを意味したす。 これにより、キュヌの先頭をブロックする問題行頭ブロッキング が解決されたす。クラむアントは、埅機䞭に残りの芁求を凊理できるため、アむドル状態で長い芁求の凊理を埅぀必芁がありたせん。







3. HPACKヘッダヌ圧瞮



これは、送信ヘッダヌの最適化を特に目的ずした別のRFCの䞀郚でした。 同じクラむアントからサヌバヌに絶えずアクセスしおいる堎合、倧量の繰り返しデヌタがヘッダヌで䜕床も送信されるずいう事実に基づいおいたした。 たた、これにCookieが远加され、ヘッダヌのサむズが倧きくなるこずがありたす。これにより、ネットワヌク垯域幅が枛少し、遅延時間が長くなりたす。 この問題を解決するために、HTTP / 2でヘッダヌ圧瞮が導入されたした。







芋出し衚







芁求および応答ずは異なり、ヘッダヌはgzipたたは同様の圢匏で圧瞮されたせん。 圧瞮には異なるメカニズムが䜿甚されたす-リテラル倀はHuffmanアルゎリズムを䜿甚しお圧瞮されたすが、クラむアントずサヌバヌは単䞀のヘッダヌテヌブルをサポヌトしたす。 重耇したヘッダヌたずえば、ナヌザヌ゚ヌゞェントは、繰り返し芁求䞭に省略され、ヘッダヌテヌブル内の䜍眮を参照したす。







ヘッダヌに぀いお説明しおいるので、それらはHTTP / 1.1ず倉わらないこずを远加したす。ただし、メ゜ッド、スキヌム、ホスト、パスなど、いく぀かの疑䌌ヘッダヌが远加されおいたす。







4.サヌバヌプッシュ



サヌバヌプッシュはHTTP / 2のもう1぀のすばらしい機胜です。 クラむアントが特定のリ゜ヌスを芁求するこずを知っおいるサヌバヌは、芁求を埅たずに送信できたす。 ここで、たずえば、それが有甚である堎合、ブラりザはWebペヌゞをロヌドし、それを解析し、サヌバヌからダりンロヌドする必芁がある他のコンテンツを芋぀けお、察応するリク゚ストを送信したす。







サヌバヌプッシュにより、サヌバヌは远加のリク゚ストの数を枛らすこずができたす。 クラむアントがデヌタを芁求するこずを知っおいる堎合、圌はすぐにそれらを送信したす。 サヌバヌは特別なPUSH_PROMISEフレヌムを送信し、クラむアントに次のように䌝えたす。「ねえ、バディ、このリ゜ヌスを送信したす。 たた、もう迷惑をかけないでください。」PUSH_PROMISEフレヌムは、プッシュを送信したストリヌムに関連付けられおおり、サヌバヌが目的のリ゜ヌスを送信するストリヌムの識別子を含んでいたす。







5.優先順䜍付けを芁求する



クラむアントは、ストリヌムを開くHEADERSフレヌムに優先床情報を远加するこずにより、ストリヌムに優先順䜍を付けるこずができたす。 それ以倖の堎合、クラむアントは、ストリヌムの優先床を倉曎するPRIORITYフレヌムを送信できたす。







優先床情報が指定されおいない堎合、サヌバヌはリク゚ストを非同期に凊理したす。 泚文なし。 優先床が割り圓おられおいる堎合、優先床に関する情報に基づいお、サヌバヌは特定のストリヌムの凊理に割り圓おるリ゜ヌスの数を決定したす。







6.セキュリティ



セキュリティTLSプロトコルを介した送信がHTTP / 2に必須であるかどうかに぀いおは、広範な議論が展開されおいたす。 最終的に、これを必須にしないこずが決定されたした。 ただし、ほずんどのブラりザベンダヌは、TLSを介しお䜿甚される堎合にのみHTTP / 2をサポヌトするず述べおいたす。 したがっお、この仕様ではHTTP / 2の暗号化は必芁ありたせんが、デフォルトでは匕き続き必須になりたす。 同時に、TLSの䞊に実装されたHTTP / 2にはいく぀かの制限がありたすTLSバヌゞョン1.2以降が必芁、最小キヌサむズに制限、短呜キヌが必芁など。







おわりに



HTTP / 2はすでに存圚し、 サポヌトでSPDYをバむパスしおいたす。これは埐々に成長しおいたす。 詳现を知りたい人のために、 HTTP / 2速床の利点を瀺す仕様ぞのリンクずデモぞのリンクを以䞋に瀺したす。







HTTP / 2には、パフォヌマンスを向䞊させるための倚くの機胜があり、䜿甚を開始するずきが来たようです。










オリゞナルKamran AhmedによるHTTP / 2ぞの旅 。







翻蚳 アンドレむ・アレクシヌ゚フ、線集者アナトリヌ・トゥトフ、 ゞャバヌ 、むゎヌル・ペレハン、ナタリア・ペヌキヌナ、ティモフェむ・マリニン、チャむカ・チュルシヌナ、ダナ・クリクリノァダ。








All Articles