5.2. Cykl życia linii telefonicznej z punktu widzenia pojedynczego abonenta

Niniejszy rozdział opisuje cykl życia pojedynczego abonenta, to znaczy takiego, który nie jest zrzeszony w żadnej grupie.

Notacja: USER? + KOMUNIKAT_MSG! oznacza, że akcja jest zapoczątkowana przez użytkownika, oraz że w jej wyniku przechodząc do danego stanu wysyłamy do drugiej strony rozmowy komunikat KOMUNIKAT_MSG.

Notacja: STH1 | STH2 oznacza, że przejście pomiędzy stanami może zostać wywołane albo na skutek STH1 albo na skutek STH2.

Rysunek 5.2. Diagram ilustrujący stany pojedynczego abonenta

Diagram ilustrujący stany pojedynczego abonenta

Po odebraniu komunikatu ODEBRANIE_MSG użytkownik otwiera kanał transportowy z użytkownikiem podanym w komunikacie (patrz Sekcja 4.1.2, „Opis komunikatu ODEBRANIE_MSG”). Kanałem transportowym wymieniane są komunikaty GLOS_MSG niosące ze sobą głos. Oprócz nawiązania połączenia (kanału) transportowego może też wystąpić potrzeba nawiązania nowego połączenia (kanału) logicznego, o ile odbiorca podany w ODEBRANIE_MSG jest inny niż ten, do którego wysyłaliśmy WYWOLANIE_MSG (rzecz taka może mieć miejsce, jeśli dzwonimy do grupy).

Kwestią zależną od implementacji jest działanie w przypadku otrzymania komunikatów GLOS_MSG nie po kolei (zawierają one numer kolejny, więc stosunkowo łatwo to wychwycić). W tym miejscu warto jedynie wspomnieć o dwóch najprostszych możliwościach: buforowanie komunikatów lub przesyłanie danych nadmiarowych i ignorowanie komunikatów przychodzących poza kolejnością.

Podobnie ma się rzecz przy odbieraniu komunikatu ODWIESZENIE_MSG (Sekcja 4.1.7, „Opis komunikatu ODWIESZENIE_MSG”). Odbiorca tego komunikatu nawiązuje połączenie ze swoim (być może nowym rozmówcą) - zarówno połączenie logiczne (o ile zmienił się rozmówca), jak i zerwane połączenie transportowe (kanał transportowy).

5.2.1. Obrona przed podwójnym zawieszeniem

Powyższy (uproszczony) schemat wymaga doprecyzowania w obrębie zawieszania połączenia.

Dla przejrzystości, doprecyzowanie to, nie zostało uwzględnione na powyższym rysunku.

Kiedy abonent pragnie zawiesić połączenie telefoniczne, wysyła swojemu rozmówcy komunikat ZAWIESZENIE_MSG i przechodzi do stanu CZEKAM_NA_ZAWIESZENIE_STATE. W tym stanie przebywa tak długo, dopóki nie dostanie komunikatu ZAWIESZENIE_ODP_MSG. Jeśli odpowiedź jest twierdząca, to uważa połączenie za zawieszone przez siebie, w przeciwnym razie uważa, że połączenie zostało zawieszone przez jego rozmówcę. Tak czy tak, przechodzi do stanu LINIA_ZAWIESZONA_STATE.

Będąc w stanie CZEKAM_NA_ZAWIESZENIE_STATE, w przypadku nadejścia komunikatu ZAWIESZENIE_MSG, rozmówca decyduje, która z próśb o zawieszenie (jego, czy jego rozmówcy) jest ważniejsza i na tej podstawie odsyła komunikat ZAWIESZENIE_ODP_MSG.

Decyzja wyboru, które z żądań zawieszenia połączenia jest ważniejsze podejmowana jest na podstawie porównania liczb losowych zawartych w wysłanym przez nas i w otrzymanym żądaniu, a w przypadku, gdy to nie przyniesie rezultatu, wygrywa osoba o mniejszym (w sensie leksykograficznym - porównywanie 4 bajtów) numerze IP.