Что означает «сброс соединения по пиру»?

649

Что означает ошибка «сброс соединения по одноранговой сети» в TCP-соединении? Является ли это фатальной ошибкой или просто уведомлением или связано с сетевым сбоем?

Франк Фрайбургер
источник

Ответы:

772

Это смертельно. Удаленный сервер отправил вам пакет RST, который указывает на немедленное прекращение соединения, а не на обычное рукопожатие. Это обходит нормальный переход полузамкнутого состояния. Мне нравится это описание :

«Сброс соединения по одноранговому узлу» - это TCP / IP-эквивалент сброса телефона на крючок. Это более вежливо, чем просто не отвечать, оставляя одного повешенным. Но это не FIN-ACK, ожидаемый от действительно вежливого конвертера TCP / IP.

ire_and_curses
источник
49
Почему он помечен как «сброс соединения по одноранговому узлу»? Похоже, это должно быть «сброс соединения по хосту» или «сброс соединения по серверу»
Robert
27
@ Роберт, потому что вот откуда произошел сброс. Узел отправил пакет RST.
маркиз Лорн
106
... Роберт, твоя забота не имеет смысла для меня. Пир просто более общий, чем этот. В типичной модели клиент-сервер сервер также может легко получить это уведомление от «клиента». Машина, которая первоначально запрашивает соединение, имеет столько же мощности для отправки этого уведомления. На уровне TCP это выглядит идентично, когда соединение продолжается. Обе машины при общении просто равны.
Codetaku
9
Эта упаковка могла быть отправлена ​​другим устройством посередине, как маршрутизатор?
Арнольд Роа
3
Его нельзя назвать «сбросом соединения сервером», поскольку он может быть отправлен клиентом или сервером. Это не может быть «обойдено». Если клиент получает эту ошибку, это означает, что TCP-соединение больше не открыто на сервере, например, после сбоя сервера и его перезапуска.
Йоханнес Оверманн
193

Это означает, что был получен TCP RST, и теперь соединение закрыто. Это происходит, когда пакет отправляется с вашего конца соединения, но другой конец не распознает соединение; он отправит обратно пакет с установленным битом RST, чтобы принудительно закрыть соединение.

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

Это зависит от вас, является ли это ошибкой; если информация, которую вы отправляли, была предназначена только для удаленного клиента, то, возможно, не имеет значения, что какие-либо окончательные данные могли быть потеряны. Однако вы должны закрыть сокет и освободить любые другие ресурсы, связанные с соединением.

mark4o
источник
11
Если вы устанавливаете опцию сокета SO_LINGER в ноль при открытии нового сокета, а затем закрываете его как обычно, бит RST будет установлен. Таким образом, ВСЕ соединение закончится сбросом. Не пытайтесь делать это дома, это просто раздражает. stackoverflow.com/questions/3757289
Крис Хуан-Ливер
1
Как решить эту проблему, нужно ли перезагружать и удаленный, и наш хост?
user2225190
3
@ user2225190 Вам необходимо повторно подключить клиент, но сначала вам нужно проверить свое программное обеспечение, чтобы убедиться, что оно не из-за ошибки протокола приложения, то есть закрытие соединения, к которому другой конец все еще пишет.
маркиз Лорн
1
Спасибо за ваш комментарий. Раньше работал два месяца. Я также пытаюсь сделать это из командной строки, но все равно получаю эту ошибку. Я пытаюсь "sftp user @ machine". Ошибка не соответствует.
user2225190