Как связаны протоколы HTTP и TCP?

«Как связаны протоколы HTTP и TCP?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HTTP (Hypertext Transfer Protocol) — это протокол прикладного уровня (7-й уровень модели OSI/4-й уровень TCP/IP), который определяет формат и смысл сообщений между клиентом (браузер) и сервером. TCP (Transmission Control Protocol) — это протокол транспортного уровня (4-й уровень OSI/3-й уровень TCP/IP).

Взаимосвязь: HTTP полностью полагается на TCP для надежной передачи своих данных.

Как это работает:

  1. Клиент (например, браузер) устанавливает TCP-соединение с сервером (обычно на порт 80 для HTTP или 443 для HTTPS).
  2. Поверх установленного TCP-канала клиент отправляет HTTP-запрос в виде текстовых команд.
  3. Сервер обрабатывает запрос и отправляет обратно HTTP-ответ по тому же TCP-соединению.
  4. После завершения обмена TCP-соединение может быть закрыто (для HTTP/1.0) или использовано для новых запросов (Keep-Alive в HTTP/1.1).

Пример ручной отправки HTTP-запроса через TCP-сокет (Java):

import java.net.Socket;
import java.io.*;

public class SimpleHttpClient {
    public static void main(String[] args) throws IOException {
        // 1. Установка TCP-соединения
        Socket socket = new Socket("example.com", 80);

        // 2. Формирование и отправка HTTP-запроса поверх TCP
        OutputStream out = socket.getOutputStream();
        PrintWriter writer = new PrintWriter(out);
        writer.println("GET / HTTP/1.1");
        writer.println("Host: example.com");
        writer.println(); // Пустая строка — конец заголовков
        writer.flush();

        // 3. Чтение HTTP-ответа от сервера
        InputStream in = socket.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        // 4. Закрытие соединения
        socket.close();
    }
}

Эволюция:

  • HTTP/1.1: Может использовать одно TCP-соединение для нескольких запросов (pipelining, Keep-Alive), но страдает от Head-of-Line Blocking.
  • HTTP/2: Решает проблему HoL, вводя мультиплексирование — множество потоков HTTP-сообщений в рамках одного TCP-соединения.
  • HTTP/3: Заменяет транспортный протокол TCP на QUIC (работает поверх UDP), чтобы решить проблему HoL на транспортном уровне и ускорить установление соединения.