# Инструкция по использованию скрипта замера скорости интернета ## Описание `speed_test.sh` — это bash-скрипт для измерения скорости интернет-соединения путём последовательной загрузки файла с указанного URL. ## Требования Скрипт использует стандартные утилиты, которые обычно предустановлены в большинстве Unix-подобных систем: - `bash` — командная оболочка - `curl` — утилита для загрузки данных по URL - `bc` — калькулятор для вычислений с плавающей точкой - `awk`, `seq` — стандартные утилиты ### Установка зависимостей (если требуется) * **Ubuntu/Debian:** ```bash sudo apt-get install curl bc ``` * **macOS:** ```bash brew install curl bc ``` * **CentOS/RHEL:** ```bash sudo yum install curl bc ``` * **Fedora/RHEL:** ```bash sudo dnf install curl bc ``` * **Windows (через WSL):** ```bash sudo apt-get install curl bc ``` ## Использование ### Базовое использование ```bash bash speed_test.sh [ОПЦИИ] ``` Где `` — адрес файла для загрузки (например, большая картинка или другой файл). ### Опции - `-n, --count NUM` — Количество запросов для тестирования (по умолчанию: 10) - `-q, --quiet` — Тихий режим: выводит только скорость в МБ/с (без единиц измерения, просто число) - `-g, --gzip` — Разрешить HTTP-сжатие (gzip/deflate) для измерения эффективной скорости - `-c, --no-color` — Отключить цветной вывод (по умолчанию цвета включены) - `-h, --help` — Показать справку по использованию ### Режимы измерения #### По умолчанию (без `-g`): Реальная скорость канала Измеряет **реальную пропускную способность** интернет-канала: - Отключает HTTP-сжатие (gzip/deflate) - Показывает, сколько байт реально передаётся по сети - **Используйте для:** тестирования скорости провайдера, VPN, выбора быстрого сервера #### С опцией `-g`: Эффективная скорость Измеряет **эффективную скорость передачи данных**: - Разрешает серверу использовать HTTP-сжатие - Показывает, сколько полезных данных получено (после распаковки) - Может быть в 2-10 раз выше для текстовых данных (HTML, JSON, CSS) - **Используйте для:** оценки производительности веб-приложений, API **Тихий режим** особенно полезен для использования в других скриптах, где нужно получить только результат без дополнительного форматирования. ### Примеры Тест с использованием готового тестового файла selectel.ru (Санкт-Петербург): ```bash ./speed_test.sh https://speedtest.selectel.ru/10MB ``` Там же есть файлы других размеров, например: - 100MB: `https://speedtest.selectel.ru/100MB` - 1GB: `https://speedtest.selectel.ru/1GB` - 10GB: `https://speedtest.selectel.ru/10GB` ## Как работает скрипт 1. **Проверка аргументов**: Скрипт проверяет, что передан URL для тестирования 2. **Серия запросов**: Выполняется 10 последовательных HTTP-запросов к указанному URL 3. **Замер параметров**: Для каждого запроса измеряется: - Время выполнения (в секундах) - Объём скачанных данных (в байтах) - Скорость загрузки (в МБ/с) 4. **Вычисление средних значений**: После завершения всех запросов вычисляются: - Среднее время запроса - Общий и средний объём данных - **Средняя скорость интернет-соединения в МБ/с** ### Вывод скрипта #### Обычный режим Скрипт выводит: - **Цветной заголовок** (можно отключить через `--no-color`) - Информацию о каждом отдельном запросе с ✓ зелёной галочкой (время, объём, скорость) - Итоговую статистику: - Количество выполненных запросов - Общее и среднее время - Общий и средний объём данных - **Среднюю скорость в МБ/с** #### Тихий режим (`-q` или `--quiet`) В тихом режиме скрипт выводит **только одно число** — среднюю скорость в МБ/с без единиц измерения. Это полезно для: - Использования результата в других скриптах. - Автоматизации тестирования. - Сравнения разных серверов, CDN и VPN-подключений. - Логирования результатов. Пример: ```bash $ ./speed_test.sh -q -n 2 https://speedtest.selectel.ru/10MB 2.40 ``` ### Пример вывода ```text ============================================== Замер скорости интернета ============================================== URL: http://speedtest.ftp.otenet.gr/files/test10Mb.db Количество запросов: 10 ============================================== Запрос 1/10... OK (11.039670s, 10.00 МБ, .90 МБ/с) Запрос 2/10... OK (127.344702s, 10.00 МБ, .07 МБ/с) ... Запрос 10/10... OK (3.832720s, 10.00 МБ, 2.60 МБ/с) ============================================== Результаты измерения ============================================== Выполнено запросов: 10 Общее время: 192.026102 сек Среднее время запроса: 19.2026 сек Общий объём данных: 100.00 МБ Средний объём на запрос: 10.00 МБ ============================================== СРЕДНЯЯ СКОРОСТЬ: .52 МБ/с ============================================== ``` ## Рекомендации по выбору URL для тестирования Для точного измерения скорости интернета рекомендуется: 1. **Размер файла**: Используйте файлы размером от 5 МБ до 100 МБ - Слишком маленькие файлы (< 1 МБ) дадут неточные результаты - Слишком большие файлы (> 100 МБ) увеличат время тестирования 2. **Стабильный сервер**: Выбирайте серверы с хорошей пропускной способностью - Speedtest-серверы - CDN-сервисы (Cloudflare, Akamai) - Известные хостинги изображений 3. **Географическая близость**: Для более точных результатов выбирайте серверы в вашем регионе ### Рекомендуемые тестовые файлы **Selectel Speedtest (Россия):** ```bash # 10 МБ файл (быстро, хорошо для частых тестов) ./speed_test.sh -n 5 https://speedtest.selectel.ru/10MB # 100 МБ файл (рекомендуется для точных измерений) ./speed_test.sh https://speedtest.selectel.ru/100MB # 1000 МБ (1 ГБ) файл (для очень стабильных каналов) ./speed_test.sh -n 3 https://speedtest.selectel.ru/1000MB ``` **Примечание:** Для больших файлов (100 МБ+) рекомендуется использовать меньшее количество запросов (2-5) для экономии времени и трафика. ## Устранение неполадок ### Ошибка: "curl: command not found" **Решение**: Установите curl (см. раздел "Установка зависимостей") ### Ошибка: "bc: command not found" **Решение**: Установите bc (см. раздел "Установка зависимостей") ### Ошибка: "Не удалось выполнить запрос" **Возможные причины:** - Неверный или недоступный URL - Отсутствие интернет-соединения - Сервер не отвечает или перегружен - Файл был удалён **Решение**: Проверьте URL и подключение к интернету ### Очень низкая скорость **Возможные причины:** - Медленный сервер источника - Проблемы с вашим интернет-соединением - Высокая загрузка сети **Решение**: Попробуйте другой URL или проверьте соединение ## Технические детали ### Единицы измерения - **МБ (мегабайт)** = 1 048 576 байт (1024 × 1024) - Скрипт измеряет скорость в **МБ/с** (мегабайтах в секунду) - Это отличается от **Мбит/с** (мегабит в секунду), которые часто используют провайдеры - **Конверсия**: 1 МБ/с ≈ 8 Мбит/с ### Метод расчёта Средняя скорость вычисляется как: ``` Средняя скорость = (Общий объём данных в МБ) / (Общее время в секундах) ``` Этот метод даёт более точную картину реальной пропускной способности при последовательных запросах. ### Защита от искажения результатов и режимы измерения **Проблема с HTTP-сжатием:** Многие веб-серверы используют gzip/deflate сжатие для экономии трафика. Это создаёт две разные метрики скорости: 1. **Реальная скорость канала** — сколько байт фактически передаётся по сети 2. **Эффективная скорость** — сколько полезных данных получено после распаковки #### Режим по умолчанию: Реальная скорость канала Без опции `-g` скрипт измеряет **реальную пропускную способность** вашего интернет-канала: - **Что делает:** Добавляет HTTP-заголовок `Accept-Encoding: identity` - **Эффект:** Запрещает серверу отправлять сжатые данные - **Измеряет:** Реальный объём байт, переданных по сети - **Используйте для:** - Тестирования скорости интернет-провайдера - Сравнения VPN-серверов - Выбора быстрого CDN или зеркала - Диагностики проблем с каналом **Пример:** ```bash ./speed_test.sh -n 5 https://speedtest.selectel.ru/10MB # Результат: 2.5 МБ/с — реальная скорость вашего канала ``` #### Режим с опцией `-g`: Эффективная скорость С опцией `-g` скрипт измеряет **эффективную скорость** передачи данных: - **Что делает:** Разрешает серверу использовать gzip/deflate сжатие - **Эффект:** Сервер сжимает данные перед отправкой, браузер распаковывает - **Измеряет:** Объём полезных данных после распаковки - **Может быть выше в 2-10 раз** для текстовых файлов (HTML, JSON, CSS, JS) - **Используйте для:** - Оценки производительности веб-приложений - Тестирования API с JSON-ответами - Понимания реальной скорости работы сайтов **Пример:** ```bash ./speed_test.sh -g -n 5 https://www.wikipedia.org/ # Результат: 15.0 МБ/с — эффективная скорость с учётом сжатия # (реальный канал 2.5 МБ/с, но благодаря gzip получили данных в 6 раз больше) ``` #### Сравнение режимов Файл `compare_modes.sh` демонстрирует разницу: ```bash ./compare_modes.sh https://example.com/ ``` **Типичные результаты:** - **Бинарные файлы** (изображения, видео, архивы): разницы почти нет - **Текстовые данные** (HTML, JSON, XML): эффективная скорость в 3-10 раз выше - **Speedtest-файлы** (специально не сжимаются): режимы дают одинаковый результат **Вывод:** Используйте режим по умолчанию для честного замера скорости интернета. Используйте `-g` для оценки реальной производительности веб-приложений. ## Модификация скрипта Вы можете легко изменить параметры в начале скрипта: ```bash # Изменить количество запросов (по умолчанию 10) NUM_REQUESTS=20 # Добавить таймаут для curl (например, 30 секунд) curl --max-time 30 -s -o /dev/null ... # Использовать другой метод HTTP (по умолчанию GET) curl -X POST ... ``` ## Использование в автоматизации ### Пример: Поиск лучшего сервера В проекте включён пример скрипта `compare_servers.sh`, который показывает, как использовать тихий режим для сравнения скорости разных серверов: ```bash ./compare_servers.sh ``` Этот скрипт: 1. Тестирует список серверов 2. Использует `speed_test.sh -q` для получения скорости каждого 3. Находит и выводит самый быстрый сервер Вы можете адаптировать этот пример для: - Выбора лучшего VPN-сервера - Тестирования разных CDN - Мониторинга скорости интернета по расписанию - Логирования производительности сети ## Лицензия Скрипт предоставляется "как есть" для образовательных целей. ## Автор: Sergei Erjemin (+Claude Sonnet 4.5 mini через CoPilot) Создано как решение тестового задания для вакансии "Python-разработчик" в "Интерактивное агентство 'Это Легко'".