← 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.

КритерийTCPUDP
СоединениеДаНет
ReliabilityACK + retransmitНет
УпорядочиваниеДаНет
Congestion controlДа (RFC 5681)Нет (на стороне приложения)
Размер заголовка20–60 байт8 байт
ПрименениеHTTP, SSH, SMTPDNS, VoIP, видео, QUIC

ICMP (RFC 792)

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

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

TypeСообщениеНазначение
0Echo ReplyОтвет ping
3Destination UnreachableХост/порт/сеть недостижимы
8Echo RequestЗапрос ping
11Time ExceededTTL истёк
5RedirectСменить шлюз

Для 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

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

УтилитаНазначение
pingICMP Echo
traceroute / mtrПуть по hop-ам
ss (или netstat)Сокеты и состояния TCP
digDNS
ipИнтерфейсы, маршруты, neigh
curlHTTP/HTTPS
tcpdump / wiresharkЗахват трафика

Сокеты (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).

Типы

ТипКонстантаТранспортПрименение
StreamSOCK_STREAMTCPHTTP, SSH
DatagramSOCK_DGRAMUDPDNS, VoIP
RawSOCK_RAWIP/ICMPping, custom protocols (требует CAP_NET_RAW)
PacketAF_PACKET + SOCK_RAW/SOCK_DGRAML2tcpdump, IDS

Жизненный цикл 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