web-dev-qa-db-ja.com

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

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

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

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

26
Ant's

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

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

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

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

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

42
LawrenceC

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

特定の要求と応答のペアをトランスポートするには、任意の大きなブロックをそこに、任意の大きなブロックを戻すことができるプロトコルが必要です。パケットサイズが制限されたレイヤーでこれを行うには、TCP hasステートフルであること。

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

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

10
Jan Hudec

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

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

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

2
Simon Richter

あなたはそれをロシアの人形のセット(または必要に応じて箱)のセットとして理解する必要があり、それぞれが別の人形を運ぶ、それは大体それがどのように機能するかです:TCPはHTTP「内部」を運ぶがそれは気にしないまたはそれは機能です。

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

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

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

1
runlevel0