これは素晴らしい質問です。これまで、ブラウザからクライアントの速度を推定する手法に出くわしたことはありません。ただし、アイデアはあります。これについては数分しか考えていませんが、いくつかのアイデアが得られることを願っています. また、私の冗長性を許してください:
まず、クライアント/サーバーのパフォーマンスを扱う際には、スループットとレイテンシーという 2 つの点を考慮する必要があります。一般に、モバイル クライアントは、デスクトップ クライアントと比較して帯域幅が低くなります (したがって、スループットが低くなります)。さらに、モバイル クライアントの接続はエラーが発生しやすく、待ち時間が長くなる可能性があります。ただし、私の限られた経験では、レイテンシーが高いからといってスループットが低いわけではありません。逆に言えば、レイテンシーが低いからといってスループットが高いわけではありません。
したがって、レイテンシとスループットを区別する必要がある場合があります。クライアントが各 HTTP リクエストでタイムスタンプ (「A」としましょう) を送信し、サーバーが単純にそれをエコー バックするとします。クライアントは、返されたこのタイムスタンプを現在の時刻から差し引いて、リクエストが往復するのにかかった時間を見積もることができます。この時間には、ネットワーク遅延や、サーバーがリクエストを完全に受信するまでにかかった時間など、ほぼすべてが含まれます。
ここで、サーバーが応答本文全体を送信する前に、最初に応答ヘッダーでタイムスタンプ "A" を送り返すとします。また、サーバーの応答をインクリメンタルに読み取ることができると仮定します (例: ノンブロッキング IO。これにはさまざまな方法があります)。これは、サーバーの応答を読み取る前に、エコーされたタイムスタンプを取得できることを意味します。この時点で、クライアント時間「B」からリクエストのタイムスタンプ「A」を差し引いた値が、レイテンシの概算です。これをクライアント時間「B」とともに保存します。
応答の読み取りが完了したら、応答本文のデータ量を新しいクライアント時間「C」から前のクライアント時間「B」を差し引いた値で割った値が、スループットの概算になります。たとえば、C - B = 100ms で、100kb のデータを読み取ったとすると、スループットは 10kb/s になります。
ここでも、モバイル クライアント接続はエラーが発生しやすく、時間の経過とともに強度が変化する傾向があります。したがって、おそらくスループットを 1 回テストする必要はありません。実際、すべての応答のスループットを測定し、クライアントのスループットの移動平均を維持することもできます。これにより、1 つの要求で異常に悪いスループットが原因でクライアントの品質が低下する可能性が低くなり、逆の場合も同様です。
この方法が機能する場合は、クライアントが取得するコンテンツを決定するためのポリシーを決定するだけです。たとえば、「低品質」モードで開始し、一定期間クライアントのスループットが十分に高い場合は、高品質のコンテンツにアップグレードできます。その後、スループットが低下した場合は、低品質にダウングレードします。
編集:いくつかのことを明確にし、スループットの例を追加しました。