Fotografia cyfrowa
Optymalizacja połączeń internetowych - wybrane parametry

Trwający przez dłuższy czas brak wyświetlania niektórych stron internetowych, regularne kilkudziesięciosekundowe zamierania transferu, przesyłki nie dochodzące do adresata to problemy, które często pojawiają się w Waszej korespondencji.
Sieć i tematyka transmisji ma tyle wspólnego z informatyką co chirurgia oka z medycyną ogólną. Nic więc dziwnego, że zanim podjęłam ten temat musiałam się znów czegoś douczyć.
Ze względu na stopień złożoności tematu, niezbędną wydaje się na początek odrobina teorii, która pozwoli łatwiej poruszać się w temacie nawet jeśli nie znajdziecie tu rozwiązania wszystkich Waszych problemów.

Zjawisko fragmentacji pakietu
Wbrew pozorom przesyłany w sieci pakiet danych rzadko porusza się w niej w całości. Najczęściej pakiet, lub jak kto woli datagram, jest dzielony na mniejsze części (fragmenty), które podróżują w sieci jako oddzielne datagramy. Trafiając do ostatecznego odbiorcy muszą zostać złożone.
Przypomina to segmentowe ściąganie plików takimi narzędziami jak NetTransport czy GetRight.
Gdy jakiś fragment zostanie zagubiony, datagram nie może zostać odtworzony, a w efekcie przesyłka nie dociera do adresata.
Trzeba też wiedzieć, że maszyna odbierająca z chwilą otrzymania fragmentu początkowego, uruchamia zegar składania. Gdy czas na zegarze przekroczy określoną wartość, zanim nadejdą wszystkie fragmenty, maszyna odbierająca porzuca otrzymane fragmenty bez przetwarzania datagramu.
Jest zatem oczywiste, że wraz z pojawieniem się fragmentacji prawdopodobieństwo utraty danych wzrasta, gdyż utrata pojedynczego fragmentu pociąga utratę całego datagramu.
Jak to się dzieje, że poszczególne fragmenty pakietu nie są gubione permanentnie?

Kontrola fragmentacji
Każdy z fragmentów zawiera nagłówek, w którym jest powielona znaczna część zawartości nagłówka pierwotnego pakietu.
Do kontroli procesów fragmentacji i składania datagramów służą trzy pola nagłówka:
identyfikacja, znaczniki i przesunięcie fragmentu.

16-bitowe pole identyfikacja zawiera unikalny identyfikator i to właśnie on zapobiega wymieszaniu się fragmentów pochodzących od różnych datagramów. Wszystkie kawałki będące częściami tego samego pakietu pierwotnego muszą zatem posiadać ten sam identyfikator.

3-bitowe pole znaczniki służy do właściwej kontroli fragmentacji. Pierwszy z trzech bitów nie jest używany. Jeżeli drugiemu nada się wartość 1 będzie to oznaczało bezwzględny zakaz fragmentacji. Stąd prosty wniosek, że jeśli datagram nie będzie mógł być przesłany w całości to zostanie odrzucony, a nadawca otrzyma, przynajmniej teoretycznie, komunikat o błędzie.

Ostatni z bitów - przesunięcie fragmentu - umożliwia z kolei identyfikację ostatniego kawałka datagramu, w którym ma wartość 0, a w pozostałych fragmentach pakietu - 1.

Czwarte pole nagłówka to czas życia TTL które określa jak długo, w sekundach, datagram może pozostawać w sieci. Wymogiem protokołu TCP/IP jest aby każdy router podczas przetwarzania nagłówka datagramu zmniejszał wartość tego pola co najmniej o 1, nawet jeśli rzeczywiste przetwarzanie trwało krócej. Jeżeli jednak router jest przeciążony i czas przetwarzania jest dłuższy, wówczas wartość pola TTL zmniejsza się o czas faktycznego pozostawania datagramu wewnątrz routera. Gdy wartość pola zmaleje do zera router porzuca datagram i wysyła do nadawcy komunikat o błędzie.
Zaletą tego mechanizmu jest to, że zapobiega on w ten sposób podróżowaniu datagramów w sieci w nieskończoność, np. gdy tablice tras są nieaktualne, albo adres odbiorcy nie istnieje.
To jeszcze nie wszystkie pola nagłówka, ale w naszych rozważaniach najważniejsze.

Jak łatwo zauważyć, to czy pakiet w ogóle dotrze do odbiorcy zależy w głównej mierze od jego wielkości i czasu przebywania w sieci.
Idealnym zatem rozwiązaniem byłoby przesyłanie datagramu, który nie ulegnie fragmentacji i bez pośrednictwa routerów. Jest to możliwe tylko wówczas gdy dwa komputery podłączone są do tej samej sieci fizycznej np. Ethernet. W rzeczywistości jednak zmuszeni jesteśmy korzystać z wielu sieci fizycznych połączonych przez specjalizowane routery,  które wybierają trasy przesyłania na podstawie informacji o najkrótszych ścieżkach. Te jednak często różnią się maksymalną jednostką transmisyjną, która wymusza fragmentację pakietu.

