Я только что провел тест с Wireshark. Когда я вызвал urllib2.urlopen («url-for-a-700mbyte-file»), сразу были получены только заголовки и несколько пакетов тела. Только когда я позвонил read (), большая часть тела попала в сеть. Это соответствует тому, что я вижу, читая исходный код модуля httplib.
Итак, чтобы ответить на исходный вопрос, urlopen () не получает все тело по сети. Он извлекает заголовки и обычно некоторые тела. Остальная часть тела извлекается при вызове read ().
Частичное извлечение тела следует ожидать, потому что:
Если вы не читаете HTTP-ответ по одному байту за раз, невозможно точно узнать, какой длины будут входящие заголовки, и, следовательно, невозможно узнать, сколько байтов нужно прочитать до начала тела.
http-клиент не контролирует, сколько байтов сервер объединяет в каждый tcp-кадр ответа.
На практике, поскольку некоторые тела обычно извлекаются вместе с заголовками, вы можете обнаружить, что маленькие тела (например, небольшие HTML-страницы) целиком извлекаются при вызове urlopen ().