HTTPはどのようにしてステートレスになりますか?


26

HTTPはステートレスであると言われています。つまり、データを送信するために情報を保存する必要はありません。

ただし、HTTPは状態指向のTCPを使用します。

その場合、HTTPはどのようにしてステートレスになりますか?


6
これは、スーパーユーザーがローンチされてから5年後の重複ではありませんか?
ピーターモーテンセン

ほとんどの重複がStackOverflowにあるためですか?ただ推測しています。
トリシス14年

8
それは(とりわけ)ケーブルを介して実行されるからといって、それ電動プロトコルのいずれかがありません
ハーゲン・フォン・Eitzen

回答:


42

HTTPは、それ自体がステートレスであっても、それ自体を転送するために使用される下位レベルのプロトコルを気にせず、独立しています。

トランスポートテクノロジーは、TCP、Novellの古いSPX、またはSCTP、または他に思いつくものであれば何でもかまいませんが、HTTPは同じように機能します。HTTPは、ストリーミングプロトコルまたは接続指向のプロトコルを必要としますが(解決可能なURLに依存します)、それがどのように達成されるかは気にしません。

これが、階層化モデルまたはネットワークスタックが存在する理由の1つです。アプリケーション層は、下位層に関心を持つ必要はありません。

下位レベルのプロトコルがステートフルだからといって、その上にあるものが自動的にステートフルになる、またはステートフルである必要があるというわけではありません。

HTTP自体はステートレスです。つまり、状態を確立するには、アプリケーションがHTTPの上に別の層を実装する必要があります。これは通常、セッションCookieで行われます。


1
ルーティングはtcp / ipレベルで発生します。
Fiasco Labs

3
この画像はそれをうまく説明しています。vichargrave.com/wp-content/uploads/2013/01/...
JakeGould

2
偶然にも、HTTPが基礎となる接続(ほとんど常にTCP)のステートフルネスを無視するという事実は、さまざまなHTTP2アプローチが対処しようとしている主要なパフォーマンス不足の1つです。
スコリマ14年

2
@Fiasco:厳密に言えば、ルーティングはIPレベルで行われます。ルーティングはインターネットアドレスに基づいており、基本的なルーティングではTCPレイヤーからの情報は使用されません。
RedGrittyBrick 14年

1
@skolima:一方、ステートレス性は、HTTPが広く使用されている中で最もスケーラブルで信頼性の高いプロトコルである理由です。HTTPは常にパフォーマンスではなくスケーラビリティのために明示的に設計されています(そう、それらは別のものです)ので、間違ったプロトコルを使用している場合、またはプロトコルを誤って使用している場合よりもハード低遅延が必要と思われる場合 HTTP2はパフォーマンスを向上させることを意図していますが、ステートレス性を維持する方法でそれを行います。意図したとおりに使用したとき、適切に設計されたHTTPアプリケーションのボトルネックとなるステートレス性を見たことはありませんでした。
ライライアン

10

「HTTPはステートレス」とは、各HTTPトランザクション(要求と応答のペア)が、以前の要求と応答のペアの状態とは無関係に処理できることを意味します。

特定の要求と応答のペアを転送するには、そこに任意の大きなブロックを運び、任意の大きなブロックを戻すことができ、パケットサイズが制限されたレイヤーでそれを行うプロトコルが必要です。TCPはステートフルでなければなりません。

しかし、トランザクションの境界を越えて、状態はありません。クライアントは接続をドロップし、次の要求のために新しい接続を確立できます。実際、これは初期バージョンの唯一のオプションであり、クライアントにConnection: keep-aliveヘッダーが含まれていない場合でも同様に機能します。