I tak dochodzimy wreszcie do parametrów, które decydują o sygnalizowanych problemach, a tym samym mogą mieć wpływ na ich ograniczenie.

Podstawowe parametry konfiguracyjne
MTU (Maximum Transmission Unit) – to parametr wyznaczający maksymalny rozmiar przesyłanego pakietu danych. Inaczej można powiedzieć, że jest to jednostka określająca maksymalną ilość danych jakie mogą "przełknąć" routery dostawców Internetu.
W skład Windows wchodzi specjalny program, który zajmuje się dobieraniem tego parametru, a jego wybór jest dokonywany podczas nawiązywania każdego połączenia z dostawcą usług internetowych.
Wielkość MTU ustawiona domyślnie dostosowana jest do obsługi sieci lokalnych i wynosi 1500 bajtów, co powinno gwarantować optymalną szybkość transmisji danych w sieciach LAN oraz przy większości rodzajów łączy stałych. Tak jest jednak w teorii.
Właśnie ta wielkość była powodem poważnych problemów użytkowników Neostrady Plus.
Okazało się bowiem, że do przesyłania informacji używa ona protokołu PPPoE (PPP over Ethernet), w którym zmodyfikowano nagłówek powiększając go o 8 bajtów. Tym samym domyślna wartość MTU powinna być ustawiona w systemie na 1492 bajty, a nie na 1500.
Ta niewielka różnica spowodowała jednak, że zbyt duży pakiet nie mógł być odebrany przez router w całości i w rezultacie odsyłał on do serwera komunikat ICMP o złym rozmiarze pakietu.
W normalnej sytuacji, serwer po otrzymaniu takiego komunikatu powinien wysłać wszystkie następne pakiety w zmniejszonym rozmiarze. Rzecz w tym, że wiele serwerów w obawie przed przeciążeniem blokuje komunikaty ICMP, a nie otrzymując informacji o błędach - kontynuuje wysyłanie pakietu, który jest za duży. Skutkiem było właśnie przerywanie transmisji i problemy z otwieraniem stron www.

Załóżmy jednak, że komunikat ICMP dociera prawidłowo i praktyka pokrywa się z teorią.
Jeśli pakiet okaże się dla serwera dostępowego za duży to siłą rzeczy musi on początkowo odmówić ich przyjęcia. Po nieudanej próbie kontaktu system dopasuje wielkość wysyłanych pakietów do wymagań serwera. Niestety za każdym razem tracimy nawet kilka sekund na dostrajanie się systemu.
Biorąc to pod uwagę bezpieczna wartość MTU dla sieci LAN, dla DSL oraz dla modemów kablowych powinna być ustawiona na 1492, natomiast dla modemu 56K - na 576.
Czy to już zapobiegnie fragmentacji? Nie do końca.
Ponieważ pakiety wędrują po sieci między różnymi routerami może się zdarzyć, że trafimy na router, który nie radzi sobie z pakietami takiej wielkości i pomimo wszystko podzieli je na kilka mniejszych, które później będą składane. Dobierając jednak odpowiednią wartość unikniemy niepotrzebnych przestojów, a protokoły komunikacyjne po nawiązaniu połączenia od razu będą mogły przystąpić do wymiany danych.

MSS (Maximum Segment Size) - to maksymalny rozmiar pakietu danych, jaki może być przesłany za pośrednictwem protokołu TCP/IP.
Parametr MSS jest w zasadzie pochodną MTU i odnosi się do wielkości samych informacji zawartych w pakietach danych. Różnica polega jedynie na tym, że wielkość MTU dotyczy całego pakietu - czyli zarówno przesyłanej informacji jak i nagłówków TCP i IP, a MSS tylko samej informacji. Z uwagi na to, że wspomniane nagłówki zajmują w każdym pakiecie 40 bajtów, wartość parametru MSS na przykład dla połączeń dial-up wynosi zwykle 536 bajtów.

