1. Предыстория:
- Постоянные проблемы соединения: Для непостоянных соединений браузер может определить границы запрашивающей или ответной сущности в зависимости от того, отключилось ли соединение; Для непрерывных соединений этот подход, очевидно, не работает. Иногда, даже если я отправил все данные, браузер не знает, будут ли новые данные по открытому соединению, поэтому просто ждёт.
- Решите с помощью Content-length: вычислите длину сущности и сообщите другой стороне через голову. Браузер может определить, что ответная сущность находится по данным о длине Content-Length
- Новая проблема с длиной содержания: поскольку поле Content-Length должно действительно отражать длину сущности, длина для динамически сгенерированного контента неизвестна до момента создания контента. На данный момент, чтобы точно определить длину, можно открыть достаточно большой буфер и дождаться, пока весь контент будет сгенерирован, прежде чем вычислять. Однако это требует большего расхода памяти с одной стороны, а с другой — заставляет клиента ждать дольше.
- Нам нужен новый механизм, который не зависит от длины заголовка и знает границы сущностей — Transfer-Encoding: chunked.
2. Кодирование передачи (на части)
- Кодирование передачи — это поле заголовка HTTP (поле заголовка ответа), что буквально означает «кодирование передачи». Последняя HTTP-спецификация определяет только один тип кодирующего транспорта: фрагментированный.
- Кодирование передачи частей — это механизм передачи данных в протоколе передачи гипертекста (HTTP), который позволяет разделять HTTP-данные, отправляемые веб-сервером клиенту, на несколько частей. Кодирование блочного транспорта доступно только в версии протокола HTTP 1.1 (HTTP/1.1).
- Данные разбиваются на серию блоков и отправляются одним или несколькими блоками, чтобы сервер мог отправлять данные без предварительного звания общего объёма отправленного контента.
Специфические методы
- После добавления Transfer-Encoding: chunked в заголовок это означает, что пакет фрагментирован. В этом случае сущности в пакете должны передаваться серией чанков.
- Каждый фрагмент содержит шестеричное значение длины и данные, значение длины эксклюзивно для одной строки, и длина не включает CRLF в её конце, а также CRLF в конце фрагментированных данных.
- Последнее значение длины блока должно быть 0, и соответствующие данные блока не содержат содержимого, указывая на конец сущности.
asp.net Основной тестовый код:
|