Ответ
Скорость соединения можно приблизительно измерить, засекая время загрузки файла известного размера с сервера. Однако этот метод имеет погрешности и ограничения браузера.
Базовый алгоритм на JavaScript:
async function measureNetworkSpeed(fileUrl, fileSizeInBytes) {
const startTime = performance.now();
try {
const response = await fetch(fileUrl, { cache: 'no-store' }); // Отключаем кеш
const reader = response.body.getReader();
let receivedLength = 0;
while (true) {
const { done, value } = await reader.read();
if (done) break;
receivedLength += value.length;
}
const endTime = performance.now();
const durationInSeconds = (endTime - startTime) / 1000;
// Расчет скорости в Mbps (мегабитах в секунду)
const speedMbps = (fileSizeInBytes * 8) / (durationInSeconds * 1_000_000);
return { speedMbps, durationInSeconds };
} catch (error) {
console.error('Measurement failed:', error);
return null;
}
}
// Использование: файл 5 МБ
measureNetworkSpeed('https://example.com/test.bin', 5 * 1024 * 1024);
Важные ограничения и лучшие практики:
- Точность размера: Сервер должен отдавать
Content-Lengthзаголовок, или размер должен быть заранее известен. - Кеширование: Обязательно используйте
cache: 'no-store'или добавляйте уникальный параметр к URL. - Погрешности: На результат влияет задержка (ping), TCP slow start, и ограничение скорости самим браузером.
- Надежность: Для production-измерений лучше использовать специализированные сервисы (Speedtest by Ookla, librespeed) или нативные API (например,
NetworkInformationAPI, который предоставляет теоретическую скорость, но не фактическую).