RWIN (Receive Window) – to parametr określający maksymalny rozmiar pakietu jaki może wysłać serwer zanim otrzyma potwierdzenie odbioru.
Jako że wydajność połączenia w dużej mierze zależy od przepustowości odcinka sieci między dwoma komputerami, ustala on maksymalną wielkość danych jakie komputer może wysłać do nadawcy bez uzyskania gwarancji (potwierdzenia), że poprzednio wysłane pakiety dotarły do celu.
Im połączenie jest wolniejsze a Sieć bardziej przeciążona, tym częstotliwość relacjonowania odbioru pakietów powinna być większa. Wartość RWIN uzależniona jest od MTU (a dokładnie od MSS) i stanowi jego parzystą wielokrotność.
Zależnie od systemu operacyjnego zaleca się stosować różne wielokrotności chociaż delikatnie mówiąc najlepiej z nimi trochę poeksperymentować. Według autorów programu Accelerate 2K2 dla wersji systemów Windows 9x i ME, RWIN powinien wynosić 4 lub 6 krotną wartość MSS, natomiast systemy NT, 2000 i XP są w stanie obsłużyć ośmio, a nawet dziesięciokrotną wartość MSS. Oczywiście parametry te trzeba dostosować także do szybkości posiadanego łącza.

TTL (Time To Live) - ten parametr, o którym była już mowa wyżej, ma kolosalne znaczenie, ponieważ określa tzw. czas życia pakietu danych. Często spotyka się nie do końca poprawną definicję, że jest to wartość w nagłówku IP, która wyznacza liczbę routerów, przez które może przejść pakiet w drodze do celu. Byłoby tak, gdyby rzeczywisty czas przetwarzania na każdym z nich nie przekraczał 1 sekundy.
Modyfikując ten parametr, można jednak z pewnym przybliżeniem określić, jaką maksymalną drogę, liczoną liczbą routerów może przebyć datagram.

Jest taki sprytny program Visual Route, w którym wystarczy wpisać określony adres internetowy na świecie aby otrzymać specyfikację wszystkich routerów jakie brały udział w połączeniu. Jeżeli ich liczba wyniosła np. 36 to z góry możemy być pewni, że przesłany datagram nigdy nie dotrze do adresata przy domyślnych ustawieniach TTL, które wynoszą 32.
Zaleca się zatem zmodyfikowanie tego parametru zwiększając go do 128.
W przypadku Windows 2000 i XP system poradzi sobie z takimi ustawieniami, natomiast przy Win 98 i ME może się to nie udać. Jeśli w czasie połączeń otrzymacie komunikaty z informacją typu "connection timeout" może to oznaczać, że wartość TTL w systemie ma ustawioną zbyt niską poprzeczkę i wysyłane pakiety po prostu nie docierają do miejsca przeznaczenia.

Przy tej okazji warto wspomnieć także o trzech innych funkcjach:

PMTU Auto Discovery (Path Maximum Transfer Unit Auto Discovery) - funkcja ta zawarta w niektórych akceleratorach, odpowiada za możliwość negocjowania wielkości pakietów MTU.
Oznacza to, że zależnie od serwera, z którym nasz komputer nawiązuje połączenie, wartość MTU może się odpowiednio zmieniać.
Można ją także wykorzystać do zapobiegania fragmentacji pakietów poprzez zablokowanie parametru PMTU jednak kosztem znacznego spowolnienia transferu danych, a nawet ich utraty gdy pakiet na swej drodze będzie musiał być podzielony.

PMTU Black Hole Detection - funkcja zależna od PMTU Discovery. Próbuje ona wykrywać routery, które po nadejściu zbyt dużych pakietów o zablokowanej możliwości fragmentacji odrzucają ich obsługę, nie zgłaszając przy tym użytkownikowi żadnego ostrzeżenia.
Standardowo zaleca się wyłączyć tę opcję, chyba że celowo blokujemy wielkość wysyłanych pakietów.

Session Keep Alive - odpowiada za podtrzymywanie aktywnej sesji połączenia z serwerem w czasie, gdy ani nasz komputer ani serwer nie zgłaszają zapotrzebowań na kolejne bity danych.
Mówiąc prościej – gdy oglądamy stronę www nasze połączenie z serwerem, mimo że pozostaje aktywne, nie generuje żadnego ruchu, a to z kolei doprowadzić może do automatycznego zerwania połączenia. Aby temu zapobiec opcja Session Keep Alive pozwala określić co jaki czas system ma wysyłać do serwera kontrolny pakiet podtrzymujący aktywne, choć „milczące” połączenie. System Windows standardowo wysyła do serwera potwierdzenie aktywności co 60 minut. Akceleratory internetowe pozwalają jednak modyfikować ten okres nawet do 1 sekundy, co w wyjątkowych sytuacjach może być przydatne.

Skoro już wszystko wiemy – jak zmodyfikować nasze domyślne ustawienia?

Modyfikacja ustawień w Rejestrze
W celu zmiany domyślnych ustawień Windows przechodzimy do klucza:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

