Назад | Перейти на главную страницу

Почему telnet отправляет RSET, когда я нажимаю Ctrl-c при подключении?

Solaris 10 использует snoop для захвата пакетов.

Когда я подключаюсь по telnet к неиспользуемому IP-адресу и жду тайм-аута попытки подключения, все ведет себя так, как ожидалось (несколько раз отправляются SYN до истечения времени ожидания установления соединения, затем telnet завершает работу).

Если сделать то же самое, но отменить попытку до истечения времени ожидания, с помощью control-c последний пакет будет иметь RSET.

Это сделано по какой-то причине? Может быть, сетевой стек предполагает, что SYN были успешными, даже если SYN-ACK не вернулся, поэтому он отправляет RSET, чтобы удаленная система не оставалась полуоткрытой?

Я давно прочитал Стивенса TCP / IP Illustrated, Том 1, и я не припомню, чтобы это обсуждалось (я быстро проверил в Google, но не нашел книгу).

TCP не позволяет сеансу находиться в неоднозначном состоянии независимо от того, установлен этот сеанс или находится в процессе установления. Он должен завершить соединение или попытку соединения изящно в том смысле, что он не просто прервет соединение, не отправив ни FIN, ни RST (насколько мне известно).

Это не означает, что сеанс никогда не может находиться в неоднозначном состоянии из-за факторов, выходящих за рамки TCP, таких как неработающая ссылка, которая приводит к полуоткрытому состоянию на одном конце сеанса. С точки зрения TCP, полуоткрытое соединение - это просто соединение, которое долго простаивает (если не реализована поддержка TCP).

Как вы подозреваете - это мера на всякий случай, чтобы уведомить удаленный хост о прекращении попытки подключения; насколько известно вашей системе, хост отправил обратно SYNACK, а вы его не получили.

По сути, это «эй, удаленный хост, если ты попытался подключиться ко мне, можешь продолжить и остановиться».