Почему telnet отправляет RSET, когда я контролирую -c при подключении?
Solaris 10 использует snoop для захвата пакетов.
Когда я подключаюсь по telnet к неиспользуемому IP-адресу и жду, пока истечет время ожидания попытки подключения, все будет работать как положено (SYNs отправляются несколько раз, пока не истекло время установления соединения, а затем telnet завершает работу).
Когда вы делаете то же самое, но отменяете попытку до истечения времени ожидания, с помощью control-c последний пакет имеет RSET.
Это сделано по причине? Может быть, сетевой стек предполагает, что SYN были успешными, даже если SYN-ACK не вернулся, поэтому он отправляет RSET, чтобы сохранить удаленную систему наполовину открытой?
Я давно читал Stevens TCP/IP Illustrated, том 1, и я не помню, чтобы это обсуждалось (я проверил быстрый Google, но не выкопал книгу).
2 ответа
TCP не позволяет сеансу находиться в неоднозначном состоянии, независимо от того, установлен этот сеанс или находится в процессе его установки. Он должен завершить соединение или изящную попытку соединения в том смысле, что он не просто прервет соединение, не отправив FIN или RST (насколько я знаю).
Это не означает, что сеанс никогда не может находиться в неоднозначном состоянии из-за факторов, не относящихся к сфере TCP, таких как неработающая связь, которая вызывает полуоткрытие на одном конце сеанса. С точки зрения TCP, полуоткрытое соединение - это просто соединение, которое долго не используется (если не реализовано сохранение активности TCP).
Как вы подозреваете - это просто на всякий случай уведомление удаленного хоста об отмене попытки подключения; насколько известно вашей системе, хост отправил обратно SYNACK, а вы его не получили.
It's basically a "hey, remote host, if you tried to connect back to me, you can go ahead and stop".