2012-10-26 19 views
28

Otwieram gniazdo TCP i podłączam je do innego gniazda w innym miejscu sieci. Mogę wtedy pomyślnie wysyłać i odbierać dane. Mam zegar, który wysyła co sekundę do gniazda.Gniazdo TCP bez limitu czasu połączenia

Następnie gwałtownie przerywam połączenie, siłą tracąc połączenie (w tym przypadku wyciągając kabel Ethernet). Moje gniazdo wciąż zgłasza, że ​​z powodzeniem zapisuje dane co sekundę. Trwa to przez około 1 godzinę i 30 minut, gdzie ostatecznie zostaje podany błąd zapisu.

Co oznacza, że ​​czas, w którym gniazdo ostatecznie akceptuje drugi koniec, zniknął? Czy to OS (Ubuntu 11.04), czy jest to ze specyfikacji TCP/IP, czy jest to opcja konfiguracji gniazda?

+2

Może [to] (http://stackoverflow.com/questions/5907527/application-control-of-tcp-retransmission-on-linux) daje odpowiedź dla ciebie. – SKi

Odpowiedz

49

Wyciągnięcie kabla sieciowego nie przerwie połączenia TCP (1), ale zakłóci komunikację. Możesz ponownie podłączyć kabel i po nawiązaniu połączenia IP wszystkie dane z powrotem się poruszą. To właśnie sprawia, że ​​TCP jest niezawodny, nawet w sieciach komórkowych.

Gdy TCP wysyła dane, oczekuje odpowiedzi ACK. Jeśli żadna nie dotrze w określonym czasie, ponownie przesyła dane i czeka ponownie. Czas oczekiwania pomiędzy transmisjami zasadniczo wzrasta wykładniczo.

Po pewnej liczbie retransmisji lub pewnej ilości całkowitego czasu bez ACK, TCP uzna połączenie za "zepsute". Ile razy lub jak długo to zależy od systemu operacyjnego i jego konfiguracji, ale zazwyczaj jest to czasowo zbyt długi czas rzędu wielu minut.

Od Linux na tcp.7 man page:

tcp_retries2 (integer; default: 15; since Linux 2.2) 
      The maximum number of times a TCP packet is retransmitted in 
      established state before giving up. The default value is 15, which 
      corresponds to a duration of approximately between 13 to 30 minutes, 
      depending on the retransmission timeout. The RFC 1122 specified 
      minimum limit of 100 seconds is typically deemed too short. 

Jest prawdopodobne, że wartość będziesz chciał dostosować się do zmiany, jak długo to trwa do wykrycia, jeśli połączenie zniknął.

(1) Istnieją wyjątki od tej reguły. System operacyjny, po zauważeniu usunięcia kabla, może powiadomić górne warstwy, że wszystkie połączenia powinny zostać uznane za "uszkodzone".

+1

To było bardzo pomocne, dziękuję za odpowiedź! – corvid

+0

Codziennie robię tysiące żądań HTTP, teraz pracuję w Websockets (nodejs), więc naturalnie chciałem dowiedzieć się więcej o dobrych starych gniazdkach, teraz zdaję sobie sprawę, jak pięknie pracuje SocketsWork. niezawodny, zorientowany na połączenie i specyficzny dla hosta protokół, ponieważ to dlatego nie. Liczba prób zależy od systemu operacyjnego! –

Powiązane problemy