← Сеть: основы
12 мин · средне · Урок 7 из 13

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-сегмента, которые задают его смысл:

Закрытие бывает двух видов. Нормальное: обмен 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: транспорт без соединения и без гарантий.

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

Как устанавливается TCP-соединение?

NET-006

Прошли материал до конца? Отметьте урок пройденным.