2016-04-08 10 views
1

現在、条件付きGETのみをサポートするために、WebサーバーにETagsを実装する可能性を検討しています。 WebサーバーはC++で書かれており、Windows OS上でのみ動作します。いくつかの調査をした後、いくつかの質問があります。この機能を実装しているサーバーは、一般的に特定のファイルのETag GUIDをキャッシュしていますか?私はあまりApacheのコードベースに精通していないが、私はap_condition_if_none_match関数を見つけることができたが、それはどのようにそれらが一致しないヘッダーのGUID値をチェックするか私には完全ではない。彼らが物事をキャッシュし、ファイルが何かをしている(つまり、ユーザーがそれを更新した)サーバー外で変更された場合、サーバーはそのキャッシュ内のファイルがもはや有効ではないことをどのように知っていますか?おそらくディレクトリの変更を監視するためにAPIを使用していますか?WebサーバーでのHTTP ETagsの実装

編集:私は、私はここで見つけるいくつかの情報見直しています:Apacheのでhttps://httpd.apache.org/docs/2.4/caching.html

答えて

2

を、ETagのは、サイズ、ファイルのiノードから構成され、最終更新時刻さ:http://httpd.apache.org/docs/2.2/mod/core.html#FileETag

さまざまなオプションがありますが、それらを構成可能にすることができます。

  1. [FASTEST OPTION]最後のファイル変更時刻を1秒より高い頻度でチェックしてください。たとえば、Windowsでは、ファイル時間は100ナノ秒の間隔で測定されます。また、Apacheのようにファイルサイズとinodeも確認してください。 Windowsでは、inodeの代わりに、GetFileInformationByHandleを介して開いているハンドルのファイルIDを問い合わせることができます。 nFileIndexHigh、nFileIndexLowを参照してください。これは64ビットのファイルIDの上位部分と下位部分です。ファイルの時間、サイズ、およびiノードが変更されている場合は、ハッシュを再計算します。
  2. [安全なオプション]ファイル時間、サイズ、およびinode以外に、Intel(SSE4.2)によって実装された非常に高速のCRC32機能を使用してファイルの内容もチェックします.SSE4.2以前のCRC32実装よりもはるかに高速です。ファイル時間またはCRC32が変更されている場合は、ハッシュを再計算します。
  3. [安全かつ安全なオプションですがハンドルを消費します]サーバーの稼働中にのみハッシュを計算します。サーバーが最初に起動するとき、ハッシュ計算は行われません。ファイルが最初に要求された場合、ハッシュを計算し、サーバーが終了するまで保存します。サーバーが実行されている間、オペレーティングシステムのファイル変更通知を使用して、(ハッシュを持つファイルの)ファイルの変更を監視します。たとえば、Widnowsでは、FindFirstChangeNotificationがあります。

ETag自体のハッシュ値については、もはやデジタル署名にとって強くなくなった暗号ハッシュ関数を推奨するでしょう。似たようなレベルの衝突に対する暗号ハッシュのような小さなダイジェストを生成しないので、暗号的に強くなるように明示的に設計されていないハッシュ関数はお勧めしません。衝突によって、私は2つの異なるファイルが同じハッシュを生成することを意味します。 MD5は、高いスピードと小さなダイジェストサイズを考慮すると、ファイル内容の変更監視には依然として非常に優れています。利用可能な最速のハッシュ関数です。たとえば、OpenSSLや、https://www.nayuki.io/page/fast-md5-hash-implementation-in-x86-assemblyhttp://blog.bfitz.us/?p=827

などのように、アセンブリで高速MD5実装を見つけることもできます
関連する問題