← Back to notes

TCP, UDP, ICMP
и сокеты


TCP vs UDP

TCP (RFC 9293) — connection-oriented, reliable. Three-way handshake (SYN SYN+ACK ACK), порядковые номера, ACK, retransmit, sliding window, congestion control (RFC 5681). Закрытие через FIN/ACK и TIME-WAIT.

UDP (RFC 768) — connectionless, без подтверждений и упорядочивания. Заголовок 8 байт. Checksum опциональна для IPv4 (можно передать 0), обязательна для IPv6 (RFC 8200). Доставка best-effort.


ICMP (RFC 792)

ICMP передаёт служебные сообщения IP-уровня. Не транспорт для прикладных данных.

Основные типы (IPv4):

Для IPv6 — ICMPv6 (RFC 4443), несёт ND, MLD, RA.

ping 8.8.8.8

TTL и traceroute

Поле TTL в IPv4-заголовке — 8-битное unsigned (0–255, RFC 791). В IPv6 называется Hop Limit (RFC 8200, тоже 8 бит). Каждый роутер декрементирует на 1; при достижении 0 пакет дропается и источнику отправляется ICMP Time Exceeded.

Traceroute эксплуатирует это: отправляет пробы с возрастающим TTL (1, 2, 3 …), собирая адреса роутеров из ICMP-ответов. Реализации:

  • Linux traceroute по умолчанию — UDP с большими портами (33434+); конечный хост отвечает Destination Unreachable (Port Unreachable).
  • Windows tracert и traceroute -I — ICMP Echo; конечный хост отвечает Echo Reply.
  • traceroute -T — TCP SYN на указанный порт (часто 80/443).
1  192.168.1.1   1.3 ms   0.9 ms   1.0 ms
2  10.0.0.1      7.2 ms   6.9 ms   7.1 ms
3  8.8.8.8      18.5 ms  18.3 ms  18.6 ms

Сетевые утилиты


Сокеты (BSD sockets API, POSIX.1-2017)

Сокет — endpoint для I/O через сеть. Идентифицируется 5-tuple для установленного TCP:

(protocol, local_ip, local_port, remote_ip, remote_port)

Для listening-сокета — 3-tuple (protocol, local_ip, local_port).

Типы

Жизненный цикл TCP-сервера

socket()  bind()  listen()  accept()  recv()/send()  close()

Клиент: socket() connect() send()/recv() close().

В Linux сокет — file descriptor, поэтому работают read()/write(), epoll(), io_uring.

WebSocket

WebSocket (RFC 6455) — прикладной протокол поверх TCP, инициируется через HTTP Upgrade: websocket. Это не отдельный тип POSIX-сокета.


Источники

TCP, UDP, ICMP и сокеты | Aleksandr Suprun