Почему я вижу пакет RST, ACK вместо пакета RST?
В Wireshark я часто вижу, что потоки TCP заканчиваются пакетом RST, ACK вместо пакета RST. Кто-нибудь знает, почему это?
Пример того, что я вижу:
SYN SYN, ACK ...данные... RST, ACK
Wireshark не собирает пакет RST до пакета RST, ACK.
2 ответа
A RST /ACK не является подтверждением RST, так же как SYN /ACK не является точно подтверждением SYN. Установление TCP фактически является четырехсторонним процессом: инициирующий узел отправляет SYN принимающему хосту, который отправляет ACK для этого SYN. Принимающий хост отправляет SYN на инициирующий узел, который отправляет ACK обратно. Это устанавливает связь с состоянием.
SYN -->
<-- ACK
<-- SYN
ACK -->
Чтобы сделать это более эффективным, принимающий хост может ACK SYN и отправить свой собственный SYN в тот же пакет, создав трехсторонний процесс, который мы привыкли видеть.
SYN -->
<-- SYN/ACK
ACK -->
В случае RST /ACK устройство подтверждает, какие данные были отправлены в предыдущем пакете (-ях) в последовательности с ACK, а затем уведомляет отправителя, что соединение закрыто с RST. Устройство просто объединяет два пакета в один, как SYN /ACK. RST /ACK обычно не является нормальным ответом при закрытии сеанса TCP, но это также не обязательно указывает на проблему.
После установления соединения все пакеты должны иметь ACK и соответствовать порядковому номеру полученных пакетов для надежного транспорта /безопасности. RST без ACK не будет приниматься. Когда одна сторона отправляет RST, сокет немедленно закрывается, и принимающая сторона также закрывает сокет сразу после получения действительного RST. Он не должен быть и не может быть подтвержден.
после рукопожатия TCP
A ---> B Syn = x, Ack = y, len = z, флаг ACK
B ---> A Syn = y, Ack = x + z, len = o, флаг ACK
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 бит
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, иначе приемник прерывает соединение и переходит в состояние ЗАКРЫТО. Если приемник был в любом другом состоянии, он прерывает соединение и советует пользователю и переходит в состояние ЗАКРЫТО.