Как только соединение установлено, все пакеты должны иметь установленный ACK и соответствовать порядковому номеру полученных пакетов для надежной транспортировки / безопасности. RST без ACK не будут приняты. Когда одна сторона отправляет RST, сокет немедленно закрывается, и принимающая сторона также закрывает сокет сразу после получения действительного RST. Это не должно быть и не может быть признано.
после TCP рукопожатия
A ---> B Syn = x, Ack = y, len = z, ACK Flag
B ---> A Syn = y, Ack = x + z, len = o, ACK Flag
A ---> B Syn = x + z, Ack = y + o, len = p, ACK Flag
B ---> A Syn = y + o, ACK = x + z + p, len = q, RST, ACK Flag
B закрывает сокет после отправки последнего пакета, а A закрывает сокет после его получения.
(без учета окна TCP здесь, или может быть больше пакетов от одного конца до подтверждения)
Флаг ACK, номер подтверждения и процедура подтверждения связаны, но не одно и то же.
Согласно RFC793
RFC793
Номер подтверждения: 32 бита
If the ACK control bit is set this field contains the value of the
next sequence number the sender of the segment is expecting to
receive. Once a connection is established this is always sent.
Сбросить Обработка
Во всех состояниях, кроме SYN-SENT, все сегменты сброса (RST) проверяются путем проверки их полей SEQ. Сброс действителен, если его порядковый номер находится в окне. В состоянии SYN-SENT (RST, полученный в ответ на начальный SYN), RST является приемлемым, если поле ACK подтверждает SYN.
Получатель RST сначала проверяет его, а затем изменяет состояние. Если получатель находился в состоянии LISTEN, он игнорирует его. Если получатель находился в состоянии SYN-RECEIVED и ранее находился в состоянии LISTEN, то получатель возвращается в состояние LISTEN, в противном случае получатель прерывает соединение и переходит в состояние ЗАКРЫТО. Если получатель находился в каком-либо другом состоянии, он прерывает соединение, сообщает пользователю и переходит в состояние ЗАКРЫТО.