Co powoduje wysłanie flagi resetowania TCP / IP (RST)?

123

Próbuję dowiedzieć się, dlaczego połączenie TCP / IP mojej aplikacji przerywa czkawkę co 10 minut (dokładnie w ciągu 1-2 sekund). Uruchomiłem Wiresharka i odkryłem, że po 10 minutach bezczynności drugi koniec wysyła pakiet z ustawioną flagą resetowania (RST). Wyszukiwarka Google mówi mi, że „flaga RESET oznacza, że ​​odbiorca jest zdezorientowany i chce przerwać połączenie”, ale brakuje mi szczegółów, których potrzebuję. Co może być tego przyczyną? I czy to możliwe, że jakiś router po drodze jest za to odpowiedzialny, czy też zawsze będzie to pochodzić z innego punktu końcowego?

Edycja: Między moim komputerem a drugim punktem końcowym znajduje się router (w szczególności Linksys WRT-54G) - czy jest coś, czego powinienem szukać w ustawieniach routera?

Łukasz
źródło
13
Oto kolejny: Comcast
Tom Ritter
1
Na szczęście nie jestem zależny od Comcast, ponieważ dzieje się to w sieci LAN. Chciałbym móc tak łatwo zrzucić winę;)
Luke
Czy kiedykolwiek to rozgryzłeś? Nie mogę komentować, ponieważ nie mam wystarczającej liczby punktów, ale mam dokładnie ten sam problem, co ty i szukam rozwiązania.
Jakiej usługi dotyczy ten konkretny przypadek? Możliwe jest ustawienie utrzymywania aktywności w gnieździe (z poziomu aplikacji), więc długie okresy bezczynności nie powodują, że ktoś (w środku lub nie) próbuje wymusić reset połączenia z powodu braku zasobów.
arielf
Mówisz "Comcast"? : D Sprawdź to powiązane repozytorium: github.com/tylertreat/comcast
joonas.fi

Odpowiedzi:

89

`` Router '' może robić wszystko - szczególnie NAT, co może wiązać się z dowolną ilością błędów w ruchu ...

Jednym z powodów, dla których urządzenie wyśle ​​RST, jest odpowiedź na odebranie pakietu dla zamkniętego gniazda.

Trudno jest udzielić jednoznacznej, ale ogólnej odpowiedzi, ponieważ każda możliwa perwersja była odwiedzana na TCP od samego początku, a wszyscy ludzie mogą wstawiać RST, próbując zablokować ruch. (Na przykład niektóre „krajowe zapory ogniowe” działają w ten sposób).

Will Dean
źródło
6
Albo router ma 10-minutowy limit czasu dla połączeń TCP, albo router ma włączoną funkcję „inteligentnego wykrywania pakietów bramy”.
David Schwartz,
2
Sugerowanie, że router może być obciążony błędami, jest trochę bogate.
Markiz Lorne
23

Uruchom sniffer pakietów (np. Wireshark) również na peerze, aby sprawdzić, czy to peer wysyła RST, czy ktoś w środku.

Alexander
źródło
14

Właśnie spędziłem trochę czasu na rozwiązywaniu tego właśnie problemu. Żadne z proponowanych rozwiązań nie zadziałało. Okazało się, że nasz sysadmin przez pomyłkę przypisał ten sam statyczny adres IP do dwóch niepowiązanych ze sobą serwerów należących do różnych grup, ale znajdujących się w tej samej sieci. Efektem końcowym były sporadyczne zerwane połączenia vnc, przeglądarka, która musiała być kilkakrotnie odświeżana, aby pobrać stronę internetową i inne dziwne rzeczy.

OutputLogic
źródło
7

Niektóre firewalle robią to, jeśli połączenie jest bezczynne przez x liczbę minut. Niektórzy usługodawcy internetowi ustawiają swoje routery w taki sposób również z różnych powodów.

W dzisiejszych czasach będziesz musiał z wdziękiem poradzić sobie z tym stanem (w razie potrzeby przywrócić go).

