HTTPはステートレスであると言われています。つまり、データを送信するために情報を保存する必要はありません。
ただし、HTTPは状態指向のTCPを使用します。
その場合、HTTPはどのようにしてステートレスになりますか?
HTTPはステートレスであると言われています。つまり、データを送信するために情報を保存する必要はありません。
ただし、HTTPは状態指向のTCPを使用します。
その場合、HTTPはどのようにしてステートレスになりますか?
回答:
HTTPは、それ自体がステートレスであっても、それ自体を転送するために使用される下位レベルのプロトコルを気にせず、独立しています。
トランスポートテクノロジーは、TCP、Novellの古いSPX、またはSCTP、または他に思いつくものであれば何でもかまいませんが、HTTPは同じように機能します。HTTPは、ストリーミングプロトコルまたは接続指向のプロトコルを必要としますが(解決可能なURLに依存します)、それがどのように達成されるかは気にしません。
これが、階層化モデルまたはネットワークスタックが存在する理由の1つです。アプリケーション層は、下位層に関心を持つ必要はありません。
下位レベルのプロトコルがステートフルだからといって、その上にあるものが自動的にステートフルになる、またはステートフルである必要があるというわけではありません。
HTTP自体はステートレスです。つまり、状態を確立するには、アプリケーションがHTTPの上に別の層を実装する必要があります。これは通常、セッションCookieで行われます。
「HTTPはステートレス」とは、各HTTPトランザクション(要求と応答のペア)が、以前の要求と応答のペアの状態とは無関係に処理できることを意味します。
特定の要求と応答のペアを転送するには、そこに任意の大きなブロックを運び、任意の大きなブロックを戻すことができ、パケットサイズが制限されたレイヤーでそれを行うプロトコルが必要です。TCPはステートフルでなければなりません。
しかし、トランザクションの境界を越えて、状態はありません。クライアントは接続をドロップし、次の要求のために新しい接続を確立できます。実際、これは初期バージョンの唯一のオプションであり、クライアントにConnection: keep-alive
ヘッダーが含まれていない場合でも同様に機能します。
次の要求も別のサーバーで簡単に処理でき、サーバーは状態を維持する必要がないため、クライアントは決して知ることができません(アプリケーションがHTTPの上に、通常はセッションの形式で独自の状態を追加しない限り、結果として生じる複雑さロードバランシングでは、HTTPでステートフルプロトコルを構築することに対する罰です。これは、ビジーなサーバーの負荷分散に活用されます。
can also easily be handled by different server and the client will never know
技術的には正しいが、これは多くのWebアプリケーションがスティッキーセッションを使用し、同じブラウジングセッションから同じサーバーに将来のリクエストをルーティングするためにロードバランサーを必要とするため、誤解を招きます。HTTPの観点からは、セッションは関係ありませんが、最後の文は、エンドユーザーエクスペリエンスが影響を受けないことを意味し、スティッキーセッションでは偽になります。
あなたはそれをロシアの人形のセット(またはあなたが望むなら箱)として理解する必要があり、それぞれが別の人形を運んでいます。それはひどく動作します:TCPはHTTP「内部」を運びますが、それは気にしませんし、機能もありません。
全体像を把握するには、OSIモデルについて読むことをお勧めしますをすることます。
TCPはOSIモデルでHTTPの数層下にあり、実際には各層は異なるプロトコルに対応しています。
この場合、HTTPはプレゼンテーション層とアプリケーション層にあり、TCPはトランスポート層にあります。または、TCP / IPモデルを使用する場合、TCPプロトコルとIPプロトコルの両方がネットワークリンク層にあり、HTTPがアプリケーション層とプレゼンテーション層にあります。