Зачем был придуман протокол TCP?

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

Ответ

TCP (Transmission Control Protocol) был разработан как решение фундаментальных проблем передачи данных в ненадежных сетях, таких как ранний интернет (ARPANET). Базовый протокол IP обеспечивает только адресацию и маршрутизацию пакетов, но не гарантирует их доставку, целостность или порядок. TCP добавляет поверх IP уровень надежности и управления соединением.

Ключевые проблемы, которые решает TCP:

  1. Надежная доставка (Reliability). Пакеты могут теряться, искажаться, дублироваться или приходить в неправильном порядке из-за перегрузок сети и особенностей маршрутизации. TCP использует:

    • Последовательные номера (Sequence Numbers) для каждого байта данных.
    • Подтверждения (Acknowledgements, ACK) от получателя отправителю.
    • Таймауты и повторные передачи (Retransmission) потерянных пакетов. Это гарантирует, что все байты будут доставлены получателю в правильном порядке и без потерь.
  2. Управление потоком (Flow Control). Получатель может быть перегружен и не успевать обрабатывать входящие данные. TCP использует механизм скользящего окна (Sliding Window): получатель сообщает отправителю размер доступного буфера (окно), и отправитель не может послать данных больше, чем позволяет это окно. Это предотвращает "затопление" (overwhelming) получателя.

  3. Управление перегрузкой (Congestion Control). TCP динамически подстраивает скорость отправки данных, чтобы не перегружать саму сеть. Алгоритмы (например, Slow Start, Congestion Avoidance) уменьшают размер окна при обнаружении потерь пакетов (сигнал о перегрузке) и постепенно увеличивают его при успешной доставке.

  4. Установление и завершение соединения. TCP — это протокол с установлением соединения (connection-oriented). Перед обменом данными происходит трехэтапное рукопожатие (3-way handshake: SYN, SYN-ACK, ACK) для синхронизации начальных номеров последовательностей и параметров. Для корректного завершения используется четырехэтапное рукопожатие (FIN, ACK, FIN, ACK).

Практическое значение: Благодаря TCP такие приложения, как веб-браузеры (HTTP/HTTPS), клиенты электронной почты (SMTP, IMAP), удаленные терминалы (SSH) и многие другие, могут работать, не заботясь о потере пакетов или их порядке. Все это берет на себя стек TCP/IP операционной системы.

Пример на PHP (работа с TCP-сокетом):

// Создание TCP-сокета
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("Не удалось создать сокет: " . socket_strerror(socket_last_error()));
}

// Установка соединения с сервером (происходит TCP handshake)
$connected = socket_connect($socket, 'example.com', 80);
if ($connected === false) {
    die("Не удалось подключиться: " . socket_strerror(socket_last_error($socket)));
}

// Отправка HTTP-запроса (TCP разобьет данные на сегменты, обеспечит доставку)
$request = "GET / HTTP/1.1rnHost: example.comrnConnection: closernrn";
socket_write($socket, $request, strlen($request));

// Чтение ответа (TCP соберет сегменты в правильном порядке)
$response = '';
while ($buf = socket_read($socket, 1024)) {
    $response .= $buf;
}

// Закрытие соединения
socket_close($socket);

echo $response;

Без TCP разработчикам пришлось бы самостоятельно реализовывать всю логику надежности для каждого сетевого приложения, что крайне сложно и неэффективно.