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-сокета.