次の要求も別のサーバーで簡単に処理でき、サーバーは状態を維持する必要がないため、クライアントは決して知ることができません(アプリケーションがHTTPの上に、通常はセッションの形式で独自の状態を追加しない限り、結果として生じる複雑さロードバランシングでは、HTTPでステートフルプロトコルを構築することに対する罰です。これは、ビジーなサーバーの負荷分散に活用されます。


can also easily be handled by different server and the client will never know技術的には正しいが、これは多くのWebアプリケーションがスティッキーセッションを使用し、同じブラウジングセッションから同じサーバーに将来のリクエストをルーティングするためにロードバランサーを必要とするため、誤解を招きます。HTTPの観点からは、セッションは関係ありませんが、最後の文は、エンドユーザーエクスペリエンスが影響を受けないことを意味し、スティッキーセッションでは偽になります。
ブランドン

1
@Brandon:そのようなアプリケーションはHTTPの上にステートフルプロトコルを構築し、これは彼らの罰です!
Jan Hudec

@Brandon:gmailなどの負荷分散されたサーバーの多くは、同じサーバーにリクエストを返送しません。代わりに、セッションはクラスター内のすべてのサーバーがアクセスできる共有データベースに保存されます。したがって、状態はサーバーではなくデータベースによって処理されます。
スリーブマン

@slebetman:ええ、何でも。HTTP自体にはそのような状態がないため、HTTPの場合は簡単です。アプリケーションが独自の状態を追加する場合、それはその戦いです。
Jan Hudec

そう、すべてを言ったわけではありません。私はいくつか言った。個人的には、スティッキーセッションを避け、可能であれば、セッションを完全に避けることを好みます。それにもかかわらず、すべての人の理想を満たしていないソフトウェアが存在します。
ブランドン

2

HTTPの「ステートレス」という性質は、このレイヤーでは状態情報が作成または使用されないことを意味します。

これはいくつかのインスタンスで見ることができます。たとえば、HTTP認証では、資格情報はすべてのリクエストで送信され、永続的な接続は実際には単なる最適化です(つまり、資格情報を送信すると、サーバーは、接続が開いています)。

対照的に、Cookieベースのログインメカニズムはステートフルですが、HTTPの一部ではありません。


1

あなたはそれをロシアの人形のセット(またはあなたが望むなら箱)として理解する必要があり、それぞれが別の人形を運んでいます。それはひどく動作します:TCPはHTTP「内部」を運びますが、それは気にしませんし、機能もありません。

全体像を把握するには、OSIモデルについて読むことをお勧めしますをすることます。

TCPはOSIモデルでHTTPの数層下にあり、実際には各層は異なるプロトコルに対応しています。

この場合、HTTPはプレゼンテーション層とアプリケーション層にあり、TCPはトランスポート層にあります。または、TCP / IPモデルを使用する場合、TCPプロトコルとIPプロトコルの両方がネットワークリンク層にあり、HTTPがアプリケーション層とプレゼンテーション層にあります。


1
OSIモデルの問題は、それが現在理論的であるということです(実際に実装する試みがありましたが、複雑さのために市場で失敗しました)。実際には、TCPとHTTPの間にレイヤーはありません。また、プレゼンテーション層はHTTPではなくHTMLになります。
MSalters

TCP / IPモデルでは、TCPはネットワーク層に存在しません。IPの上のトランスポート層に存在し、IPは後でネットワークにあります。「TCPモデル」の最初のGoogleヒットはこれを示しています:technet.microsoft.com/en-us/library/cc786900(v
Brandon

@MSalters:TLSはレイヤーではありませんか?
悲しみ

1
@MSalters:HTTPSは、TLSによってトンネリングされるHTTPによって与えられた名前にすぎないことを理解していますか?そのため、TLSはHTTPの下のレイヤーであり、TCPおよびTLS / SSL + HTTPコンボの上にあるレイヤーはHTTPSと呼ばれます。
スリーブマン

1
また、TLS / HTTPコンボには別の新しい名前があります。HTTPトラフィックを伝送するTLSが仮想ソケット/ストリーム多重化を実装する場合、SPDYと呼ばれます(ただし、ブラウザーのURLはまだHTTPSです)。
スリーブマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.