Заглядывая в Wireshark, я часто вижу, что потоки TCP заканчиваются пакетом RST, ACK вместо пакета RST. Кто-нибудь знает, почему это?
Пример того, что я вижу:
SYN SYN, ACK ... данные ... RST, ACK
Wireshark не принимает пакет RST до пакета RST, ACK.
Ответы:
RST / ACK не является подтверждением RST, так же как SYN / ACK не является точно подтверждением SYN. Установление TCP на самом деле является четырехсторонним процессом: инициирующий хост отправляет SYN принимающему хосту, который отправляет ACK для этого SYN. Принимающий хост отправляет SYN инициирующему хосту, который отправляет ACK обратно. Это устанавливает состояние связи.
Чтобы сделать это более эффективным, принимающий хост может ACK SYN и отправить свой собственный SYN в том же пакете, создавая трехсторонний процесс, который мы привыкли видеть.
В случае RST / ACK устройство подтверждает, что все данные были отправлены в предыдущем пакете (ах) в последовательности с ACK, и затем уведомляет отправителя о том, что соединение закрыто с RST. Устройство просто объединяет два пакета в один, как SYN / ACK. RST / ACK обычно не является нормальным ответом при закрытии сеанса TCP, но он также не обязательно указывает на проблему.
источник
RST ACK
ответов на фальшивый адрес источника.Как только соединение установлено, все пакеты должны иметь установленный 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
Номер подтверждения: 32 бита
Сбросить Обработка
Во всех состояниях, кроме SYN-SENT, все сегменты сброса (RST) проверяются путем проверки их полей SEQ. Сброс действителен, если его порядковый номер находится в окне. В состоянии SYN-SENT (RST, полученный в ответ на начальный SYN), RST является приемлемым, если поле ACK подтверждает SYN.
Получатель RST сначала проверяет его, а затем изменяет состояние. Если получатель находился в состоянии LISTEN, он игнорирует его. Если получатель находился в состоянии SYN-RECEIVED и ранее находился в состоянии LISTEN, то получатель возвращается в состояние LISTEN, в противном случае получатель прерывает соединение и переходит в состояние ЗАКРЫТО. Если получатель находился в каком-либо другом состоянии, он прерывает соединение, сообщает пользователю и переходит в состояние ЗАКРЫТО.
источник