web-dev-qa-db-ja.com

httpがステートレスであると言うとき、それはどういう意味ですか

私は勉強していますJava Webの場合、httpはステートレスです。それはどういう意味で、プログラミングにどのように影響するかを述べています。

私はまた春のフレームワークを勉強していましたが、それは状態が変化するときにいくつかのBeanがインナーBeanとして宣言しなければならないことに言及しています。それはどう言う意味ですか?

35
John

HTTP(サーバーとクライアント間の実際のトランスポートプロトコル)は、呼び出し間で何も記憶しないため、「ステートレス」です。 [〜#〜] every [〜#〜]HTTP経由でアクセスされるリソースは、スレッド接続のない単一のリクエストです。同じサーバーにアクセスする3つの<img>タグを含むHTMLファイルを含むWebページをロードすると、4つのTCP接続がネゴシエートおよびオープンされ、4つのデータ転送、4接続が閉じられます。サーバーで保持される状態はありませんprotocollevelでは、サーバーはあなたが入ってくるときにあなたについて何でも知っています。

HTTP HTTPをステートフルにします。純粋なステートレスではなく、ダーティステートレスにします。)

違いを理解しやすくするために、TelnetやSSHなどのプロトコルがステートレスであると想像してください。リモートファイルのディレクトリリストを取得するには、1つのアトミック操作として、接続、サインイン、ディレクトリへの変更、lsコマンドの発行が必要になります。 lsコマンドがディレクトリの内容の表示を完了すると、接続が閉じられます。その後、特定のファイルの内容を表示したい場合は、再度接続し、サインインし、ディレクトリに移動して、catコマンドを発行する必要があります。ファイルを表示するコマンドが終了すると、接続が再び閉じられます。

そのように見ると、Telnet/SSHのレンズはかなり愚かに聞こえますが、そうではありませんか。まあ、ある意味ではそうであり、ある意味ではそうではありません。プロトコルがステートレスである場合、サーバーはかなり優れた最適化を行うことができ、データは簡単に拡散できます。ステートレスプロトコルを使用するサーバーは非常に効果的に拡張できるため、実際の個々のデータ転送は非常に遅くなる可能性があります(TCP接続は安くない!)任意の数のユーザーに拡張できます。

だが...

静的なWebページの表示以外にやりたいことのほとんどは、セッションと状態に関係します。 HTTPが本来の目的(科学論文のような静的情報の共有)に使用される場合、ステートレスプロトコルは非常に理にかなっています。 Webアプリケーション、オンラインストアなどに使用し始めると、これらは本質的にステートフルなアクティビティであるため、ステートレスが面倒になり始めます。その結果、人々はステートレスプロトコルの上に状態を殺す方法を非常に迅速に思いつきました。これらのメカニズムには、Cookieのようなものが含まれています。URLの状態のエンコードや、サーバーに、隠された状態の要求などのデータに基づいてデータを動的に起動させます。 Webソケットなど。

以下に、概念をより深く理解するために参照できるリンクをいくつか示します。

HTTPはステートレスです-これは、HTTPを使用する場合、エンドポイントが物事を「記憶」していないことを意味します(あなたが誰であるかなど)。状態はありません。これはデスクトップアプリケーションとは対照的です。フォームがあり、別のフォームに移動してから戻ると、状態は保持されます(アプリケーションをシャットダウンしない限り)。

通常、Webアプリケーションの状態を維持するために、Cookieを使用します。

12
Oded

ステートレスプロトコルでは、サーバーが複数の要求の間、各ユーザーに関する情報やステータスを保持する必要はありません。たとえば、ユーザーのためにWebページのコンテンツをカスタマイズするためにWebサーバーが必要な場合、Webアプリケーションはページからページへのユーザーの進行状況を追跡する必要があります。

一般的な解決策は、HTTP Cookieの使用です。他の方法には、サーバー側セッション、隠し変数(現在のページがフォームの場合)、およびURIエンコードされたパラメーターを使用したURL書き換え(/index.php?session_id=some_unique_session_codeなど)があります。

ここ

5
Luis

[〜#〜] http [〜#〜]は、各コマンドが以前に来たコマンドの知識なしに独立して実行されるため、ステートレスプロトコルと呼ばれます。それ。

HTTPのこの欠点は、 cookies を含む多くの新しいテクノロジーで対処されています。

4
ykombinator

何かがステートレスであると言われるとき、それは通常、サーバーが相互作用の間の状態を追跡すると仮定できないことを意味します。

デフォルトでは、HTTPプロトコルは真にステートレスなサーバーを想定しています。すべてのリクエストは独立したリクエストとして扱われます。

実際には、これは一部のサーバー(ほとんどのサーバー)がfixedであり、リクエストのトラッキングCookieを使用して、サーバー上の特定のクライアントと特定の状態を一致させます。これが機能するのは、Cookieが機能するためです(Cookieがクライアントに設定されると、後続の各リクエストでサーバーに送信されます)。

基本的に、ステートレスではないサーバーは、拡張の障害です。特定のブラウザからのすべてのリクエストを同じインスタンスにルーティングするか、状態のバックエンド複製を行う必要があります。これは通常、アプリケーションをスケーリングしようとする場合の制限要因です。

状態を追跡するためのソリューションは他にもいくつかあります(Railsの暗号化された状態Cookieを参照)が、基本的に成長したい場合は、サーバーで状態を追跡しない方法を考え出す必要があります:)。

3
Mihai Toader