「HTTPはステートレスプロトコルである」と言われるのはなぜですか?


170

HTTPにはHTTP Cookieがあります。Cookieを使用すると、サーバーはユーザーの状態、接続数、最後の接続などを追跡できます。

HTTPには永続的な接続(Keep-Alive)があり、同じTCP接続から複数の要求を送信できます。


3
「ステートレス性」が見られないもう1つの領域は、承認、特にプロキシ承認です。交渉中はステートフルのようです。NTLM認証の場合、NTLMメッセージタイプにはシーケンスがあるため、クライアントはプロキシ認証のタイプを覚えておく必要があり、サーバーはステートフルである必要があります。だから私は答えを理解するかどうかはわかりません。
Lindsay Morsillo 2013

1
ここでHTTP / 1.1を追加する必要がありますか?HTTP / 2には状態があると思うので。
Jose Nobile 2016年

4
HTTP / 2はステートフルです。HTTP 1はステートレスです。 Cookieのように、HTTP 1を対象としたその後の追加により、状態が追加されました。これらの追加は、「コア」HTTP 1仕様の一部ではありません。これがHTTP 1がステートレスプロトコルであると言われている理由ですが、実際にはそうではありません。一方、HTTP / 2は、ステートフルコンポーネントが組み込まれた状態で設計されています。「ステートフル」というラベル付けの要件を満たすために追加する必要はありません。
ザミコール2017

回答:


130

同じHTTP接続を介して複数の要求を送信できる場合でも、サーバーは、同じソケットを介して到着することに特別な意味を与えません。これは単にパフォーマンス上の問題であり、そうしないと各要求の接続の再確立に費やされる時間/帯域幅を最小限に抑えることを目的としています。

HTTPに関する限り、それらはすべて個別の要求であり、要求を満たすために十分な情報を独自に含める必要があります。それが「無国籍」の本質です。サーバーが認識している共有情報(ほとんどの場合、Cookie内のセッションID)が存在しない場合、要求は互いに関連付けられません。


1
サーバーがセッション(サーバー側)を記憶し、それに応じてユーザーエクスペリエンスをカスタマイズするとどうなりますか?
NurShomik、2016

3
@NurShomik:セッションが通常どのように機能するかの説明については、stackoverflow.com / a / 3521393/319403を参照してください。
cHao 2016

12
@Andrew:HTTPは「組み込み」のTCPではなく、TCPの状態はHTTPの状態ではありません。2つは、スタック内の異なるレイヤーで完全に別個のプロトコルです。必要に応じて、またはファイルを送信することで、名前付きパイプを介してHTTPを提供することができます。これには、それに同意するのに十分なマゾヒストがいる場合、HTTPはトランスポートプロトコルに依存しないため、正確に機能します。そのレベルでは、すべてが要求と応答です。これにより、低レベルまたは高レベルのプロトコルでどの状態が使用/維持/要求されるかに関係なく、HTTP自体がステートレスになります。
cHao 2017

@cHaoわかりました、私は認めます。場合は、我々は「ないとステートレスの定義は必ずしも動作させるために状態を持つことが必要」(HTTP内の状態のためのオプションをリストの下にdimo414の回答を参照してくださいウィキペディアからの引用)、および場合我々は、それ自体で厳密に各プロトコルを表示し、その下の層に基づいていません、そうですね、HTTPは「ステートレス」であることに同意できます。
Andrew

101

ウィキペディアから:

HTTPはステートレスプロトコルです。ステートレスプロトコルでは、サーバーが複数のリクエストの間、各ユーザーに関する情報またはステータスを保持する必要はありません。

ただし、一部のWebアプリケーションでは、たとえば、ユーザーのWebページのコンテンツをカスタマイズするためにWebサーバーが必要な場合など、ページ間のユーザーの進行状況を追跡する必要がある場合があります。これらの場合の解決策は次のとおりです。

  • HTTP Cookieの使用。
  • サーバー側セッション、
  • 非表示の変数(現在のページにフォームが含まれている場合)、および
  • URIエンコードされたパラメーターを使用したURL書き換え(例:/index.php?session_id=some_unique_session_code)。

