Короче говоря, да, заголовки идут первыми. Всегда.
Как вы упоминаете, запрос HEAD позволит клиенту извлекать только заголовки и никакого содержимого, однако с помощью запроса GET заголовки всегда доступны и поступают до фактического содержимого. , Однако поле длины содержимого является необязательным для динамического содержимого, поэтому оно может быть недоступно.
В зависимости от вашей реализации, пар может быть, а может и не буферизоваться вообще. Но в большинстве случаев при чтении через потоковые операторы вы получаете контент в небольшом буферизованном блоке, обычно в строке.