Ответ
TCP (Transmission Control Protocol) — это протокол транспортного уровня, который поверх ненадежного IP обеспечивает надежный, упорядоченный и проверенный на ошибки поток байтов. Его основные требования и механизмы:
-
Установление соединения (3-way handshake): Гарантирует, что обе стороны готовы к обмену данными перед его началом.
Клиент -> Сервер: SYN (seq=x) Сервер -> Клиент: SYN-ACK (seq=y, ack=x+1) Клиент -> Сервер: ACK (seq=x+1, ack=y+1) Соединение установлено. -
Надежная доставка и подтверждение (ACK): Каждый полученный сегмент должен быть подтвержден (ACK). Если отправитель не получает ACK в течение таймаута, сегмент отправляется повторно.
-
Упорядочивание (Sequence Numbers): Каждому байту в потоке присваивается порядковый номер. Получатель собирает сегменты в правильном порядке, даже если они пришли в сети в другом.
-
Контроль потока (Flow Control - Sliding Window): Предотвращает "переполнение" получателя. Получатель сообщает отправителю размер своего "окна" — сколько байт он готов принять без подтверждения. Это динамически регулирует скорость отправки.
-
Управление перегрузками (Congestion Control): Предотвращает перегрузку сети. Алгоритмы (как Reno или CUBIC) эмпирически определяют доступную пропускную способность, начиная с медленного старта (slow start), и адаптируют размер окна перегрузки (congestion window). При обнаружении потерь пакетов (дублирующие ACK или таймаут) окно уменьшается.
-
Контрольная сумма (Checksum): Проверяет целостность заголовка и данных. Поврежденные сегменты отбрасываются и не подтверждаются, что инициирует повторную передачу.
Пример из практики DevOps: При настройке высоконагруженных сервисов (например, балансировщика HAProxy или веб-сервера Nginx) мы тонко настраиваем параметры ядра Linux, связанные с TCP (net.ipv4.tcp_keepalive_time, net.ipv4.tcp_max_syn_backlog, net.core.somaxconn), чтобы оптимизировать поведение TCP-стеков под конкретную нагрузку и снизить задержки.