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.
| Критерий | TCP | UDP |
|---|---|---|
| Соединение | Да | Нет |
| Reliability | ACK + retransmit | Нет |
| Упорядочивание | Да | Нет |
| Congestion control | Да (RFC 5681) | Нет (на стороне приложения) |
| Размер заголовка | 20–60 байт | 8 байт |
| Применение | HTTP, SSH, SMTP | DNS, VoIP, видео, QUIC |
ICMP (RFC 792)
ICMP передаёт служебные сообщения IP-уровня. Не транспорт для прикладных данных.
Основные типы (IPv4):
| Type | Сообщение | Назначение |
|---|---|---|
| 0 | Echo Reply | Ответ ping |
| 3 | Destination Unreachable | Хост/порт/сеть недостижимы |
| 8 | Echo Request | Запрос ping |
| 11 | Time Exceeded | TTL истёк |
| 5 | Redirect | Сменить шлюз |
Для 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
Сетевые утилиты
| Утилита | Назначение |
|---|---|
ping | ICMP Echo |
traceroute / mtr | Путь по hop-ам |
ss (или netstat) | Сокеты и состояния TCP |
dig | DNS |
ip | Интерфейсы, маршруты, neigh |
curl | HTTP/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).
Типы
| Тип | Константа | Транспорт | Применение |
|---|---|---|---|
| Stream | SOCK_STREAM | TCP | HTTP, SSH |
| Datagram | SOCK_DGRAM | UDP | DNS, VoIP |
| Raw | SOCK_RAW | IP/ICMP | ping, custom protocols (требует CAP_NET_RAW) |
| Packet | AF_PACKET + SOCK_RAW/SOCK_DGRAM | L2 | tcpdump, 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-сокета.