Докачка через прокси: Range, ETag и проверка целостности
Безопасно возобновляем загрузку и не склеиваем части разных версий файла после смены ETag.

Безопасно возобновляем загрузку и не склеиваем части разных версий файла после смены ETag. Материал WorldProxy написан заново после сверки пяти нормативных и официальных источников. Каждый вывод привязан к отдельному наблюдаемому этапу, а стенд использует только собственные или явно разрешённые системы.
Основная идея
Range позволяет запросить часть representation, а If-Range связывает продолжение с validator. Если файл изменился, сервер должен вернуть целую новую версию вместо диапазона старой; простое совпадение имени и размера недостаточно.
В статье «Докачка через прокси: Range, ETag и проверка целостности» важно не приписывать протоколу свойства сервиса. Стандарт описывает формат сообщений и обязательное поведение сторон, а коммерческий продукт отдельно определяет географию, ротацию, срок и поддерживаемые команды. Чёткое разделение помогает понять, почему одна программа принимает строку подключения, а другая требует отдельные поля или вообще не поддерживает нужный режим.
Что подтверждает первичный источник
Безопасно возобновляем загрузку и не склеиваем части разных версий файла после смены ETag.
Первичный источник «RFC 9110 — Range Requests, RFC 9111 — HTTP Caching, RFC 9530 — Digest Fields, MDN Range, MDN If-Range» задаёт техническую основу, но не описывает конфигурацию каждого клиента и поставщика. Читайте нормативную формулировку рядом с датой и версией документа, затем подтверждайте поведение в своей программе. Если интерфейс обещает больше, чем источник, помечайте это как свойство продукта, которое нужно проверить отдельно.
Практический стенд
Разместите 12 MiB псевдослучайный файл и публикуйте ETag, Accept-Ranges и Content-Digest. Скачайте первые 4 MiB, сохраните метаданные и возобновите. После успешного digest замените содержимое при том же размере. Старый If-Range обязан привести к полному 200, а итоговый файл — совпасть только с новым digest.
Проверка шаг за шагом
Создайте неизменяемый тестовый файл с известным digest, прервите загрузку на точной границе и продолжите с Range плюс сильным ETag. Затем замените файл и ETag, сохранив URL, и повторите старый If-Range.
Начните с матрицы возможностей: схема адреса, TCP или UDP, локальное или удалённое разрешение DNS, способ авторизации и поддержка IPv6. Заполняйте её по документации клиента и прокси, а не по названию настройки. Затем проверяйте по одной возможности на собственном endpoint, начиная с простого TCP-запроса и только потом добавляя DNS, TLS и прикладной сценарий.
При сбое сохраните границу, на которой он возник: разбор адреса, выбор метода авторизации, открытие туннеля, TLS или ответ origin. Коды разных уровней нельзя складывать в одну категорию. Ошибка SOCKS, отказ HTTP CONNECT и статус 403 конечного сайта требуют разных действий, хотя пользователь во всех трёх случаях видит неоткрывшуюся страницу.
- Зафиксировать validator и digest
- Прервать на известной границе
- Возобновить с If-Range
- Заменить файл и проверить полный ответ
Какие данные сохранить
Храните URL без токенов, ETag, Last-Modified, Range, status, Content-Range, полученные байты и итоговый digest. Промежуточные файлы отмечайте версией.
Полезная трассировка содержит протокол и версию, команду клиента, адрес назначения в обезличенном виде, код ответа посредника и код origin. Для DNS отдельно указывайте, кто разрешал имя. Пакетный дамп используют только на тестовом стенде и очищают от полезной нагрузки; для большинства разборов достаточно подробного лога клиента без реквизитов.
Сразу задайте имена колонок отчёта и формат времени. Результат без контекста быстро превращается в догадку: неизвестно, какой адрес использовался, был ли кэш и что изменилось. Сохраняйте не только успех, но и контролируемые отказы. Они доказывают, что проверка действительно различает состояния, а не всегда рисует зелёный индикатор.
Как читать результат
Правильный клиент различает 206, 200 и 416, проверяет Content-Range и итоговый digest. Proxy cache не должен соединять несовместимые части; при сомнительном validator безопаснее скачать representation заново.
Не все ресурсы поддерживают ranges, слабый ETag непригоден для If-Range, а сжатое представление может иметь другой диапазон и validator.
Один успешный запуск подтверждает только конкретную комбинацию клиента, маршрута и времени. Для устойчивого вывода повторите опыт, изменяя одну переменную, и укажите границы. Если наблюдение расходится с документацией, сначала исключите кэш, версию программы и промежуточный сервер, а затем сформулируйте воспроизводимый пример для поддержки.
Разбор рабочего решения
В практическом разборе «Докачка через прокси: Range, ETag и проверка целостности» заведите матрицу из строк «возможность» и столбцов «стандарт», «прокси-сервис», «клиент» и «проверено». Например, удалённый DNS может быть предусмотрен форматом SOCKS5, поддерживаться сервисом, но не включаться конкретной библиотекой. Только пересечение четырёх столбцов даёт рабочую функцию. Ссылка на RFC без проверки клиента и зелёный ответ клиента без понимания протокола одинаково недостаточны.
Снимайте минимальную трассу, которая отвечает на вопрос. Для HTTP CONNECT обычно нужны адрес посредника, строка назначения, код посредника, состояние TLS и код origin. Для SOCKS добавьте команду, тип адреса и код ответа. Для DNS укажите, где разрешилось имя. Эти данные позволяют отличить синтаксическую ошибку от запрета политики и сетевого таймаута, не сохраняя полезную нагрузку, cookies или пароль.
После успешного опыта проверьте границы совместимости: вторую версию клиента, один альтернативный формат адреса и контролируемый отказ. Результаты занесите в таблицу поддержки продукта. Не превращайте единичное наблюдение в обещание для всех программ. Если функция зависит от версии, платформы или режима DNS, это должно быть написано рядом с примером подключения, а не спрятано в ответе поддержки.
Типичные ошибки
Распространённые ошибки — путать SOCKS5 с шифрованием, ожидать UDP от любого клиента, записывать IPv6 без квадратных скобок рядом с портом и считать HTTP/2 гарантией ускорения. Проверяйте конкретную реализацию. Даже предусмотренная стандартом команда может быть сознательно отключена сервисом или библиотекой.
Остановитесь, если растёт доля ошибок, источник вернул ограничение, результат требует обхода защиты или в журнал попали секреты. Сначала сохраните обезличенную диагностику и устраните причину. Смена IP или увеличение параллельности в такой точке скрывает проблему и может создать лишнюю нагрузку вместо полезных данных.
Критерии внедрения и сопровождение
Перед внедрением сформулируйте критерий решения: какое наблюдение разрешает продолжить работу, какое требует ручной проверки, а какое немедленно останавливает процесс. Укажите допустимый процент ошибок, максимальное время ожидания и владельца исключения. Без этих границ команда начинает объяснять одинаковый результат по-разному, а временный сбой незаметно превращается в постоянную настройку.
Через неделю после запуска проверьте, совпадают ли фактическая нагрузка, расходы и качество с тестом. Затем назначьте регулярный малый контроль и повторную проверку после обновления клиента, прокси-сервиса или сетевой схемы. Устаревшую инструкцию архивируйте вместе с датой и причиной замены, чтобы сотрудники не использовали две конфликтующие конфигурации.
Рабочий регламент
Превратите удачный опыт в короткий регламент: кто запускает, где лежит безопасная конфигурация, какие лимиты действуют и когда работа должна остановиться. Проверка должна завершаться конечным статусом, а не бесконечной попыткой. После обновления браузера, библиотеки или сетевой схемы запускайте малый контроль до основной очереди.
- Названа версия протокола
- Проверены возможности клиента
- DNS-маршрут указан отдельно
- Различены прокси и origin-коды
- Тест начат с минимального запроса
- Неподдерживаемая функция не обещана пользователю
Источники
Материал написан заново редакцией WorldProxy. Ссылки ведут на первичные документы, использованные для проверки фактов.
Подберите прокси для своей задачи
Сравните типы прокси и откройте список всех стран. Наличие и цена выбранного варианта проверяются перед добавлением в корзину.