Все зависит от TCP, базового протокола HTTP. TCP работает так, что данные отправляются в сегментах. Всякий раз, когда клиент отправляет сегмент на сервер, среди отправленных данных есть информация о том, сколько дополнительных данных он готов получить. Это обычно соответствует некоторому буферу со стороны клиента. Когда клиент получает некоторые данные, он также отправляет сегмент на сервер, подтверждая полученные данные.
Итак, если клиент очень медленно обрабатывает полученные данные, последовательность событий может выглядеть следующим образом:
- Соединение установлено, клиенты говорят, сколько данных оно готово получить.
- Сервер отправляет один или несколько сегментов клиенту, общее количество данных в них не превышает того количества, которое клиент сказал, что готов получить
- Клиент говорит серверу: я получил данные, которые вы мне отправили, но пока не отправляю меня.
- Клиент обрабатывает некоторые данные.
- Клиент говорит серверу: Вы можете отправить мне еще x байтов данных
Что это значит в отношении GetResponse()
? Когда вы вызываете GetResponse()
, клиент отправляет запрос, читает HTTP-заголовок ответа (который обычно помещается в один сегмент, но может быть больше) и возвращает результат. На этом этапе, если вы не начинаете читать поток ответов (который вы получаете, вызывая GetResponseStream()
), некоторые данные с сервера принимаются, но только для заполнения буфера. Когда он заполнен, данные больше не передаются, пока вы не начнете читать поток ответов.