Что вызывает отправку флага TCP/IP reset (RST)?

Я пытаюсь понять, почему мое приложение TCP/IP-соединение продолжает икать каждые 10 минут (точно, в течение 1-2 секунд). Я побежал Wireshark и обнаружил, что после 10 минут бездействия другой конец отправляет пакет с установленным флагом reset (RST). Поиск Google сообщает мне: "флаг reset означает, что получатель запутался и поэтому хочет прервать соединение", но это немного меньше деталей, которые мне нужны. Что может быть причиной этого? И возможно ли, что за это отвечает какой-то маршрутизатор, или это всегда будет происходить из другой конечной точки?

Изменить: Есть маршрутизатор (в частности, Linksys WRT-54G), расположенный между моим компьютером и другой конечной точкой - есть ли что-нибудь, что я должен искать в настройках маршрутизатора?

Ответ 1

"Маршрутизатор" может делать что угодно - особенно NAT, что может включать в себя любое количество ошибок, связанных с трафиком...

Одна из причин, по которой устройство отправит RST, будет отвечать на получение пакета для закрытого сокета.

Трудно дать твердый, но общий ответ, потому что все возможные извращения были посещены на TCP с момента его создания, и всевозможные люди могут вставлять RST в попытке блокировать трафик. (Например, некоторые "национальные брандмауэры" работают, например.)

Ответ 2

Запустите пакетный сниффер (например, Wireshark) также на одноранговом узле, чтобы узнать, является ли он партнером, который отправляет RST или кто-то посередине.

Ответ 3

Я потратил довольно много времени на устранение этой проблемы. Ни одно из предлагаемых решений не работало. Оказалось, что наш системный администратор по ошибке назначил один и тот же статический IP-адрес двум несвязанным серверам, принадлежащим к разным группам, но сидящим в одной сети. Конечные результаты периодически прерывались соединениями vnc, браузер, который нужно было обновлять несколько раз, чтобы получить веб-страницу, и другие странные вещи.

Ответ 4

Некоторые брандмауэры делают это, если соединение простаивает в течение x минут. Некоторые интернет-провайдеры устанавливают свои маршрутизаторы для этого по различным причинам.

В этот день и возраст вам нужно будет изящно обрабатывать (восстанавливать при необходимости) это условие.

Ответ 5

Если маршрутизатор выполняет NAT, особенно маршрутизатор с низким доходом с небольшим количеством ресурсов, он будет стареть сначала в самых старых сеансах TCP. Для этого он устанавливает флаг RST в пакете, который эффективно сообщает принимающей станции (очень беззастенчиво) закрыть соединение. это делается для экономии ресурсов.

Ответ 6

RST отправляется стороной, выполняющей активное закрытие, потому что это сторона, которая отправляет последний ACK. Поэтому, если он получает FIN со стороны, выполняющей пассивное закрытие в неправильном состоянии, он отправляет RST-пакет, который указывает другую сторону, что произошла ошибка.

Ответ 7

Следует помнить, что многие сетевые экраны Linux netfilter неправильно настроены.

Если у вас есть что-то вроде:

-A ВПЕРЕД -m состояние --state СВЯЗАННЫЙ, УСТАНОВЛЕННЫЙ -j ПРИНЯТЬ

-A FORWARD -p tcp -j REJECT --reject-with tcp-reset

then packet reordering can result in the firewall considering the packets invalid и thus generating resets which will then break otherwise healthy connections.

затем переупорядочение пакетов может привести к тому, что межсетевой экран сочтет пакеты недействительными и, таким образом, произведет сброс, что в противном случае нарушит работоспособные соединения. Изменение порядка передачи особенно вероятно в беспроводной сети.

Вместо этого это должно быть:

-A ВПЕРЕД -m состояние --state СВЯЗАННЫЙ, УСТАНОВЛЕННЫЙ -j ПРИНЯТЬ

-A FORWARD -m состояние --state НЕДОПУСТИМО -j DROP

-A FORWARD -p tcp -j REJECT --reject-with tcp-reset

В основном, когда у вас есть:

... -m состояние --state СВЯЗАННЫЙ, УСТАНОВЛЕННЫЙ -j ПРИНЯТЬ

за ним сразу следует:

... -m состояние --state НЕДЕЙСТВИТЕЛЬНО -j DROP

Лучше отбросить пакет, чем генерировать протокол, нарушающий сброс протокола TCP. Сброс лучше, когда они, безусловно, правильная вещь для отправки... так как это устраняет таймауты. Но если есть шанс, что они недействительны, они могут причинить такую боль.