==================================== 01010110 01101111 01000011 {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__ {__{__ {____ {__ {__ {__ {__ {__ {__ {____ Voice Communication Protocol autor: Magdalena Michalska, mm222110 ==================================== 0.Streszczenie ============== Dokument opisuje protokol obslugi malej biurowej sieci telefonicznej. 1. Opis celow protokolu ======================= Protokol ten sluzy do realizacji sterowania transmisja danych (docelowo glosu )w rozmowach glosowych realizowanych przez siec, z rozproszonym sterowaniem. 2. Opis zalozen protokolu ========================= Protokol dziala w warstwie transportowej. Transport dzwieku odbywa sie w oparciu o UDP, dane sterujace - TCP. Wykorzystywany model komunikacji to P2P. Komputery komunikuja sie zgodnie z portami(logicznym - do przesylania dzwieku, sterujacym - do komunikatow sterujacych) okreslonymi w plikach konfiguracyjnych. Zaklada sie jednoznaczne, wspolne dla wszystkich abonentow z grupy, cykliczne uporzadkowanie abonentow w obrebie grup, potrzebne do cyklicznego przekazywania komunikatow. Protokol nie narzuca sposobu uporzadkowania, wymaga jedynie by wszyscy czlonkowie grupy mieli ten sam poglad na to kto jest czyim nastepnikiem. 3. Opis formatu komunikatow =========================== Przyjmuje sieciowy porzadek oktetow w liczbach. Format liczb zmiennoprzecinkowych: nie dotyczy - zakladam transport wylacznie zmiennych calkowitoliczbowych. Brak uzupelniania formatu. 3.1 Opis pol ============ Nie wszystkie pola musza byc wykorzystane w kazdym komunikacie. Dokladniejszy opis w p.4. 3.1.1 Opis poszczegolnych pol ============================= typ uint32 identyfikuje rodzaj komunikatu dlugosc uint32 dlugosc pola "dane specyficzne" w bajtach identyfikator polaczenia uint32 unikalna liczba identyfikujaca polaczenia protokol nie wnika jak jest inicjowana. inicjuje ja abonent wywolujacy polaczenie i dalej polaczenie jest caly czas nia podpisywane dane specyficzne octet dane charakterystyczne dla poszczegolnych komunikatow, pole zmiennej dlugosci, zawiera n oktetow, w szczegolnosci moze go nie byc. Pola typ, dlugosc, identyfikator polaczenia zawsze sa stalej wielkosci 4 bajtow. Pole indentyfikator moze nie byc wykorzystywane w niektorych komunikatach. Moze byc wtedy wypelnione losowymi danymi. 3.1.2 Rysunek pogladowy ======================= +-----+-----------+-----------------+-------------+ | typ | dlugosc | identyfikator | dane | | | | polaczenia | specyficzne | | 4B | 4B | 4B |n octetow | +-----+-----------+-----------------+-------------+ 4. Opis wymienianych komunikatow ================================ 4.1 Komunikaty wewnetrzne w grupie ================================== Te komunikaty sluza do rozwiazywania sporow dotyczacych wolnych linii telefonicznych, ustalania ktory abonent z ktorej moze korzystac, zapewnienia spojnosci wewnatrz grupy. Komunikaty ze slowek TOKEN w nazwie dalej sa skrotowo nazywane "tokenami", "komunikatami z grupy tokenow". LINIA_TOKEN_MSG --------------- Komunikat "token" z numerem linii. Jest przekazywany po kolei pomiedzy Abonentami. Kolejnosc jest ustalana na podstawie identyfikatorow - protokol nie wymusza sposobu, zaklada jedynie jakis spojny sposob cyklicznego uporzadkowania abonentow, jak juz zostalo powiedziane w zalozeniach. Tylko abonent ktory posiada aktualnie token odpowiadajacy danej linii jest uprawniony do korzystania z niej. Zajecie linii odbywa sie poprzez zaprzestanie przekazywania dalej komunikatu, zwolnienie - poprzez wpuszczenie komunikatu spowrotem do obiegu. +-----+-----------+-----------------+---------------------------+ | typ | dlugosc | identyfikator | dane specyficzne: | | | | polaczenia | ------------------ | | | | | nr_linii uint32 4B | +-----+-----------+-----------------+---------------------------+ Pole identyfikator polaczenia nie jest wykorzystywane. ZWALNIAM_LINIE_MSG ------------------ Komunikat mowiacy, ze zostala zwolniona linia, rozsylany do wszystkich komputerow z grupy po zwolnieniu linii. Nie jest istotne ktora linia zostala zwolniona. Komunikat sluzy jedynie do aktualizacji informacji o liczbie wolnych linii. Po jego otrzymaniu zwiekszana jest zmienna free_lines o 1 (kazdy abonent po otrzymaniu zwieksza u siebie free_lines o 1). +-----+-----------+-----------------+-------------+ | typ | dlugosc | identyfikator | dane | | | | polaczenia | specyficzne:| | 4B | 4B | 4B | BRAK (0B) | +-----+-----------+-----------------+-------------+ Pole identyfikator polaczenia nie jest wykorzystywane. ZAJMUJE_LINIE_MSG ----------------- Komunikat analogiczny z powyzszym - informuje o zajeciu jakiejs linii. Po jego otrzymaniu zmniejszana jest zmienna free_lines o 1. +-----+-----------+-----------------+-------------+ | typ | dlugosc | identyfikator | dane | | | | polaczenia | specyficzne:| | 4B | 4B | | BRAK (0B) | +-----+-----------+-----------------+-------------+ Pole identyfikator polaczenia nie jest wykorzystywane. POLACZENIE_TOKEN_MSG -------------------- Komuniakt "token" transportujacy informacje o polaczeniu ktore nadeszlo. Jest przekazywany cyklicznie wewnatrz grupy abonentow. Abonent ktory dostal ten komunikat nabywa prawa do odebrania/odrzucenia polaczenia. Jesli jednak nie wykonuje zadnej z tych czynnosci - przekazuje komunikat dalej, zmniejszajac mu ttl o 1. Jesli komunikat ma juz ttl = 0, abonent wysyla do wywolujacego pytanie NADAL_DZWONISZ_MSG - zeby zapobiec niepotrzebnemu krazeniu niewaznego juz polaczenia. Pole global_ttl ustawione na -1 oznacza ze token ma krazyc dopoki nie zostanie jakas wlasciwa kacja podjeta - czyli w razie jakis nieprawidlowosci moze sie okazac ze w nieskonczonosc. Gdy golbal_ttl ma wartosc > 0, jest zmniejszane o 1. Jesli ma wartosc = 0 oznacza to ze tokena nalezy juz wyeliminowac czyli zostaje wyslany komunikat KILL_MSG do tworcy tokena (tutaj IP_O), oraz komunikat ODRZUCAM_MSG do IP_N - abonenta ktory probuje nawiazac polaczenie. Pole global_ttl jest ustanawiane wg widzimisie abonenta tworzacego token polaczenia. Protokol tego nie narzuca. dane specyficzne: IP_N uint32 IP abonenta ktory chce nawiazac polaczenie IP_O uint32 IP abonenta wywolywanego port sterujacy uint16 port na ktorym abonent nawizaujacy polaczenie oczekuje komunikatow sterujacych port logiczny uint16 port na ktorym abonent nawiazujacy polaczenie oczekuje danych dzwiekowych ttl uint32 czas po jakim nalezy ponowic pytanie o chec nawiazania polaczenia global_ttl uint32 czas po jakim nalezy usunac tego tokena z obiegu dlugosc laczna: 4 + 4 + 2 + 2 + 4 + 4 = 20 [B] +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | |ttl | global_ttl | +-----+--------+---------------+----------------------------------------------+ W ponizszych komunikatach jesli rysunek powyzszy pojawia sie bez opisu, interpretacja pol identyczna jak tutaj. (Wartosc typu jest wszedzie inna) ZAWIESZONE_TOKEN_MSG -------------------- Komunikat "token" transportujacy informacje o zawieszonym polaczeniu. Komputer posiadajacy ten "token", ma prawo do odwieszenia polaczenia, wpp przekazuje go dalej. Pole global_ttl ustawione na -1 oznacza ze token ma krazyc dopoki nie zostanie jakas wlasciwa kacja podjeta - czyli w razie jakis nieprawidlowosci moze sie okazac ze w nieskonczonosc. Gdy golbal_ttl ma wartosc > 0, jest zmniejszane o 1. Jesli ma wartosc = 0 oznacza to ze tokena nalezy juz wyeliminowac czyli zostaje wyslany komunikat KILL_MSG do tworcy tokena (tutaj IP_O), oraz komunikat ODWIESZAM_MSG a nastepnie ROZLACZAM_MSG do IP_N - abonenta ktory probuje nawiazac polaczenie. +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | |global_ttl | +-----+--------+---------------+----------------------------------------------+ KILL_MSG -------------------- Komunikat wysylany przez abonenta ktory przestaje przekazywac dalej token do abonenta ktory go utworzyl. Ma umozliwic tworcy tokena usuniecie polaczenia(zawieszonego/oczekujacego) z odpowiedniej listy, poniewaz polaczenia te przestaja byc aktualne. token_type uint32 nr typu tokena ktory jest ubijany w celu zidentyfikowania z ktorej listy nalezy go wywalic token_id uint32 identyfikator polaczenia ktore nalezy usunac z listy, zawarty w tokenie ktory jest usuwany z obiegu +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | token_type | token_id | | | | | | +-----+--------+---------------+----------------------------------------------+ 4.2 Komunikaty do nawiazywania polaczen ======================================= WYWOLUJE_MSG ------------ Komunikat inicjujacy polaczenie przez wywolujacego. Reakcja wywolywanego moze byc wyslanie komunikatu ODBIERAM_MSG, ODRZUCAM_MSG, badz utworzenie tokena POLACZENIE_TOKEN_MSG i puszczenie go w obieg. Identyfikator polaczenia jest tu ustalany przez wywolujacego. Pozniej cala rozmowa jest na jego podstawie identyfikowana (polaczenia na listach polaczen, komunikaty glosowe) +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | | +-----+--------+---------------+----------------------------------------------+ ODBIERAM_MSG ------------ Komunikat wysylany przez wywolywanego, badz czlonka jego grupy, do wywolujacego. Zastosowanie opisane w opisie stanow. +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | | +-----+--------+---------------+----------------------------------------------+ ODRZUCAM_MSG ------------ Komunikat wysylany przez wywolywanego, badz czlonka jego grupy, do wywalujacego. Zastosowanie podane w opisie stanow. +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | | +-----+--------+---------------+----------------------------------------------+ ROZLACZAM_MSG ------------- Komunikat wysylany przez ktorakolwiek ze stron polaczenia, badz w przypadku zawieszonego polaczenia przez tego, kto nie zawieszal. +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | | +-----+--------+---------------+----------------------------------------------+ PRZESTAJE_DZWONIC_MSG --------------------- Komunikat wysylany przez wywolujacego w przypadku rezygnacji z wywolywania. +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | | +-----+--------+---------------+----------------------------------------------+ ZAWIESZAM_MSG ------------- Komunikat wysylany przez jednego rozmowce do drugiego, powoduje przerwanie transmisji danych logicznych(glosowych). Po wyslaniu komunikatu abonent znajduje sie w stanie CHCE_ZAWIESIC_STATE. Oczekuje na komunikaty OK_MSG, badz ZAWIESZAM_MSG wyslane przez Abonenta z ktorym rozmowe chce zawiesic. Pole losowa_liczba sluzy do determinacji ktory rozmowca faktycznie zawiesil polaczenie w przypadku rownoczesnego zawieszania - zawiesil ten o wyzszej liczbie losowej. W przypadku rownych liczb uznaje sie ze zawiesil ten o wyzszym IP(w leksykograficznym porzadku rosnacym). +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | losowa_liczba(uint32, rozmiar: 4B) | | | | | | +-----+--------+---------------+----------------------------------------------+ ODWIESZAM_MSG ------------- Kounikat moze byc wyslany przez dowolnego abonenta z grupy abonenta ktory zawiesil polaczenie o parametrach w komunikacie. Do wyslania tego komunikatu uprawnia token ZAWIESZONE_TOKEN_MSG +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | | +-----+--------+---------------+----------------------------------------------+ ZAJETE_MSG ---------- Komunikat wysylany przez wywolywanego wywolujacemu. Informuje o braku wolnych linii. Dane specyficzne oraz identyfikator sa przepisywane z komunikatu wywolujacego polaczenie. +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | | +-----+--------+---------------+----------------------------------------------+ NADAL_DZWONISZ_MSG ------------------ Komunikat w ktorym wywolywany upewnia sie do aktualnosci polaczenia. Na wypadek gdyby wywolujacy "sie popsul" na przyklad. Po timeoucie QUERY_TIMEOUT abonent uznaje ze rozmowa juz nie aktualna i podejmuje decyzje o nie transportowaniu dalej tokena z informacjami o polaczeniu. +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | | +-----+--------+---------------+----------------------------------------------+ NADAL_DZWONIE_MSG ----------------- +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | | +-----+--------+---------------+----------------------------------------------+ ODWIESZAM_GR_MSG ---------------- Komunikat wysylany przez abonenta odwieszajacego polaczenie, do abonenta z tej samej grupy! ktory zawiesil to polaczeni - ma sluzyc informacji o tym ze tego zawieszonego polaczenia juz nie ma. Abonent ktory orginalnie je zwiesil usuwa je z listy polaczenia_zawieszone. +-----+--------+---------------+----------------------------------------------+ | typ |dlugosc | identyfikator | dane specyficzne | | | | polaczenia |--------------------------------------------- | | | | | IP_N | IP_O | port sterujacy | port logiczny | | | | | | +-----+--------+---------------+----------------------------------------------+ 4.3 Komunikaty z wlasciwymi danymi - glosem =========================================== VOICE_MSG --------- Komunikat transportujace dane glosowe. Protokol nie zajmuje sie formatem tych danych. Komunikaty maja nadawane numery, by umozliwic pomijanie komunikatow ktore przyszly w niewlasciwej kolejnosci. Pola nr uint32 numer komunikatu(kolejnosc) dane_glosowe nieznany wlasciwe dane dzwiekowe +-----+-----------+-----------------+---------------------------------------+ | typ | dlugosc | identyfikator | dane specyficzne | | | | polaczenia |---------------------------------------| | | | | nr | dane_glosowe | +-----+-----------+-----------------+---------------------------------------+ 5. Opis stanow ============== Kazdy abonent ma zmienna free_lines oznaczajaca liczbe wolnych linii w grupie, ktora zwieksza o 1 przy otrzymaniu komunikatu ZWALNIAM_LINIE_MSG, zmniejsza o 1 przy otrzymaniu komunikatu ZAJMUJE_LINIE_MSG. Abonent utrzymuje listy: polaczenia_aktywne - tylko zestawione polaczenia, ich identyfikatory polaczenia_zawieszone - identyfikatory zawieszonych polaczen, i pole mowiace czy nalezy usunac token danego polaczenia jesli nadejdzie polaczenia_oczekujace - polaczenia wywolane przez abonenta - ich identyfikatory (* nie mylic z polaczeniami przychodzacymi od innego abonenta, one sa na liscie ktos_dzwoni *) chce_rozmawiac - polaczenia ktore abonent planuje wykonac, (aplikacja otrzymala od usera komunikat) ktos_dzwoni - polaczenia wywolywane przez innego abonenta, wraz z informacja czy przestal dzwonic i nalezy usunac z obiegu tokena z tym polaczeniem Przejscia pomiedzy stanami i komunikaty ze szczegolna troska przedstawione na diagramach. W koncu 1 obrazek = 1K slow! Komunikaty ODWIESZAM_MSG/ODBIERAM_MSG odnoszace sie do polaczenia ktorego abonent nie ma na listach odpowiednio polaczenia_zawieszone/polaczenia_oczekujace skutuja odeslaniem komunikatow ROZLACZAM_MSG z paramtrami polaczenia zawartymi w otrzymanym komunikacie. Komunikat ROZLACZAM_MSG/ODWIESZAM_GR_MSG otrzymany w stanach w ktorych na listach odpowiednio polaczenia_aktywne(lub polaczenia_zawiszone)/polaczenia_zawieszone nie ma odpowiednich polaczen sa ignorowane. 5.1.1 Stany glowne ================== Stany opisane sa w przeplocie ze ogolna charakterystyka dzialania. W skrocie schemat rozmowy przebiega nastepujaco: Abonent nie rozmawia. Abonent jest w stanie: BASIC_STATE ----------- Scenariusz podstawowy: Abonent zostaje wywolany. Znajduje sie w stanie: KTOS_DZWONI_STATE ----------------- Scenariusz podstawowy: -Jesli widzi w swojej lokalnej zmiennej ze nie ma wolnych linii (licznik free_lines == 0) zwraca informacje o zajetosci - komunikat ZAJETE_MSG, i pozostaje w stanie BASIC_STATE. Jesli sa wolne linie: -Jesli chce odebrac, czeka az dojdzie do niego komunikat token z jakas linia, ztrzymuje ten komunikat, i zestawia polaczenie na tej linii, tzn. wysyla komunikat ODBIERAM_MSG, oraz do wszystkich pozostalych z grupy ZAJMUJE_LINIE_MSG. I od tej pory jest klasywfikowany jako stan ROZMAWIAM_STATE. Pozostale przychodzace polaczenia kolejkuje zliczajac jednoczesnie czy hipotetycznie starcza na nie linii. Jesli otrzyma komunikaty o zajetosci kolejnych linii, i przestanie hipotetycznie wystarczyc linii do obsluzenia zakolejkowanych polaczen, zaczynajac od najpozniej przybylych, usuwa je, podejmujac akcje: - w przypadku gdy bylo to polaczenie przychodzace od innego abonenta wysyla mu komunikat ZAJETE_MSG - gdy bylo to polaczenie zainicjowane przez uzytkownika aplikacji, odsyla mu wiadomosc zwrotna o niemozliwosci wykonania polaczenia. Protokol nie wglebia sie w interfejs uzytkownika. -Jesli nie chce rozmawiac, tworzy komunikat POLACZENIE_TOKEN_MSG, i puszcza go w obieg. Sytuacje szczegolne: POLACZENIE_TOKEN_MSG zawiera pole ttl(time to live), zainicjowane iloscia komputerow w grupie. Kazdy abonent kolejny przekazujacy ten komunikat zmniejsza ttl o 1. -Jesli abonent pusci w obieg komunikat POLACZENIE_TOKEN_MSG, a nastepnie otrzyma PRZESTAJE_DZWONIC_MSG, zaznacza na liscie kto_dzwoni ze nalezy usunac ten token. Gdy otrzyma taki token, ktory ma ttl = 0, zgodnie z informacjami o polaczniu wysyla do wywolujacego pytanie czy aktualne NADAL_DZWONISZ_MSG. Jesli po czasie QUERY_TIMEOUT nie otrzyma odpowiedzi uznaje ze abonent juz nie dzwoni i nie przesyla dalej tokena. Jesli otrzymal otrzymal komunikat o ktorym przechowuje informacje ze ma go dalej nie przekazywac, usuwa wogole informacje o tym polaczeniu z listy. -pozostale komuniakty z ktorymi moglby cos zrobic maja mniejszy priorytet - abonent przekazuje je dalej, dopoki nie zakonczy jakos scenariusza zwiazanego z tym stanem ROZMAWIAM_STATE --------------- Czyli sa jakies zestawione rozmowy, ale nie ma zadnej nowej akcji zainicjowanej - nie jest wywolywany, ani nie chce sam dzownic. -jakies inne komunikaty takie odnosnie nie tego polaczenia - traktuje tak samo jak BASIC_STATE. -jesli chce rozlaczyc - wysyla komunikat rozlaczam, nie czekajac na potwierdzenie. -chce zawiesic - zawiesza, towrzy token zawieszone polaczenie, ktory krazy po grupie i czeka az ktos go odwiesi -otrzymuje komunikat ZAWIESZAM_MSG - przerywa transmisje glosu, odsyla komunikat OK_MSG z danymi z komunikatu ZAWIESZAM_MSG, przechodzi do stanu KTOS_ZAWIESIL_STATE, po jakims czasie rozlacza takie zawieszone polaczenie. -chce rozlaczyc - to rozlacza, usuwa informacje o tym polaczeniu ze swoich struktur. Ogolnie gdy chce zadzownic, przechodzi w stan: CHCE_ZADZWONIC_STATE -------------------- Czeka na tokena z linia, przychodzace rozmowy obsluguje/ kolejkuje dopoki starcza WLT. Chec rozmowy i przychodzace polaczenia sa utrzymywane w kolejkach(listach). Gdy zmniejsza sie linia WLT, odpowiednie komunikaty o zajetosci sa odsylane innym abonentom, badz uzytkownikowi aplikacji.(Jak opisane wyzej) Gdy dostaje tokena z linia, nie wypuszcza go, wywoluje abonenta, i rozsyla komunikat ZAJMUJE_LINIE_MSG. Przechodzi w stan DZWONIE_STATE. Stany CHCE_ZADZWONIC_STATE, oraz KTOS_DZWONI_STATE moga wystepowac jednoczesnie. Ogolnie - stany tycza sie raczej pojedynczych linii, w sumie abonent jest w tylu stanach ile stanow wystepuje w sumie na liniach. DZWONIE_STATE ------------- Scenariusz podstawowy: -Otrzymuje komunikat ODBIERAM_MSG. Polaczenie zostaje zestawione. Przechodzi w stan ROZMAWIAM_STATE. -Otrzymuje komunikat ODRZUCAM_MSG. Wysyla do wszystkich komunikat ZWALNIAM_LINIE_MSG. Przechodzi do BASIC_STATE. -Uzytkownik postanawia zaniechac dzwonienia. Abonent wysyla do wywolywanego komunikat PRZESTAJE_DZWONIC_MSG. Do grupy wysyla ZWALNIAM_LINIE_MSG. Przechodzi do BASIC_STATE. CHCE_ZAWIESIC_STATE ------------------- Abonent wyslal ZAWIESZAM_TOKEN_MSG. Teraz czeka albo na potwierdzenie - OK_MSG, albo na komunikat ZAWIESZAM_TOKEN_MSG od rozmowcy ktorego on wlasnie probowal zawiesic. Jesli otrzyma OK_MSG, uznaje ze to on zawiesil polaczenie, tworzy ZAWIESZONE_TOKEN_MSG, i puszcza w obieg. Jesli otrzyma ZAWIESZAM_TOKEN_MSG to: jesli jego IP jest wieksze w rosnacym porzadku leksykograficznym niz IP rozmowcy z ktorym "walczy" o prawo do zawieszenia (rozmowcy ktory przyslal ZAWIESZAM_TOKEN_MSG) to uznaje ze on zawiesza i towrzy token polaczenia i puszcza go w obieg. Wpp uznaje ze to rozmowca zawiesil i przechodzi w stan KTOS_ZAWIESIL_STATE. ZAWIESILEM_STATE ---------------- Abonent zawiesil polaczenie. Puscil w obieg tokena z zawieszonym polaczeniem. Scenariusz podstawowy: - Abonent dostaje komuniakt ODWIESZAM_GR_MSG. Oznacza to ze ktos inny z grupy odwiesza to polaczenie. Abonent usuwa informacje o tym polaczeniu ze swoich zmiennych zawieszone_polaczenia. Przechodzi do stanu BASIC_STATE. - Abonent dostaje komunikat ROZLACZAM_MSG. Rozmowca rozlacza zawieszone polaczenie. Trzeba usunac krazacego tokena z informacja o istniejacym zawieszonym polaczeniu, tzn spowodowac zaprzestanie przekazywania go dalej. Jesli zanim to sie stanie ktos sprobuje odwiesic polaczenie, rozmowca ktory je rozlaczyl odesle mu informacje ze rozlacza polaczenie. Abonent ktory otrzymal informacje o rozlaczeniu zawieszonego polaczenia zapisuje sobie ze ma je rozlaczyc. Za kazdym razem gdy przychodzi do niego jakis token z informacja o zawieszonym polaczeniu, sprawdza czy ma go przekazywac dalej, czy nie. Po tym jak napotka na takiego ktorego ma nie przekazywac dalej, usuwa wogole informacje o tym polaczeniu. KTOS_ZAWIESIL_STATE ------------------- Rozmowca zawiesil polaczenie. Scenariusz podstawowy: - Uzytkownik postanawia rozlaczyc polaczenie. Abonent wysyla komunikat ROZLACZAM_MSG. Wraca do stanu BASIC_STATE. W stanie BASIC_STATE na wszystkie komunikaty dotyczace nieistniejacych polaczen/odwieszen, odpowiada komunikatem ROZLACZAM_MSG. - Abonent otrzymuje komunikat ODWIESZAM_MSG. Zestawia polaczenie z wysylajacym komunikat. Usuwa polaczenie z listy polaczen zawieszonych, dodaje do polaczen aktywnych. 5.1.2 Stany pomocnicze ====================== Ponizsze stany sluza do wyrazenia nastepujacego schematu dzialani: abonent dostaje komunikat, nastepnie ma alternatywe: robi jakas czynnosc na ktora ten komunikat mu nadaje uprawnienia, badz przesyla komunikat dalej. MAM_LINIA_TOKEN_STATE --------------------- MAM_POLACZENIE_TOKEN -------------------- MAM_ZAWIESZONE_TOKEN ------------------- 5.2 Diagram stanow ================== Podpisy umiszczone sa po prawej badz na gorze wzgledem zaleznosci (strzalek) do ktorych sie odnosza, chyba ze wyraznie zaznaczono inaczej przy pomocy | laczacego napis z zaleznoscia(strzalka) ktorej ma dotyczyc. Napisy w znacznikach /napis/ sa pomocniczym komentarzem opisujacym zaleznosci od akcji uzytkownika, znaki "?"/ "!" oznaczaja odpowiednio odbior/wyslanie komunikatu. Tekst pisany mala litera - warunki dodatkowe dotyczace np. stanu zmiennych. || - alternatywa komunikatow/warunkow, brak symbolu - koniunkcja 5.2.1 Ogolny diagram stanow =========================== LINIA_TOKEN_MSG? free_lines > 0 ZAJMUJE_LINIE_MSG! WYWOLUJE_MSG! +----------------------+ +---------------+ | CHCE_ZADZWONIC_STATE | -------> | DZWONIE_STATE | +----------------------+ +---------------+ ^ | | | | | | ODRZUCAM_MSG? | | LINIA_TOKEN_MSG? | +---------------------------------+ | LINIA_TOKEN_MSG! | | | ---- | | |ODBIERAM_MSG? | | +----+ | | | V | | +-------------+ +-------------+ | POLACZENIE_TOKEN_MSG?|| +-----------------+ | | BASIC_STATE |<------+ ZAWIESZONE_TOKEN_MSG? | ROZMAWIAM_STATE |<----+ | |-------------------------------->| | | | | | | | | | | |(ROZLACZAM_MSG?||ROZLACZAM_MSG!) | | | |ZWALNIAM_LINIE_MSG! | | | |LINIa_TOKEN_MSG! | | | |<--------------------------------| | +-------------+<------------+ +-----------------+ ^ | | ^ | | | | | | | | | |WYWOLUJE_MSG? |POLACZENIE_TOKEN_MSG!| | | | | | || | | | | | |(free_lines == 0 | | | | | |ZAJETE_MSG!) | | | | | | | | | | | | | | | | | | free_lines > 0 | | | | | | LINIA_TOKEN_MSG? | | | | | +-------------------+ ODBIERAM_MSG! | | | | +->| KTOS_DZWONI_STATE |--------------------+ | | | +-------------------+ | | | | | | | | |ROZLACZAM_MSG! +-------------------------+ | +---------------------+ | +------------------+ | | KTOS_ZAWIESIL_STATE |<---+ | ZAWIESLIEM_STATE |<---+ +---------------------+ | +------------------+ | ZAWIESZAM_MSG? ZAWIESZAM_MSG! 5.2.2 Uszczegolowiony diagram okolic BASIC_STATE ================================================ LINIA_TOKEN_MSG! +------------------------ +-----------------------+ | LINIA_TOKEN_MSG? | | | +------------------> | MAM_LINIA_TOKEN_STATE | | | +-----------------------+ +-------------+<--+ | POLACZENIE_TOKEN_MSG? +---------------------------+ | |--------+-------------------------->| | | BASIC_STATE | +-----|MAM_POLACZENIE_TOKEN_STATE | | | | +---------------------------+ +-------------+ |/chce sie polaczyc/ ^ | |ODBIERZ_MSG! | | | +-----------------+ | | +---->| ROZMAWIAM_STATE | | | +-----------------+ | | ZAWIESZONE_TOKEN_MSG? +-------------------+ | +----------------------->| MAM_ZAWIESZONE_TOKEN| |/nie chce odwieszac/ | | +-----------------------------| |---+ +---------------------+ |/chce odwiesic/ |ODWIESZAM_MSG! | +---------------------+ | | ROZMAWIAM_STATE |<--+ +---------------------+ 6. Podsumowanie uzywanych numerow ================================= Numery typow odpowiednich komunikatow: LINIA_TOKEN_MSG_TYP 101 ZWALNIAM_LINIE_MSG_TYP 102 ZAJMUJE_LINIE_MSG_TYP 103 POLACZENIE_TOKEN_MSG_TYP 104 ZAWIESZONE_TOKEN_MSG_TYP 105 WYWOLUJE_MSG_TYP 201 ODBIERAM_MSG_TYP 202 ODRZUCAM_MSG_TYP 203 ROZLACZAM_MSG_TYP 204 RZESTAJE_DZWONIC_MSG _TYP 205 ZAWIESZAM_MSG_TYP 206 ODWIESZAM_MSG_TYP 207 ZAJETE_MSG_TYP 208 NADAL_DZWONISZ_MSG_TYP 209 NADAL_DZWONIE_MSG_TYP 210 ODWIESZAM_GR_MSG_TYP 211 VOICE_MSG_TYP 301