www.eprace.edu.pl » rejestrowanie-multimediow » Program wykonywany przez mikroprocesor sygnałowy » Zapewnienie niezawodności transmisji

Zapewnienie niezawodności transmisji

Zarys idei

Ponieważ protokół UDP nie zapewnia mechanizmów chroniących przed zagubieniem lub powieleniem datagramu ani przed zmianą kolejności, zabezpieczenia przed tymi sytuacjami zostały zaimplementowane w warstwie aplikacji. Zostały one zrealizowane przez zastosowanie pozytywnych potwierdzeń i retransmisji.

Rejestrator po wysłaniu każdej ramki (sterującej lub głosowej) oczekuje na potwierdzenie tej ramki przez komputer (ramką potwierdzenia). Jeżeli w ciągu określonego limitu czasu od wysłania ramki rejestrator otrzyma potwierdzenie, ramka jest uznawana za dostarczoną i rejestrator jest gotowy do wysłania następnej. Jeżeli natomiast limit czasu upłynie i potwierdzenie nie nadejdzie, ramka uznawana jest za zagubioną, wobec czego rejestrator wysyła ją powtórnie i zaczyna od początku odmierzanie czasu. W ten sposób procedura powtarzana jest aż do otrzymania potwierdzenia lub, jeżeli to nastąpi wcześniej, do osiągnięcia ustalonej maksymalnej liczby powtórzeń, po czym postępowanie jest takie samo jak w przypadku otrzymania potwierdzenia. Z punktu widzenia tego algorytmu ramki sterujące i ramki głosowe każdego kanału obsługiwane są niezależnie, tzn. oczekiwanie na potwierdzenie ramki z jednego kanału (lub sterującej) nie wstrzymuje nadania ramki z innego kanału.

Powyższy schemat nie dotyczy przesyłania ramek parametrów AGC z komputera do rejestratora. Ramki te wysyłane są zawsze dwukrotnie, a potwierdzenia nie są stosowane. Rozwiązanie takie zastosowano, ponieważ pozwala ono uniknąć implemen­tacji mechanizmu potwierdzeń dla kierunku transmisji z komputera do rejestratora, a generowany w ten sposób nadmiarowy ruch nie stanowi znaczącego obciążenia sieci.

Numer sekwencyjny

Powyższy schemat postępowania dla kierunku od rejestratora do komputera dość skutecznie chroni przed zagubieniem ramki, ale nie zabezpiecza przed jej powieleniem. Co więcej, powstaje tu dodatkowe ryzyko powielenia ramki w sytuacji, gdy zostanie ona odebrana przez komputer, ale potwierdzenie zaginie, powodując jej retransmisję. Dlatego wprowadzono tzw. numery sekwencyjne, analogiczne do stosowanych w protokole TCP. Każda przesyłana ramka ma 1-bajtowy numer sekwencyjny, przy czym jest on większy o 1 od numeru ramki poprzedzającej. Po ramce z numerem 255 przesyłana jest ramka z numerem 0. Numer sekwencyjny liczony jest osobno dla ramek sterujących i dla ramek głosowych każdego kanału. Pierwsza ramka sterująca wysłana po włączeniu urządzenia oraz pierwsza ramka głosowa każdej rozmowy mają numer sekwencyjny 0. Komputer odbierając ramkę porównuje jej numer sekwencyjny z numerem ostatnio odebranej ramki. Jeżeli nowy numer jest większy, ramka zostaje zaakceptowana, a w przeciwnym wypadku odrzucona. Ze względu na następstwo numeru 0 po 255, dokładny warunek akceptacji sformułowany jest nieco inaczej:

Ramki odrzucone ze względu na niezgodność numeru sekwencyjnego są również potwierdzane, co ma zapobiec niepotrzebnemu oczekiwaniu i retransmisji przez rejestrator.

Kolejną sytuacją awaryjną, którą należy rozważyć, jest duplikacja potwierdzenia. Jeżeli nie podjąć specjalnych środków, powtórzone potwierdzenie danej ramki może być odebrane przez rejestrator jako potwierdzenie ramki następnej. W związku z tym ramki potwierdzeń zawierają numer sekwencyjny potwierdzanej ramki. Rejestrator odbierając potwierdzenie sprawdza 2 warunki:

Potwierdzenie będzie przyjęte tylko w przypadku spełnienia obydwu powyższych warunków. Przyjęcie potwierdzenia oznacza ustawienie odpowiednio znacznika ACK Received (bit 1) lub Control Frame ACK Received (bit 23 w kanale 0) w tablicy y:chflags.

Szczegóły implementacji

Do realizacji powyższego mechanizmu ochronnego wykorzystano następujące lokalizacje pamięci z przypisanymi do nich etykietami:

Po nadaniu ramki sterującej lub głosowej (dotyczy również retransmisji) odpowiedni licznik czasu oczekiwania ustawiany jest na wartość maksymalną, ustaloną przez stałą rtime, a licznik powtórzeń jest zwiększany o 1. Do odmierzania czasu retransmisji wykorzystywany jest czasomierz pomocniczy x:timer0. Jest on inkrementowany po odebraniu każdej ramki ESAI (32 szczeliny), czyli z częstotliwością około 16kHz. Gdy czasomierz ten osiągnie wartość ustaloną przez stałą tdiv, równą 8, zostaje on wyzerowany, a wszystkie liczniki oczekiwania na potwierdzenie mające niezerową wartość są dekrementowane. W efekcie jednostką czasu dla tych liczników jest około 0,5ms.

Pętla główna w przypadku stwierdzenia ustawienia znacznika ACK Received lub Control Frame ACK Received w tablicy y:chflags, czyli po odebraniu ważnego potwierdzenia, wykonuje następujące czynności:

Znaczniki ACK Received i Control Frame ACK Received ustawiane są również bezpośrednio po nadaniu ramki, jeżeli licznik powtórzeń po inkrementacji osiągnie wartość maksymalną określoną przez stałą rlimit. Powoduje to zaprzestanie dalszego powtarzania danej ramki i przejście do wysłania następnej.



komentarze

Copyright © 2008-2010 EPrace oraz autorzy prac.