Gniazdo TCP Brak limitu czasu połączenia

Otwieram Gniazdo TCP i podłączam je do innego gniazda gdzie indziej w sieci. Następnie mogę z powodzeniem wysyłać i odbierać dane. Mam zegar, który wysyła coś do gniazda co sekundę.

Następnie niegrzecznie przerywam połączenie, wymuszając utratę połączenia (wyciągając w tym przypadku Kabel Ethernet). Moje gniazdo nadal donosi, że z powodzeniem zapisuje dane co sekundę. Trwa to około 1 godziny i 30 minut, gdzie błąd zapisu jest ostatecznie podany.

Co określa ten czas, w którym Gniazdo ostatecznie akceptuje drugi koniec? Czy jest to system operacyjny (Ubuntu 11.04), czy ze specyfikacji TCP/IP, czy jest to opcja konfiguracji gniazda?

Author: oggmonster, 2012-10-26

2 answers

Pociągnięcie kabla sieciowego nie spowoduje przerwania połączenia TCP(1), chociaż zakłóci komunikację. Możesz podłączyć kabel z powrotem, a po nawiązaniu łączności IP wszystkie dane zostaną przeniesione. To właśnie sprawia, że TCP jest niezawodny, nawet w sieciach komórkowych.

Gdy TCP wysyła dane, oczekuje odpowiedzi ACK. Jeśli żaden nie pojawi się w określonym czasie, ponownie przesyła dane i czeka ponownie. Czas oczekiwania między transmisjami zwykle wzrasta wykładniczo.

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

Z TCP Linuksa.7 strona man :

   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 to prawdopodobnie wartość, którą chcesz dostosować, aby zmienić czas wykrywania, czy połączenie zniknęło.

(1) są wyjątki od tego. System operacyjny, po zauważeniu usunięcia kabla, może powiadomić górne warstwy, że wszystkie połączenia powinny być uważane za"uszkodzone".

 71
Author: Brian White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-26 12:59:40

Jeśli chcesz szybko propagować błąd gniazda do kodu aplikacji, możesz spróbować tej opcji gniazda:

TCP_USER_TIMEOUT (od Linuksa 2.6.37) Ta opcja przyjmuje unsigned int jako argument. Kiedy wartość jest większa niż 0, określa maksymalną ilość czas w milisekundach , że przesyłane dane mogą pozostać unacknowledged before TCP will forcifully close the odpowiednie połączenie i zwraca ETIMEDOUT do podanie. Jeśli wartość opcji jest określona jako 0, TCP będzie Użyj domyślnego systemu.

Zobacz pełny opis na linux/man/TCP(7). Opcja ta jest bardziej elastyczna (można ją ustawić w locie, zaraz po utworzeniu gniazda) niż edycja tcp_retries2 i dokładnie odnosi się do sytuacji, gdy gniazdo klienta nie wie o jednym stanie serwera i może uzyskać do tzw. stanu półzamkniętego.

 1
Author: Alex-Bogdanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-10 13:50:33