Роль TCP и IP в термине «TCP/IP»

"TCP/IP" - кем является TCP, а кем IP в данном случае?

Теория: что такое TCP/IP

В термине «TCP/IP» обычно имеются в виду два разных протокола стека: TCP и IP, работающие на разных уровнях и решающие разные задачи передачи данных.

Термин «TCP/IP» исторически используется как сокращение для набора протоколов Интернета и одновременно как «пара» самых известных протоколов — TCP и IP.
Формально TCP и IP — это именно протоколы (набор правил формата и обработки данных), а не «программы» и не «железо».

IP (в классическом смысле IPv4) проектировался как протокол доставки «датаграмм» (datagrams) от источника к назначению на основе адресов, без механизмов надёжности, управления потоком и упорядочивания.
Для IP характерно ограничение задачей «доставить пакет битов от источника к назначению», без добавления end-to-end надёжности, sequencing или flow control.

TCP описывается как transport-layer протокол, предоставляющий приложениям надёжный, упорядоченный, двунаправленный byte-stream.
Байтовый поток приложений переносится по сети в виде TCP-сегментов, и каждый сегмент отправляется как IP-датаграмма.

В современном Web встречаются варианты поверх IP без TCP (например, HTTP/3 поверх QUIC/UDP), но IP при этом остаётся базовой «службой доставки» между узлами, а роль TCP остаётся типичной для HTTP/1.1 и HTTP/2.

Уровни и инкапсуляция

Классическая модель TCP/IP обычно описывается 4 уровнями: linkinternettransportapplication.
IP относится к internet layer (часто также говорят «сетевой уровень»), а TCP относится к transport layer.

Ниже показана идея инкапсуляции (каждый уровень «упаковывает» данные вышестоящего уровня):

Данные приложения (например, HTTP)
        ↓
TCP:  добавляется TCP-заголовок  → получается TCP segment
        ↓
IP:   добавляется IP-заголовок   → получается IP datagram (packet)
        ↓
Link: добавляется заголовок/трейлер канального уровня → frame

Связь TCP и IP описывается напрямую: модуль TCP передаёт TCP-сегмент модулю IP как «данную часть» IP-датаграммы, а IP обеспечивает продвижение датаграммы к следующему узлу/шлюзу.
Это же формулируется как то, что TCP-сегменты отправляются как интернет-датаграммы, при этом IP-заголовок несёт адреса хостов, а TCP-заголовок содержит TCP-специфичную информацию.

Таблица ниже помогает соотнести роли (практически полезно для Web-разработки при диагностике сетевых проблем):

Уровень (TCP/IP)Ключевая задачаТип данныхПример идентификаторов
ApplicationЛогика приложения и форматы сообщенийСообщения/данные приложенияURL, HTTP-заголовки
Transport (TCP)Надёжная доставка, порядок, поток байт, мультиплексированиеTCP segmentПорты (например 443), seq/ack
Internet (IP)Адресация и доставка датаграмм между сетями, маршрутизацияIP datagramIP-адреса, TTL, поле Protocol
LinkДоставка в пределах одного канала/сегмента сетиFrameMAC-адреса (в Ethernet)
Смешение терминов «сетевой уровень» (OSI L3) и internet layer (TCP/IP) часто приводит к ошибкам в ответах: корректнее привязывать TCP к transport layer, а IP к internet layer и подтверждать это через инкапсуляцию «TCP segment внутри IP datagram».

На практике

На практике TCP проявляется как «соединение» (connection) между двумя сокетами (IP-адрес + порт), поверх которого идут HTTP/1.1 и HTTP/2, а IP проявляется как «адресация/маршрут» до удалённого узла.
Связь с IP-адресами видна даже на уровне состояния соединения: в структуре состояния хранятся локальные и удалённые IP-адреса и номера портов.

Пример на Node.js показывает, что приложение работает с TCP-сокетом (transport), а адрес назначения представлен хостом/IP и портом (internet + transport):

const net = require('net');

const server = net.createServer((socket) => {
  console.log('client connected from', socket.remoteAddress, socket.remotePort);

  socket.on('data', (buf) => {
    console.log('got bytes:', buf.length);
    socket.write('HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK');
  });

  socket.on('end', () => console.log('client disconnected'));
});

server.listen(8080, '0.0.0.0', () => {
  console.log('listening on 0.0.0.0:8080');
});

Сетевой путь «браузер → сервер» при HTTP/1.1 упрощённо выглядит так: HTTP (application) → TCP (transport) → IP (internet) → link.
Ключевой диагностический вывод: проблемы вида «соединение не устанавливается» часто относятся к TCP (таймауты, этапы установки соединения), а проблемы вида «не находится маршрут/не тот адрес/TTL» относятся к IP/маршрутизации.

Для самопроверки удобно удерживать в голове две фразы: IP не добавляет end-to-end надёжность и sequencing, а TCP предоставляет надёжный, упорядоченный byte-stream и отправляет сегменты как IP-датаграммы.

Кратко: корректная трактовка «TCP/IP» — TCP является транспортным протоколом (надёжный упорядоченный поток байт), а IP является протоколом интернет/сетевого уровня (адресация и доставка датаграмм без надёжности end-to-end).