プロトコルをステートレスにするのは、サーバーが複数の要求にわたって状態を追跡する必要がないことです。必要な場合にそうすることはできません。これにより、クライアントとサーバー間の契約が簡素化され、多くの場合(たとえば、CDNを介して静的データを提供するなど)、転送する必要のあるデータの量が最小限に抑えられます。サーバーがクライアントの訪問の状態を維持する必要がある場合、要求の発行と応答の構造はより複雑になります。このモデルのシンプルさは、その最大の特徴の1つです。


21

ステートレスプロトコルでは、複数のリクエストの間、サーバーが各通信パートナーに関するセッション情報やステータスを保持する必要がないためです。

HTTPはステートレスプロトコルです。つまり、トランザクションが終了すると、ブラウザとサーバー間の接続が失われます。


2
ただし、HTTPはCookieを使用してサーバーに情報を保存できます。キープアライブを使用したHTTPは、各リクエストで接続を閉じません。
Jose Nobile

3
この記事をチェックしてください:-ecst.csuchico.edu/~amk/foo/advjava/notes/servlets/Cookies.html
Rahul Tripathi

18
サーバーに情報を保存しても、接続が常に有効であるとは限りません。
スリヤン

1
@srijanそうですね。そう?他に誰も主張していなかった。
Mark Amery、2015年

10

HTTPstateless protocol、各リクエストがその前に実行されたリクエストを認識せずに独立して実行されるため、つまりトランザクションが終了するとブラウザとサーバー間の接続も失われるため、aと呼ばれます。

プロトコルstatelessを構成するのは、元の設計ではHTTPが比較的単純であることfile transfer protocolです。

  1. URLで指定されたファイルをリクエストします。
  2. 応答でファイルを取得し、
  3. 切断します。

同じクライアントからでも、1つの接続と別の接続の間に維持された関係はありませんでした。これにより、クライアントとサーバー間の契約が簡素化され、多くの場合、転送する必要のあるデータの量が最小限に抑えられます。


3

プロトコルHTTPがStateフルプロトコルとして指定されている場合、ブラウザーウィンドウは単一の接続を使用してWebサーバーに通信し、Webアプリケーションに複数の要求を送信します。これにより、ブラウザーウィンドウがブラウザーウィンドウとWebサーバー間の接続を長時間維持し、維持する機会が与えられます。クライアントの接続のほとんどがアイドル状態であっても、Webサーバーの最大接続数に達する状況が発生する可能性があります。


1
HTTPにはすでにキープアライブがあります。つまり、サーバーは接続を閉じず、クライアントは同じ接続で多くの要求を行うことができます。
Jose Nobile 14

3

HTTPはコネクションレスであり、これはHTTPがステートレスプロトコルであることの直接の結果です。サーバーとクライアントは、現在のリクエストの間のみお互いを認識します。その後、二人はお互いのことを忘れます。このプロトコルの性質により、クライアントもブラウザも、Webページ全体の異なる要求間で情報を保持できません。


1

ステートレスとは何ですか?

要求が行われ、応答がクライアントに返されると、接続がドロップまたは終了します。サーバーはリクエスターのことをすべて忘れます。

なぜ無国籍?

Webはステートレスプロトコルを採用することを選択します。Webの本来の目的は、ドキュメント(Webページ)を非常に大きなサイズで提供できるようにすることでした。サーバーに非常に基本的なハードウェアを使用している人々の。

長時間実行される接続を維持することは、非常に多くのリソースを消費します。

Webがステートフルプロトコルを選択した場合、訪問者の接続を維持するためにサーバーの負荷が増加します。


1

HTTP無国籍です。TCPステートフルです。何のいわゆる存在しないHTTP connectionだけ、HTTP requestHTTP response。別のを作成するためにメンテナンスする必要はありませんHTTP request「キープアライブ」である接続ヘッダーは、接続を常に切断して再確立するのではなくTCP、後続のHTTP要求と応答によって再利用されることを意味しますTCP


0

誰かがSTATELESSコンセプトに非常に残念な名前を選んだと思います。それが全体的な誤解の原因です。それは、あらゆる種類のリソースを格納することではなく、クライアントとサーバー間の関係についてです。

クライアント:私はすべてのリソースを管理し、処理する必要があるすべての重要なアイテムの「リスト」をお送りします。あなたの仕事をする。

サーバー:了解しました。適切な応答を提供するために重要なことをフィルタリングする責任を私に与えます。

つまり、サーバーはクライアントの「スレーブ」であり、要求のたびに「マスター」を忘れる必要があります。実際、STATELESSはサーバーの状態のみを参照します。

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_3

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.