コンピュータが何らかの情報を取得する必要がある場合、ネットワーク リクエストは一般的に考えられる最も遅いソースの 1 つです。私の理解では、一般的に次のとおりです。
- ネットワーク アクセスはディスクよりもはるかに遅い
- ディスク アクセスは RAM よりもはるかに遅い
- RAM アクセスは CPU レジスタよりもはるかに遅い
私の質問は次のとおりです。ネットワーク アクセスが平均してディスクよりもはるかに遅いのはなぜですか。
明らかに、これは常に正しいとは限りません。同じ部屋にあるサーバーへの非常に高速なネットワーク接続と、低速のハード ドライブがある可能性があります。しかし、この質問の目的のために、平均的なユーザーがウェブをサーフィンしていると想像してください。ディスクからデータを読み取る方が、Google から同じデータを取得するよりも高速です。
たとえば、HTTP リクエストに関連すると考えられる部分のいくつかは次のとおりです。
- IP の DNS ルックアップ
- TCP 接続を確立するためのスリーウェイ ハンドシェイク
- パケット化: HTTP 要求を TCP パケットに分割し、必要なすべてのカウンターとチェックサムなどを使用して、それらを IP パケットに入れます。
- 伝送: 電気信号がワイヤを移動するのに必要な時間
- ルーティング: ルーター内で行われる意思決定、バッファリングなど
- 処理: サーバーによる応答の定式化
- 欠落したパケットの再送信を含む、応答のすべての送信とルーティング
- TCP パケットの内容を順序付けて組み立て、HTTP 応答をクライアントに返す
主要な手順を見逃している場合は、お知らせください。
これらの手順のうち、サーバーの処理を無視して (実際にはネットワークの問題ではありません)、特に遅い部分はありますか? それらのいずれかが、ネットワーク リクエストに内在する遅延の大部分を占めていますか?
更新: いくつかの数字
平均的な DNS ルックアップには 60 ~ 120 ミリ秒かかり、その後、TCP ハンドシェイクを実行するための完全なラウンドトリップ (RTT) が続きます。これにより、リクエストを送信する前に 100 ~ 200 ミリ秒のレイテンシが発生します。
- 出典: Chrome Networking: DNS Prefetch & TCP Preconnect by Ilya Grigorik, Developer Advocate, Google