ネットワーク

Qt での HTTP におけるキャッシュについて

Published Friday May 20th, 2011 | Leave a comment
Posted in リサーチプロジェクト | Tags: ,

この記事は Qt Blog の “HTTP caching with Qt” を翻訳したものです。 執筆: Peter Hartmann 2011年4月29日 この記事では HTTP のキャッシュ が一般的にどのように動作するのかと、Qt ではどうなっているのかを詳細に解説します。 HTTP のキャッシュとは? ブラウザがウェブページを読み込む際には様々なリソース(HTML ページ、画像、CSS スクリプト等)がローカルに保存されます。これは同じリソースが再度読み込まれる際に、それをネットワークから再度取得する代わりにローカルに保存されたものを再利用できるかもしれないからです。これはにいくつかの利点があります。 高速化: キャッシュからリソースを読み込むことでネットワークから取得するのに比べて大幅に時間を短縮できます。 オフラインでの読み込み: ネットワークに繋がっていなくてもページを表示できる可能性があります。 読み込みを減らす: キャッシュやプロキシからリソースを読み込むことでサーバーへの負荷を減らすことができます。 この記事では、リソースがキャッシュから読み込める場合とリソースをネットワークから取得しなければならない場合の判断方法について取り扱います。 HTTP プロトコルにおけるキャッシュの働き HTTP でキャッシュが行われる一般的な流れは次のようになります。クライアント(通常はブラウザ)が “HTTP GET” で最初のリソースのリクエストを行います。この要求時には、一般的にはキャッシュ情報は送られません。サーバーは “HTTP 200 OK” のメッセージと共にデータを返します。この返信時に、クライアント側がキャッシュを制御するためのヘッダをいくつか追加します。これについて見ていきましょう。 有効期限: サーバーがクライアントのリクエストに応答する際には、そのリソースがディスクにキャッシュ可能かどうかの情報と、可能な場合には、クライアントがそのリソースを次に読み込む際にどのくらいの期間キャッシュからの読み込みが有効なのかについての情報を送ります。別の言い方をすると、サーバーはクライアントにキャッシュ内のリソースがいつ失効し、再度ネットワークから読み込む必要があるかを伝えます。サーバーやプロキシによって送られる有効期限の情報に関する HTTP のヘッダは以下の通りです(不完全ですが)。 Expires: サーバーはクライアントにそのリソースが失効する日時を伝えます。例: “Expires: Fri, 29 Apr 2011 09:22:59 GMT“ Cache-Control: […]

Read More

QNetworkAccessManager での HTTP のスレッド化

Published Monday May 2nd, 2011 | Leave a comment
Posted in リサーチプロジェクト | Tags: , ,

この記事は Qt Blog の “Threaded HTTP inside QNetworkAccessManager” を翻訳したものです。 執筆: Markus Goetz 2011年4月29日 みなさん、こんにちは。Markus です。これは Labs での私の初めての記事になります 🙂 少し前に QNetworkAccessManager が HTTP リクエストを別スレッドで動かすための変更を加えました。これについての詳細を求める声があったため、この記事を書きました 🙂 この背景には(WebKit1 をベースにした) QtWebKit の動作が関係します。ウェブブラウザは基本的にとても多くの処理を行います。HTML や CSS の解釈、JPEG や PNG の画像データの表示可能な形式へのデコード、ページのレイアウト、ユーザーからの入力への反応、素晴らしい Web 2.0(もう 3.0?)の世界の Javascript の実行などが必要です。 ネットワークの処理がブラウザ内で同じスレッドで動作している場合、上記の処理の実行中にはネットワークの処理は先に進みません。ネットワークをトレースしたところ、”synchronization points” と呼ばれる現象が起こっていました。これは QtWebKit がメインスレッドでビジー状態にありイベントループをブロックしているため、ネットワークのリクエストが送られないという現象です。最悪なケースでは HTTP サーバーが データの送信を停止します。特に、通常のデスクトップ PC よりも処理能力が低くネットワークのレイテンシが高い場合にこの傾向は強くなります(モバイル端末の世界へようこそ!)。 これに対する解決策はいくつかあります。 QtWebKit を別スレッドに移し、ネットワークをユーザースレッドに残す QNetworkAccessManager 全体を別スレッドに移す QNetworkAccessManager […]

Read More
Get started today with Qt Download now