TCP: рукопожатие и флаги
Three-way handshake, sequence numbers, флаги SYN/ACK/FIN/RST и за счёт чего TCP надёжен.
Зачем соединению рукопожатие
TCP гарантирует, что байты дойдут целиком и в порядке отправки. Для этого каждая сторона нумерует свои данные: каждый байт в потоке имеет sequence number. Прежде чем слать данные, стороны должны обменяться начальными номерами и подтвердить их. Этот обмен и есть three-way handshake.
клиент серверу
SYN, seq=x -------------> "хочу соединение, мой номер x"
<------- SYN-ACK, seq=y, ack=x+1 "принял, мой номер y"
ACK, ack=y+1 -------------> "принял твой номер"
Три шага: SYN от клиента, SYN-ACK от сервера, ACK от клиента. После этого соединение установлено (ESTABLISHED) и данные ходят в обе стороны.
Состояния соединений видно на сервере:
$ ss -tan | head -4
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
ESTAB 0 0 10.0.0.5:80 203.0.113.7:51742
SYN-RECV 0 0 10.0.0.5:80 198.51.100.9:40118
Много зависших SYN-RECV — признак, что клиенты шлют SYN и пропадают
(так выглядит SYN flood).
Флаги
Флаги — биты в заголовке TCP-сегмента, которые задают его смысл:
SYN: синхронизация sequence numbers, открытие соединения;ACK: поле подтверждения значимо (стоит почти на всех сегментах);FIN: данных от отправителя больше не будет, вежливое закрытие;RST: сброс, соединение рвётся немедленно и без прощаний.
Закрытие бывает двух видов. Нормальное: обмен FIN в обе стороны, всё
недосланное доезжает. Аварийное: RST, буферы выбрасываются. RST в ответ на
SYN означает «порт закрыт», поэтому curl мгновенно падает с
Connection refused, а не висит.
Надёжность
Получатель подтверждает принятые байты номером ack. Если подтверждение не пришло за отведённое время, отправитель шлёт сегмент повторно (retransmission). Потерянный пакет превращается в задержку, а не в потерю данных.
Ретрансмиссии видно в статистике:
$ nstat -az TcpRetransSegs
TcpRetransSegs 63441 0.0
nstat из пакета iproute2 — современная замена netstat -s из net-tools:
net-tools давно не развивается, на минимальных образах его просто нет.
Постоянный рост этого счётчика говорит о плохом канале: пакеты теряются, TCP их дошлёт, но со штрафом по скорости.
Что важно запомнить
Handshake: SYN -> SYN-ACK -> ACK, после него соединение ESTABLISHED.
Каждый байт потока пронумерован (sequence number), приём подтверждается ack, неподтверждённое переотправляется.
FIN закрывает соединение вежливо, RST сбрасывает его мгновенно; RST на SYN означает закрытый порт.
ss -tan показывает состояния соединений; зависшие SYN-RECV сигналят о
проблеме.
В следующем уроке — UDP: транспорт без соединения и без гарантий.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
Как устанавливается TCP-соединение?
NET-006Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс