前回の投稿で、HTTP通信はレスポンス送信後に
毎回切断される仕様であることがわかった。
では、切断せず…接続を継続するにはどうすればいいのか?
方法はないのだろうか?
調べてみたので、まとめてみる。
通信において、クライアントとサーバーがどのバージョンのHTTP接続を用いているかによって変わる。
クライアントからのリクエストに対して、サーバーはHTTPヘッダーと要求されたHTMLドキュメントもしくは画像ファイルなどのバイナリをレスポンスし終えると接続が切れる。
別のページや画像が要求されると、再接続してGET命令を送り、サーバーはレスポンスが終わると切断する。
つまり必要な時に、必要な分だけ接続されるのである。
この接続方法は、インターネット全体に流れるトラフィックを減らせるだけでなく、サーバーの帯域負荷も低減できる。
一方で、毎回TCP/IPでの接続手順を繰り返すことになる為、レスポンスは低下する。
しかし!!
英文表記そのままであるが、接続を維持せよ!という命令である。
クライアントがGETリクエストを送信する際、この指定を同時にサーバーに送り、それに対してサーバーからも"Connection: Keep-Alive"と返って来れば、接続は維持される。
接続が維持されている間は、GETなどの命令を連続で送信することができ、その都度、TCP/IPの接続が繰り返されることが起きなくなる。
また、サーバー・クライアントのいずれかが、"Connection: close"を指定するとレスポンス終了後に切断される。
1.0と違って最初からクライアント・サーバー共に"Keep-Alive"で動作する。
よって、明示的に"Connection: Keep-Alive"をヘッダーに宣言してリクエストする必要はない。
ちなみに実際には、ブラウザは"GET / HTTP/1.1"のGET命令と同時に"Connection: Keep-Alive"を送信しているケースも少なくない。
ところで…
「HTTPのバージョンの違いって?」って思ったので、調べてみた
サーバー側は1.1に対応していることがわかる。
では、"GET / HTTP/1.1"というリクエストに変えた方がいいのか??
答えは「NO」だ。
TCP/IPのモニタリングソフトで見ると、一部ブラウザはGET命令を"HTTP/1.0"で送信している。
HTTP通信には、下位互換があるため、1.1対応のサーバーに対して1.0でリクエストを送っても正しく動作する。
つまり、GET命令を送信する場合、クライアント側が1.1を指定する必要はないのである。
さて、ここまで書いておいて…なんだが、2015年に"HTTP/2"がすでにリリースされていて、
"HTTP1.1"から順次移行が進むと考えられる。
現時点で1.0はほぼ皆無だろう…
今回はHTTPバージョンの差異をしりたかったので、とりあえず1.0/1.1を対象にしてしまったが、
近々2.0についても勉強していきたいと思う。
毎回切断される仕様であることがわかった。
では、切断せず…接続を継続するにはどうすればいいのか?
方法はないのだろうか?
調べてみたので、まとめてみる。
「HTTPのバージョンで決まる!!」が答え
単純明快だったので、なんの焦らしもなく、答えを書いてしまった笑。通信において、クライアントとサーバーがどのバージョンのHTTP接続を用いているかによって変わる。
【HTTP1.0】の場合
クライアント、サーバーのいずれかが"HTTP1.0のみ"のサポートの場合がこれにあたる。クライアントからのリクエストに対して、サーバーはHTTPヘッダーと要求されたHTMLドキュメントもしくは画像ファイルなどのバイナリをレスポンスし終えると接続が切れる。
別のページや画像が要求されると、再接続してGET命令を送り、サーバーはレスポンスが終わると切断する。
つまり必要な時に、必要な分だけ接続されるのである。
この接続方法は、インターネット全体に流れるトラフィックを減らせるだけでなく、サーバーの帯域負荷も低減できる。
一方で、毎回TCP/IPでの接続手順を繰り返すことになる為、レスポンスは低下する。
しかし!!
をHTTPヘッダーに追加すると接続を維持することができる。
Connection: Keep-Alive
英文表記そのままであるが、接続を維持せよ!という命令である。
クライアントがGETリクエストを送信する際、この指定を同時にサーバーに送り、それに対してサーバーからも"Connection: Keep-Alive"と返って来れば、接続は維持される。
接続が維持されている間は、GETなどの命令を連続で送信することができ、その都度、TCP/IPの接続が繰り返されることが起きなくなる。
また、サーバー・クライアントのいずれかが、"Connection: close"を指定するとレスポンス終了後に切断される。
【HTTP1.1】 の場合
HTTP1.1の場合、クライアント・サーバー両方がHTTP1.1対応が前提となり、1.0と違って最初からクライアント・サーバー共に"Keep-Alive"で動作する。
よって、明示的に"Connection: Keep-Alive"をヘッダーに宣言してリクエストする必要はない。
ちなみに実際には、ブラウザは"GET / HTTP/1.1"のGET命令と同時に"Connection: Keep-Alive"を送信しているケースも少なくない。
ところで…
「HTTPのバージョンの違いって?」って思ったので、調べてみた
HTTPのバージョン差異
例えば、"GET / HTTP/1.0"というリクエストに対して、"HTTP/1.1 200 OK"と返ってきた場合、サーバー側は1.1に対応していることがわかる。
では、"GET / HTTP/1.1"というリクエストに変えた方がいいのか??
答えは「NO」だ。
TCP/IPのモニタリングソフトで見ると、一部ブラウザはGET命令を"HTTP/1.0"で送信している。
HTTP通信には、下位互換があるため、1.1対応のサーバーに対して1.0でリクエストを送っても正しく動作する。
つまり、GET命令を送信する場合、クライアント側が1.1を指定する必要はないのである。
さて、ここまで書いておいて…なんだが、2015年に"HTTP/2"がすでにリリースされていて、
"HTTP1.1"から順次移行が進むと考えられる。
現時点で1.0はほぼ皆無だろう…
今回はHTTPバージョンの差異をしりたかったので、とりあえず1.0/1.1を対象にしてしまったが、
近々2.0についても勉強していきたいと思う。