Co to jest aktualizacja okna TCP?

Robię własne oprogramowanie serwerowe dla gry w Javie (gra i oryginalne oprogramowanie serwera zostały napisane w Javie). Nie ma dostępnej dokumentacji protokołu, więc muszę czytać Pakiety za pomocą Wireshark.

Podczas gdy klient łączy się z serwerem wysyła mu plik poziomu w formacie Gzip. Przy około 94 pakietach do wysyłania poziomu, mój serwer zawiesza klienta z ArrayIndexOutOfBoundsException. Zgodnie z plikiem przechwytywania z oryginalnego serwera, to wysyła aktualizację okna TCP mniej więcej w tym momencie. Co to jest aktualizacja okna TCP i jak wysłać ją za pomocą SocketChannel?

Author: phpscriptcoder, 2009-09-23

7 answers

Okna TCP są używane do kontroli przepływu między rówieśnikami w połączeniu. Z każdym pakietem ACK host wyśle pole "rozmiar okna". Pole to mówi, ile bajtów danych host może otrzymać przed zapełnieniem. Nadawca nie powinien wysyłać więcej niż ta ilość danych.

Okno może się zapełnić, jeśli klient nie odbiera danych wystarczająco szybko. Innymi słowy, bufory TCP mogą się wypełniać, gdy aplikacja jest wyłączona, robiąc coś innego niż czytanie ze swojego gniazda. Gdy tak się stanie, klient wyśle pakiet ACK z ustawionym bitem "window full". W tym momencie serwer powinien przestać wysyłać dane. Wszelkie pakiety wysyłane do maszyny z pełnym oknem nie zostaną potwierdzone. (Spowoduje to retransmisję źle zachowującego się nadawcy. Dobrze zachowujący się nadawca po prostu buforuje wychodzące dane. Jeśli bufor po stronie wysyłającej zapełni się, aplikacja wysyłająca zablokuje się, gdy spróbuje zapisać więcej danych do gniazda!)

To jest TCP stall. Może się to zdarzyć z wielu powodów, ale ostatecznie oznacza to po prostu, że nadawca nadaje szybciej niż odbiorca czyta.

Gdy aplikacja na końcu odbiorczym wróci do odczytu z gniazda, opróżni część buforowanych danych, co zwolni trochę miejsca. Odbiorca wyśle pakiet "window update", aby poinformować nadawcę, ile danych może przesłać. Nadawca zaczyna przesyłać swoje buforowane dane, a ruch powinien płynąć normalnie.

Of oczywiście, można uzyskać powtarzające się stragany, jeśli odbiornik jest konsekwentnie powolny.

Sformułowałem to tak, jakby nadawca i odbiorca były różne, ale w rzeczywistości, obaj rówieśnicy wymieniają się aktualizacjami okien z każdym pakietem ACK, a każda ze Stron może zapełnić swoje okno.

Ogólny komunikat jest taki, że nie trzeba wysyłać pakietów aktualizacji okna bezpośrednio. To byłby kiepski pomysł, żeby go sfałszować.

Odnośnie wyjątku, który widzisz... raczej też nie będzie spowodowane lub uniemożliwione przez pakiet aktualizacji okna. Jeśli jednak klient nie czyta wystarczająco szybko, możesz stracić dane. Na twoim serwerze powinieneś sprawdzić wartość zwracaną z gniazda.wywołania write (). Może być mniejsza niż liczba bajtów, które próbujesz zapisać. Dzieje się tak, gdy bufor transmisji nadawcy jest pełny, co może się zdarzyć podczas TCP stall. Możesz tracić bajty.

Na przykład, jeśli próbujesz zapisać 8192 bajtów przy każdym wywołaniu do zapisu, ale jednym z połączenia zwracają 5691, następnie trzeba wysłać Pozostałe 2501 bajtów przy następnym połączeniu. W przeciwnym razie klient nie zobaczy pozostałej części bloku 8K, a Twój plik będzie krótszy po stronie klienta niż po stronie serwera.

 51
Author: mtnygard,
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
2016-07-26 00:27:50

Dzieje się to naprawdę głęboko w stosie TCP / IP; w Twojej aplikacji (serwerze i kliencie) nie musisz się martwić o TCP windows. Błąd musi być czymś innym.

 6
Author: Aaron Digulla,
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
2009-09-23 14:29:17

Aktualizacja okna TCP ma związek z komunikacją dostępnego rozmiaru bufora między nadawcą a odbiorcą. ArrayIndexOutOfBoundsException nie jest prawdopodobną przyczyną tego. Najprawdopodobniej kod oczekuje jakiegoś rodzaju danych, których nie otrzymuje (prawdopodobnie na długo przed tym punktem, który dopiero teraz się odwołuje). Nie widząc kodu i śledzenia stosu, naprawdę trudno powiedzieć coś więcej.

 2
Author: Yishai,
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
2009-09-23 14:34:35

TCP WindowUpdate-oznacza to, że segment był czystym segmentem WindowUpdate. WindowUpdate występuje, gdy aplikacja po stronie odbiorczej zużyła już odebrane dane z bufora RX, powodując, że warstwa TCP wysyła WindowUpdate na drugą stronę, aby wskazać, że w buforze jest teraz więcej miejsca. Typowo widoczne po wystąpieniu warunku ZeroWindow TCP. Gdy aplikacja na odbiorniku pobiera dane z bufora TCP, zwalniając tym samym spacji, odbiorca powinien powiadomić nadawcę, że warunek TCP ZeroWindow nie istnieje, wysyłając datę TCP WindowUpdate, która reklamuje bieżący rozmiar okna.

Https://wiki.wireshark.org/TCP_Analyze_Sequence_Numbers

 2
Author: SimonZC,
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
2015-09-07 13:01:54

You can dive into this web site http://www.tcpipguide.com/free/index.htm dla wielu informacji na temat TCP / IP.

 0
Author: Jackson,
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
2009-09-23 14:33:58

Czy dostajesz jakieś szczegóły z wyjątkiem ?

Prawdopodobnie nie jest związany z pakietem aktualizacji okna TCP
(czy widziałeś, że powtarza się dokładnie dla wielu instancji?)

Bardziej prawdopodobne, że związane z kodem przetwarzania, który działa na odebranych danych.

 0
Author: nik,
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
2009-09-23 14:39:19

To zwykle tylko WYZWALACZ, a nie przyczyna twojego problemu.

Na przykład, jeśli używasz selektora NIO, aktualizacja okna może wywołać OBUDZENIE kanału zapisu. To z kolei wyzwala błędną logikę w Twoim kodzie.

Pobierz stacktrace i pokaże Ci przyczynę.

 0
Author: ZZ Coder,
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
2009-09-23 14:40:58