Я недавно читал о протоколе TCP, потому что мне было немного любопытно, как и почему используются определенные флаги.
В информации, которую я обнаружил, говорится о нормальном закрытии TCP FIN, который следует использовать для закрытия соединения, но затем также говорится о том, что TCP RST может использоваться для аварийного закрытия активного соединения.
У меня вопрос: зачем использовать RST для прерывания / закрытия активного соединения с использованием TCP FIN?
(Имеется в виду активное соединение как соединение, при котором обе конечные точки отправляют и получают данные после стандартного трехстороннего рукопожатия. Я знаю, что сервер может использовать RST, когда клиент отправляет SYN для порта сервера, который не прослушивает)
Обычно вы не видите TCP RST. Я полагаю, что приложение на уровне 7 прерывания может генерировать RST, но я думаю, вы обнаружите, что RST чаще всего генерируется межсетевым экраном между двумя хостами. Вот список возможных причин из Руководство по TCP / IP:
Получение любого сегмента TCP от любого устройства, с которым устройство, получающее сегмент, в настоящее время не имеет соединения (кроме SYN, запрашивающего новое соединение).
Получение сообщения с недопустимым или неправильным полем порядкового номера или номера подтверждения, указывающего, что сообщение может принадлежать предыдущему соединению или является ложным иным образом.
Получение SYN-сообщения на порт, где нет процессов, ожидающих подключения.
Некоторые веб-серверы используют RST вместо FIN для закрытия (постоянных) соединений. Это рассматривается как «оптимизация», поскольку позволяет избежать «полузакрытого» состояния и обойти некоторые проблемы с пропущенными пакетами FIN (любая дальнейшая передача просто приведет к другому RST), которые в противном случае потребовали бы запоминания состояния (2xMaximum время сегмента IIRC) на стороне сервера дольше.
Видеть: Эта бумага и википедия о прекращении соединения. (Я тоже попробую откопать еще несколько интересных ссылок).
Вы также можете увидеть RST, если приложение с сокетом упало (segfault?), Хост перезагрузился или записи таблицы NAT истекли до того, как произошло само соединение!
Это крайний случай, но я считаю его интересным:
Некоторое программное обеспечение для фильтрации, такое как web sense (ab), использует пакеты RST. Что происходит, так это то, что вместо того, чтобы сидеть между всем трафиком, WebSense перехватывает трафик с сети. Если он видит заблокированный сайт, он подделывает RST-пакет клиенту (и я думаю, что, возможно, и серверу).
Это скорее хитрый трюк, чем предполагаемое использование.
TCP - надежный протокол. Поэтому в любом случае сообщение не должно быть потеряно в любом направлении в течение полного жизненного цикла TCP-соединения. Завершение соединения - последняя часть. Поэтому TCP должен убедиться, что все пакеты были доставлены, прежде чем закрывать соединение. FIN
используется для корректного закрытия TCP-соединений в каждом направлении, а TCP RST
используется в сценарии, когда TCP-соединения не могут восстановиться после ошибок, и соединение необходимо принудительно сбросить. Согласно этому статья о прекращении TCP-соединения, RSET
используется в ненормальных условиях.