Czy muszę pulsować, aby utrzymać otwarte połączenie TCP?

96

Mam dwa komponenty, które komunikują się przez TCP / IP. Składnik A działa jako serwer / odbiornik, a składnik B jest klientem. Obaj powinni komunikować się tak szybko, jak to możliwe. W dowolnym momencie może istnieć tylko jedno połączenie (choć to nie dotyczy tego pytania). Starszy programista w mojej firmie powiedział, że muszę używać pulsów na poziomie aplikacji między dwoma komponentami, aby zapewnić, że połączenie pozostanie otwarte.

Myślałem, że połączenie pozostaje otwarte przez TCP / IP, ale przeczytałem wiele blogów / witryn, mówiąc, że jest to dość standardowa praktyka, aby pulsować między tymi aplikacjami.

Wiem, po części, dlaczego komponent A pulsuje komponentem B, więc może informować pomoc techniczną o problemach z komunikacją z komponentem B (albo łącze jest wyłączone, albo komponent B nie działa). Czy bicie serca jest potrzebne z innego powodu? Żeby zapewnić, że często coś jest „w rurze”, co spowoduje, że będzie otwarta?

Składnik A obecnie bije składnik B co 20 sekund i zamyka połączenie, jeśli nic nie zostanie odebrane ze składnika B w ciągu 120 sekund. Następnie wznawia nasłuchiwanie połączeń przy założeniu, że składnik B będzie okresowo próbował ponownie nawiązać połączenie, jeśli łącze zostanie zerwane. To działa pomyślnie.

Powtarzam moje pytanie: czy bicie serca jest niezbędne do utrzymania aktywnego połączenia TCP / IP?

Rob Grey
źródło
1
Czy to zachowanie może być również zależne od implementacji? Czy jest to określone w standardzie TCP, czy też jest to szczegół implementacji? Miejmy nadzieję, że ktoś inny też może na to odpowiedzieć.
dss539
1
Powiedziałbym, że jest to szczegół implementacji, ponieważ nie wszystkie protokoły oparte na TCP / IP implementują takie rozwiązanie, które pozostawia się wyłącznie tobie.
Lloyd
5
Tak - nie ze względu na TCP / IP - ale z powodu innego sprzętu lub oprogramowania, przez które połączenie może przechodzić, na przykład przez zapory sieciowe i domowe
``

Odpowiedzi:

55

Połączenie powinno pozostać otwarte bez względu na to, ale tak, często zdarza się, że protokoły implementują bicie serca, aby pomóc wykryć martwe połączenia, na przykład IRC z poleceniem PING .

Lloyd
źródło
34
Innym częstym powodem utrzymywania aktywności jest utrzymywanie otwartego połączenia przez bramy NAT. Chociaż sam TCP nie potrzebuje do działania funkcji keepalives, często zdarza się, że bramy nat „przerywają” połączenie TCP po określonym czasie.
nr
4
Co to jest normalny limit czasu? sekundy, minuty, godziny?
MiniGod
@Lloyd „Myślę”, że MiniGod miał na myśli „Jak długo będzie normalny limit czasu?” (odpowiedź udzielona w sekundach, minutach, godzinach…)
jeromej
@JeromeJ Kto wie, minęło już kilka lat;)
Lloyd
Ponadto, jeśli połączenie przechodzi przez serwer proxy, możesz spodziewać się zerwania połączenia, jeśli zostanie uznane za nieaktualne. Nie wydaje mi się jednak, żeby w tym przypadku pomogło by utrzymać przy życiu, ponieważ ten aspekt tcp nie przenosi się do aplikacji.
Ghita
50

Jak wielu innych zauważyło, połączenie TCP pozostanie aktywne, jeśli zostanie pozostawione jego własnym urządzeniom. Jeśli jednak masz urządzenie w środku połączenia, które śledzi swój stan (takie jak zapora), możesz potrzebować funkcji utrzymywania aktywności, aby zapobiec wygaśnięciu wpisu tabeli stanu.

Gerald Combs
źródło
Połączenie TCP powie, że żyje na zawsze?
user7817808
24

Jeśli twoje komponenty:

  • znajdują się w konwencjonalnej sieci przewodowej
  • nie ma między nimi żadnych zapór ani routerów NAT
  • żaden z nich się nie rozbija

wtedy nie musisz mieć bicia serca.

Jeśli którekolwiek z tych założeń jest fałszywe (patrzę na ciebie, GPRS!), Bicie serca staje się konieczne dość szybko.

Eero Aaltonen
źródło
1
Jest to jednak ogólnie rzecz biorąc sieciowanie. Rozważmy błędy Petera Deutscha dotyczące obliczeń rozproszonych; Wiemy, że sieci są z natury zawodne, dlatego należy je traktować jako prawie pewien punkt awarii w aplikacji. W tym kontekście, czy w konwencjonalnej sieci przewodowej, czy nie, załóżmy, że w pewnym momencie wystąpi awaria i zaprojektuj aplikację tak, aby obsłużyła ten scenariusz.
Steven Bakhtiari
11

Nie musisz sam wysyłać bicia serca. Połączenie TCP pozostanie otwarte niezależnie od użycia.

Zauważ, że TCP implementuje opcjonalny mechanizm utrzymywania aktywności , który może być użyty do zidentyfikowania zamkniętego połączenia w odpowiednim czasie, zamiast wymagać wysłania danych w późniejszym terminie i dopiero wtedy odkryć, że połączenie jest zamknięte.

