Использование TCP FIN и TCP RST

Я недавно читал о протоколе TCP, потому что мне было немного любопытно, как и почему использовались определенные флаги.

В информации, которую я обнаружил, говорится о том, что для закрытия соединения следует использовать обычное закрытие TCP FIN, но также говорится о том, что TCP RST можно использовать для аварийного закрытия активного соединения.

Мой вопрос: зачем использовать RST для прерывания / закрытия активного соединения через TCP FIN?

(Обращаясь к активному соединению как к соединению, где обе конечные точки отправляли и получали данные после стандартного трехстороннего рукопожатия. Я знаю, что RST может использоваться сервером, когда клиент отправляет SYN для порта сервера, который не прослушивает)

3 ответа

Обычно вы не видите TCP RST. Я предполагаю, что приложение на прерывании 7-го уровня может генерировать RST, но я думаю, вы обнаружите, что RST чаще всего генерируется межсетевым экраном между двумя хостами. Вот список возможных причин из руководства по TCP/IP:

Получение любого сегмента TCP от любого устройства, с которым устройство, принимающее сегмент, в настоящее время не имеет соединения (кроме SYN, запрашивающего новое соединение).

Получение сообщения с недопустимым или неправильным полем "Порядковый номер" или "Номер подтверждения", указывающим, что сообщение может принадлежать предыдущему соединению или быть поддельным каким-либо другим способом.

Получение сообщения SYN на порт, где нет процесса, прослушивающего соединения.

Некоторые веб-серверы используют RST вместо FIN для закрытия (постоянных) соединений. Это рассматривается как "оптимизация", поскольку позволяет избежать "полузакрытого" состояния и обойти некоторые проблемы с пропущенными пакетами FIN (любая дальнейшая передача просто приведет к другому RST), что в противном случае потребовало бы запоминания состояния (2xMaximum). время сегмента IIRC) дольше на стороне сервера.

Смотрите: этот документ и википедия о прекращении соединения. (Я постараюсь выкопать еще несколько интересных ссылок).

Вы также можете увидеть RST, если приложение с сокетом зависло (segfault?), Перезагрузился хост или записи таблицы NAT истекли раньше, чем само соединение!

Это крайний случай, но я нахожу это интересным:

Некоторые программы фильтрации, такие как web sense (ab), используют пакеты RST. То, что происходит, - это то, что вместо того, чтобы вебсенс сидел между всем трафиком, он перехватывает трафик по проводам. Если он видит заблокированный сайт, он подменяет пакет RST клиенту (и я думаю, что, возможно, и сервер).

Это более умный трюк, чем предполагаемое использование.

TCP - это надежный протокол. Таким образом, в любом случае сообщение не должно быть потеряно ни в одном направлении в течение полного жизненного цикла TCP-соединения. Завершение соединения является последней частью. Таким образом, TCP должен убедиться, что все пакеты были доставлены до закрытия соединения. FIN используется для корректного закрытия TCP-соединений в каждом направлении, в то время как TCP RST используется в сценарии, где TCP-соединения не могут восстановиться после ошибок, и соединение должно быть сброшено принудительно. Согласно этой статье о прекращении соединения TCP, RSET используется в ненормальных условиях.

Другие вопросы по тегам