Mylony z porządkowaniem pakietów
Czytałem podręcznik, w którym jest mowa o protokole TCP „Selective Repeat”:
Założyliśmy, że pakiety nie mogą być ponownie porządkowane w kanale między nadawcą a odbiorcą. Jest to na ogół rozsądne założenie, gdy nadawca i odbiorca są połączeni jednym fizycznym przewodem. Jednak gdy „kanał” łączący te dwa elementy jest siecią, może wystąpić zmiana kolejności pakietów. W praktyce podejście polega na zapewnieniu, że numer sekwencyjny nie zostanie ponownie użyty, dopóki nadawca nie będzie „pewny”, że jakiekolwiek wcześniej wysłane pakiety o numerze sekwencyjnym x nie znajdują się już w sieci. Odbywa się to przy założeniu, że pakiet nie może „żyć” w sieci dłużej niż ustalony maksymalny czas.
Jestem zdezorientowany i poniżej znajdują się moje dwa pytania.
Pytanie 1 - Co oznacza „kanał można traktować jako zasadniczo buforujący pakiety i spontanicznie emitujący te pakiety w dowolnym momencie w przyszłości”. oznaczać? Dlaczego musimy buforować stary pakiet? Czy nie lepiej, żeby odbiorca po prostu to zignorował?
P2-Powiedzmy, że rozmiar okna to 2, a dostępny numer sekwencji to 0,1,2,3. Nadawca najpierw wysyła pakiet 0, pakiet 1, podczas gdy pakiet 0 jest w jakiś sposób trafiany i dotarcie do niego zajmuje dużo czasu, więc po przekroczeniu limitu czasu nadawca musi ponownie wysłać pakiet 0, ale tym razem pakiet 0 (nowy) dociera na czas. Następnie nadawca wysyła pakiet 2, pakiet 3, wszystkie odebrane przez odbiorcę. Następnie nadawca ma zamiar wysłać pakiet 0 (nowy) i pakiet 1 (nowy), ale stary pakiet 0 dociera teraz do odbiorcy, więc odbiornik nie mógł wiedzieć, że ten pakiet jest starym pakietem lub nowym pakietem. Jak więc „założenie, że pakiet nie może„ żyć ”w sieci dłużej niż ustalony maksymalny czas”, może rozwiązać ten problem? Czy to oznacza, że nagłówek pakietu zawiera czas, w którym został wysłany?
Odpowiedzi
Co oznacza „kanał można traktować jako zasadniczo buforujący pakiety i spontanicznie emitujący te pakiety w dowolnym momencie w przyszłości”. oznaczać? dlaczego musimy buforować stary pakiet? czy nie jest lepiej, że odbiorca po prostu to zignoruje?
Taka jest natura kolejkowania i buforowania, które są istotną częścią przełączania pakietów - odebrane pakiety są kolejkowane / buforowane na wejściu i usuwane z kolejki po przekazaniu. Buforowanie jest konieczne, ponieważ w przeciwnym razie łącze wychodzące zawsze musiałoby być wolne za każdym razem, gdy odbierany jest pakiet - nie jest to możliwe w przypadku sieci z komutacją pakietów, tylko w przypadku sieci z komutacją łączy.
Powiedzmy, że rozmiar okna wynosi 2, a dostępny numer porządkowy to 0,1,2,3.
Okno nie liczy pakietów / datagramów, ale bajty . Ponadto numer kolejny powtarza się tylko wtedy, gdy jego 32-bitowe pole przepełnia - dzieje się tak dopiero po 4 GiB danych. Jednak ten limit oznacza, że nie może być więcej niż 4 Gib danych „w locie”, aby uniknąć niejednoznaczności. Ponieważ największe możliwe okno wynosi (blisko) 1 GiB, nie stanowi to problemu.
Zauważ, że w przypadku prostych, skumulowanych potwierdzeń ACK, odbiornik nie może selektywnie potwierdzać późniejszych segmentów, gdy brakuje poprzedniego segmentu. ACK oznacza, że wszystkie poprzednie dane zostały odebrane.
Na przykład, przy rozmiarze segmentu 1000 i oknie o rozmiarze 10 000, nadawca wysyła datagramy D00-D09 (sekwencja 0-9 999). D00 i D02-D09 zostały odebrane, ale D01 zostało utracone. Odbiorca nadal potwierdza potwierdzenie 1000 (kolejna oczekiwana sekwencja danych), co powoduje, że nadawca przesuwa D0 poza okno, przesuwa je na 1000-10 999 i wysyła D10.
Tymczasem odbiornik zdecydował, że nie jest to problem, więc ACK 1000 ponownie zasygnalizować tylko to. Nadawca otrzymuje podwójne potwierdzenie i ponownie wysyła D01 (tryb niechętny) lub wszystkie dane począwszy od D01 (tryb agresywny). Odbiornik ma już D10 (10 000-10 999), więc potwierdza 11 000, co z kolei przesuwa okno nadawcy do 11 000-20 999 (i przerywa wciąż zaległe retransmisje, dla trybu agresywnego).
(Trochę uprościłem ten proces, w rzeczywistości istnieje więcej równoległego nakładania się i oczywiście opóźnienia między wysyłaniem a odbieraniem).
EDYCJA: Jak słusznie zauważył Jeff (dzięki!), Wsparcie dla selektywnych potwierdzeń (SACK) jest dziś prawie dostępne. Korzystając z tej opcji, odbiorca mógł również od razu ZŁUPIĆ 2,000-9,999 (z D02-D09), aby nadawca nie rozpoczął ich retransmisji. Mógłby również rozpocząć transmisję 11 000-20 999 wcześniej.