Brian Agnew
źródło
1
Jak to jest pracować na Linuksie? czy to faktycznie działa? czy mogę ustawić limit czasu na mniej niż 2 godziny? na przykład 30 sekund?
Itay Levin
Aby to działało, aplikacja musi obsługiwać keepalive. Samo włączenie go w Linuksie nie wystarczy.
Mike Vella
9

Jeśli używasz systemu Windows, zachowaj ostrożność podczas korzystania z TCP Keep-alive. Domyślnie jest wyłączony, chyba że włączysz go globalnie w rejestrze systemu Windows lub przez setsockopt.

Domyślny interwał utrzymywania aktywności to 2 godziny.

http://msdn.microsoft.com/en-us/library/ms819735.aspx

Być może będziesz musiał zaimplementować własne bicie serca i wyłączyć utrzymywanie aktywności TCP w systemie Windows, jeśli 2-godzinne utrzymywanie przy życiu nie jest pożądane.

Andrew Keith
źródło
3

Czy bicie serca jest niezbędne do utrzymania aktywnego połączenia TCP / IP?

Są przydatne do wykrywania utraty połączenia.

ChrisW
źródło
3

TCP utrzyma połączenie przy życiu. Puls aplikacji służy do rozważań na poziomie aplikacji, takich jak przełączanie awaryjne, równoważenie obciążenia lub ostrzeganie administratorów o potencjalnych problemach.

kaczka
źródło
3

Bicie serca to dobry sposób, aby powiedzieć serwerowi, że żyjesz, co oznacza, że ​​jeśli serwer korzysta z systemów zapobiegania atakom DoS, to (serwer) może usunąć wszystkie zasoby przydzielone dla tego konkretnego połączenia po wykryciu nieaktywny przez określony czas.
Nie mają mandatu do wdrażania jakichkolwiek mechanizmów bicia serca.

Ale jest to dobre, jeśli projektujesz aplikację, w której głównym kryterium jest responsywność. Nie będziesz chciał tracić czasu na konfigurowanie połączeń, wyszukiwanie DNS i wykrywanie ścieżek. Po prostu utrzymuj połączenie przez cały czas, wysyłaj bicie serca, a aplikacja wie, że połączenie jest aktywne, a konfiguracja połączenia nie jest wymagana. Po prostu wysyłaj i odbieraj.

Vivek Sharma
źródło
2

TCP / IP jako protokół jest określony jako niezamykany, dopóki nie wyślesz bliskiego pakietu. Gniazdka pozostały otwarte nawet po nierównych połączeniach bezprzewodowych lub internetowych.

Jednak wszystko to jest bardzo zależne od implementacji. Najprawdopodobniej nastąpi „limit czasu”, który oznacza maksymalny czas oczekiwania na odpowiedź przed uznaniem połączenia za „martwe”. Czasami jest to oparte na samej aplikacji, czasami na routerach NAT.

Dlatego zdecydowanie zalecam zachowanie „bicia serca” w celu wykrycia złych połączeń i pozostawienia ich otwartych.

Nieznany
źródło
2

Zasadniczo połączenie TCP tworzy stany łączy przechowywane w przełącznikach wzdłuż trasy. Aby wykryć zerwane połączenia (np. Gdy jeden odpowiednik ulegnie awarii (bez wysłania odpowiedniego rozłączenia)), stany te muszą zostać eksmitowane po okresie bezczynności. A kiedy to się stanie, twoje połączenie TCP zostało zamknięte. Chociaż nie mogę dokładnie określić, jak długie są te limity czasu, wydaje się, że zależą one od producentów urządzeń i / lub dostawców Internetu. Pamiętam, że moje bezczynne sesje terminala SSH zostały szybko (mniej niż 15 minut bezczynności) zamknięte przez mojego byłego dostawcę Internetu 1 & 1, podczas gdy pozostawały otwarte przez kilka godzin, gdy korzystałem z połączenia dostarczonego przez Kabel-BW ...

Na koniec kończę z moimi poprzednimi mówcami: bicie serca to dobry sposób, aby stwierdzić, czy połączenie jest nadal żywe i działa ...

Mayday
źródło
1

To, co nazywasz biciem serca, jest przydatne, gdy próbujesz ustawić limity czasu. Twoje gniazdo może wydawać się otwarte, ale osoba po drugiej stronie może cierpieć na BSOD. Jednym z najłatwiejszych sposobów wykrywania niedziałających klientów / serwerów jest ustawienie limitu czasu i upewnienie się, że wiadomość jest otrzymywana co jakiś czas.

Niektórzy nazywają ich NOOPami (No Ops).

Ale nie, nie są one konieczne do utrzymania połączenia, pomagają tylko wiedzieć, jaki jest stan.

Kekoa
źródło
1

Powiedziałbym, że jeśli nie masz pulsu, nie ma znaczenia, czy twoje połączenie TCP / IP jest otwarte, czy nie.

D. Patrick
źródło
1

Bicie serca nie jest konieczne w przypadku protokołów TCP. Jego implementacja ma na celu wykrycie, czy druga strona zakończyła połączenie w niestandardowy sposób (tj. Nie przeszła przez proces zrywania).

Ciemna Gwiazda 1
źródło
0

Połączenie pozostanie otwarte - nie ma potrzeby wdrażania pulsu, a większość aplikacji korzystających z gniazd nie robi tego.


źródło
-2

Wiele protokołów implementuje bicie serca lub stan zdrowia, jak powiedział Lloyd. Tylko po to, abyś wiedział, że połączenie jest nadal otwarte i jeśli coś przeoczyłeś

ist_lion
źródło