Otworzy się nam lista wszystkich obecnych w systemie interfejsów sieciowych. Będzie ich z pewnością więcej niż jeden, ponieważ MS Windows za urządzenie sieciowe uznaje każde urządzenie bądź interfejs programowy, który może przesyłać dane.
W jednym z nich, w prawej części okna, znajdziemy nasz adres IP. To właśnie w tym kluczu zmodyfikujemy wartość DWORD MTU wstawiając odpowiedni parametr.

Niezależnie od orientacyjnych wartości jakie podałam wyżej warto sprawdzić je praktycznie porównując opóźnienia przy różnych wielkościach MTU. Jak to zrobić?

Z menu Start wybieramy Uruchom i wpisujemy cmd
Teraz w wierszu poleceń: ping –f –l 548 www.onet.pl lub inną polska stronę

Wartość 548 to sprawdzana wielkość MTU zmniejszona w każdym przypadku o 28.
Jak widać przesłanie pakietu o wielkości charakterystycznej dla modemu 56K nie sprawiło problemu i dotarł on w całości, a co ciekawe w czasie niewiele krótszym niż pakiet 1472 bajtowy. Oznacza to, że moje połączenie kablowe może obsłużyć z powodzeniem pakiet o takiej wielkości. Tu jednak mała uwaga. Zmieniając adresata przesyłki może się zdarzyć coś takiego:

Oznacza to, że pakiet trafił po drodze na router, który musi go podzielić, ale funkcja taka została zablokowana. Lepiej więc nie przesadzać z wielkością pakietu.

Wróćmy jednak do Rejestru. Pozostałe parametry znajdziemy w kluczu:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters]
w którym modyfikujemy lub dodajemy następujące wartości DWORD:

EnablePMTUBHDetect (patrz funkcja PMTU Black Hole Detection)
Włącza lub wyłącza wykrywanie "czarnej dziury" w połączeniach TCP/IP. Najlepiej jeśli jest wyłączony – 0
DefaultTTL
To ustawienie decyduje o tym jak długo pakiet "pozostanie przy życiu" - TTL (Time to Live Acitve). Możliwe ustawienia to 32, 64, 96, 128, 256. Najlepiej ustawić 128.
EnablePMTUDiscovery
To ustawienie włącza automatyczne wykrywanie MTU (Max. Transmition Unit) przez system. Najlepiej jeśli jest włączone – 1
TCPWindowSize
Jest to wielokrotność ustawienia MSS. Należy zatem sprawdzić najlepszą dla siebie wartość MTU odjąć od niej 40 i dopiero pomnożyć (dla modemu 56K – czterokrotnie)
Tcp1323Opts i Tcp1320Opts
Włącza lub wyłącza support dla "dużych okien TCP" (large TCP window). Jeżeli funkcja ta zostanie wyłączona czyli zmienna przyjmie wartość 0, to wielkość okna zostanie ograniczona do 64K.
Zaleca się ustawienia na Win.Scaling with Timestamp - 3 lub Win.Scaling without Timestamp - 1
StackOpts
Jeżeli poprzednia funkcję włączyliśmy to tę również należy włączyć i wartości DWORD przypisać zmienną 1.

Zamiast ręcznej i dość żmudnej pracy można posłużyć się jednym z dostępnych tweakerów lub narzędzi specjalnie w tym celu zaprojektowanych.
Osobiście polecam SG TCP Optymizer, który jest już w dziale Downloads.

Jak widać uwzględnia on także protokół DSL (PPPoE) wykorzystywany przez Neostradę Plus. Można z jego pomocą o wiele prościej wykonać testowy ping i otrzymać natychmiast podpowiedź jaka wartość MTU możemy zastosować. Program optymalizuje parametry połączenia internetowego ale także zezwala na własne ustawienia i automatycznie dopisuje je do Rejestru. 
Niektóre z nich możemy przeprowadzić także za pomocą Madonote.
Dodatkową zaletą SG TCP Optimizer jest to, że nic nie kosztuje. Oczywiście to nie jedyne narzędzie.
Warto sprawdzić także:
Internet Accelerator 1.31 - umożliwia zmniejszenie czasu otwierania stron internetowych oraz optymalizuje połączenie z Siecią.
Internet Cyclone 1.86 - służy do optymalizacji ustawień systemowych w celu zwiększenia wydajności połączenia z Internetem. Aplikacja umożliwia automatyczną optymalizację łącza bądź też pozwala użytkownikowi modyfikować poszczególne parametry.
Throttle 6.12.13.2004 - pozwala modyfikować ustawienia systemowe dla wszelkiego typu modemów, dzięki czemu prędkość połączenia z Internetem może znacząco wzrosnąć.
Dodatkowo program (bez modyfikowania ustawień sprzętowych) eliminuje częste zrywanie połączenia i zawieszanie się modemu.
Życzę płynnego serfowania na maksymalnej szybkości.
 
agavk 2003 - 2007