HTTPセッションとTCP接続


 


ここで、HTTPのセッションとTCP接続との関係について簡単に説明する。TCPはもともと「接続」の概念の無いIPプロトコルの上に、高品質なデータの転送と「接続」という概念を組入れたプロトコルである。クライアントはサーバに対して808080といった受け付けポート番号で接続を開始する。いったん両者間の接続が確立されると、その接続のもとで各種のデータの交換が可能となる。データ交換が終了するとどちらかからこのTCP接続の開放をかける。TCP接続の確立と開放には複雑な両者間のIPによる手続きと時間を要する。

 

HTTP/1.0では通常下図のように要求/応答ごとにTCP接続がなされる。従って多くの要素からなるHTMLページをダウンロードするにはこれが相当のオーバヘッドとなる。


HTTP/1.1ではこれが改善され、どちらかがConnection: CloseHTTPヘッダで指定しない限りHTTP応答の後ではTCPは接続されたままとなる。クライアントはひとつのTCP接続上で複数の要求を続けてすることができる。これを継続した接続(persistent connectionまたはkeep-alive)と呼ぶ。サーブレットがTCP開放をかけるときは:

HttpServletResponse.setHeader(“Connection”, “Close”);

を実行する。


但しHTTP/1.0クライアントでも、NetScapeのブラウザのように特別に

Connection: Keep-Alive

なるヘッダ行を付け、TCP接続の開放をしないことをサーバに指定することが可能である(これはHTTP/1.1適合ではないが、これを実装しているブラウザもあるということで、互換性が保証されているわけではないが...)。但しその場合は、あらかじめ応答のボディ部の長さが判っていなければならない。HTTP/1.0ではTCP接続が切れることでボディの終了とみなすが、HTTP/1.0クライアントが継続した(persistent)接続を要求すると、ボディの長さが判らないとボディの終わりを検出できない。HelloWorldサーブレットをTelnetでアクセスしてみれば判るように、エンジンはContent-Lengthヘッダ行を自動的には付加してくれない。従ってこの場合はContent-Lengthヘッダ行が必要とされるのである。

 

HTTP/1.1では、継続した接続がデフォルトである。従ってKeep-Aliveという行は存在せず、Connection: Close行だけが有効である。HTTP/1.1では、後で紹介するようにContent-Lengthヘッダ行が付けられない場合、ボディのデータを複数の塊(チャンク)にし、各塊のサイズを付加してこれをクライアントに渡すことができる。この形式だと、長さゼロのチャンクが来たことで最後のデータであることの識別ができる。

 

 

前節     目次     次節