Использование 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
используется в ненормальных условиях.