Brian Knoblauch
źródło
2
Połączenie zostaje przywrócone w porządku, problem polega na tym, że krótki okres rozłączenia powoduje niepotrzebne ostrzeżenie.
Luke
1
Miałem problemy szczególnie ze sprzętem Cisco PIX / ASA. Mają szczególnie krótkie limity czasu jako domyślne. Tańszy sprzęt jest zwykle pod tym względem „lepszy” (ponieważ nie ma czasu
Brian Knoblauch
1
Dodałbym nawet, że protokół TCP nigdy nie był całkowicie niezawodny z punktu widzenia trwałych połączeń. Po prostu od czasu do czasu staje się bardziej zauważalne. Kolejny interesujący przykład: niektórzy ludzie mogą zaimplementować logikę, która oznacza klienta TCP jako offline, gdy tylko zostanie wykryte zamknięcie połączenia lub reset. Czasami nie zadają sobie trudu, aby dać klientowi szansę na ponowne połączenie. To oczywiście nie jest całkowicie poprawne.
Victor Yarema
7

RST jest wysyłany przez stronę wykonującą aktywne zamknięcie, ponieważ jest to strona, która wysyła ostatnie ACK. Więc jeśli otrzyma FIN od strony wykonującej pasywne zamknięcie w złym stanie, wysyła pakiet RST, który wskazuje drugiej stronie, że wystąpił błąd.

Vishal gupta
źródło
6
Obie strony wysyłają i odbierają FIN w normalnym zamknięciu. Nie ma nic złego w tej sytuacji, a zatem nie ma powodu, aby jedna strona przeprowadzała reset. Pierwsze zdanie nawet nie ma sensu.
Markiz Lorne
2
[RST, ACK] może być również wysłane przez stronę odbierającą SYN na porcie, którego nie słuchasz. W przypadku, na który natknąłem się, RST / ACK nastąpiło około 60 sekund po pierwszym SYN. FWIW
Les
@MarquisofLorne, pierwsze zdanie samo w sobie może zostać potraktowane jako nieprawidłowe. Ale fraza „w złym stanie” w drugim zdaniu czyni ją w jakiś sposób słuszną.
Victor Yarema
7

Jeśli istnieje router wykonujący NAT, zwłaszcza router niskiej jakości z niewielką liczbą zasobów, najpierw starzeje najstarsze sesje TCP. Aby to zrobić, ustawia RSTw pakiecie flagę, która skutecznie nakazuje stacji odbierającej (bardzo niezręcznie) zamknięcie połączenia. ma to na celu oszczędzanie zasobów.

MKII
źródło
3

Należy pamiętać, że wiele firewalli netfilter w Linuksie jest źle skonfigurowanych.

Jeśli masz coś takiego:

-A FORWARD -m stan - stan ZWIĄZANY, USTANOWIONY -j AKCEPTUJ

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

wtedy zmiana kolejności pakietów może skutkować uznaniem przez zaporę sieciową pakietów za nieważne, a tym samym generowaniem resetów, które następnie przerywają zdrowe połączenia.

Zmiana kolejności jest szczególnie prawdopodobna w przypadku sieci bezprzewodowej.

Zamiast tego powinno to być:

-A FORWARD -m stan - stan ZWIĄZANY, USTANOWIONY -j AKCEPTUJ

-A FORWARD -m stan --state INVALID -j DROP

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

Zasadniczo zawsze, gdy masz:

... -m stan - stan ZWIĄZANY, USTANOWIONY -j AKCEPTUJ

zaraz po nim powinno następować:

... -m stan --state NIEPRAWIDŁOWY -j DROP

Lepiej jest porzucić pakiet, a następnie wygenerować potencjalnie zakłócający protokół reset tcp. Resetowanie jest lepsze, gdy można udowodnić, że jest właściwą rzeczą do wysłania ... ponieważ eliminuje to limity czasu. Ale jeśli jest jakakolwiek szansa, że ​​są niepełnosprawni, mogą powodować tego rodzaju ból.

Labirynt
źródło
0

Dzieje się tak, ponieważ w sieci istnieje inny proces wysyłający RST do połączenia TCP.

Zwykle RST zostanie wysłany w następującym przypadku

  • Proces zamyka gniazdo, gdy gniazdo używające opcji SO_LINGER jest włączone
  • System operacyjny czyści zasoby, gdy proces kończy pracę bez zamykania gniazda.

W twoim przypadku brzmi to tak, jakby proces łączył twoje połączenie (port IP +) i nadal wysyła RST po ustanowieniu połączenia.

Ben
źródło