Precision Time Protocol

Z Wikipedii, wolnej encyklopedii

Precision Time Protocol (PTP) – protokół precyzyjnej synchronizacji czasu poprzez sieć Ethernet.

Wprowadzenie[edytuj | edytuj kod]

Protokół PTP umożliwia osiągnięcie dokładności synchronizacji zegarów w sieci Ethernet poniżej mikrosekundy, co umożliwia zastosowanie go do synchronizacji urządzeń końcowych we wrażliwych czasowo aplikacjach automatyki przemysłowej, telekomunikacji oraz energetyki, gdzie implementacja tego protokołu jest istotnym elementem zapewnienia komunikacji w stacjach energetycznych tworzonych w oparciu o normę IEC 61850. Zastosowanie protokołu PTP pozwala uniknąć konieczności stosowania odbiorników GPS w urządzeniach końcowych lub użycia oddzielnego medium transmisyjnego jak w przypadku protokołu IRIG-B.

Wersje protokołu[edytuj | edytuj kod]

Protokół PTP został po raz pierwszy opublikowany w standardzie IEEE 1588-2002 "Standard for a Precision Clock Synchronization Protocol for Networked Measurement and Control Systems" w 2002 roku. W 2008 roku została opublikowana w standardzie IEEE 1588-2008 jego poprawiona wersja, określana jako PTP wersja 2 (PTPv2), umożliwiająca osiągnięcie większej dokładności synchronizacji i odporności na zmiany topologii sieci. Protokół w wersji drugiej nie jest kompatybilny wstecz z wersją pierwszą.

Działanie[edytuj | edytuj kod]

Protokół PTP korzysta z architektury Master – Slave. W pierwszej fazie działania protokołu poprzez algorytm Best Master Clock (BMC) w obrębie domeny wybierany jest węzeł posiadający dostęp do najlepszego zegara (który zazwyczaj jest dostarczany poprzez odbiornik GPS). Po wyborze przez urządzenia zegara nadrzędnego następuje synchronizacja do niego zegarów podrzędnych. Podzielona jest ona na dwie fazy, w pierwszej fazie liczona jest różnica pomiędzy zegarami urządzeń Slave oraz Master. W drugie fazie liczone jest opóźnienie transmisji pomiędzy zegarami.

PTPv1 definiuje dwa typy urządzeń (portów Ethernet) określanych również ze względu na ich rolę zegarami: zegar zwykły (ang. ordinary clock) oraz brzegowy (ang. boundary clock). Wersja PTPv2 została rozszerzona także o zegar transparentny (ang. transparent clock).

Zegar zwykły jest urządzeniem końcowym będącym źródłem zegara, lub jego odbiorcą. Zegar brzegowy służy natomiast do przenoszenia zegara pomiędzy kolejnymi domenami. W obrębie każdej domeny zegary brzegowe mogą pełnić funkcję podrzędną względem zegara głównego lub nadrzędną względem kolejnej dołączonej domeny, dla której stanowią źródło zegara. Konfiguracja taka pozwala tworzyć połączenia w których wiele domen spiętych jest w jedną magistralę synchronizującą się do pojedynczego zegara nadrzędnego. Wiąże się to jednak z pogorszeniem dokładności synchronizacji dla kolejnych węzłów magistrali.

Rozwiązaniem tego problemu są zegary transparentne wprowadzone w PTPv2. Standard IEEE-1588-2008 definiuje dwa typy zegarów transparentnych: peer-to-peer (P2P) oraz end-to-end (E2E). Zegary E2E uzupełniają komunikaty PTP o czas potrzebny na przesłanie wiadomości przez węzeł, zegary P2P dodatkowo uwzględniają opóźnienie pomiędzy węzłami. Oba typy zegarów transparentnych nie synchronizują samych siebie do przechodzących ramek synchronizacyjnych, a jedynie pośredniczą w ich przepływie.

Transmisja[edytuj | edytuj kod]

W początkowej wersji protokołu do transmisji były wykorzystywane jedynie pakiety IP (zarówno IPv4 jak i IPv6) typu (multicast). Wersja druga protokołu wprowadziła ponadto możliwość komunikacji poprzez pakiety typu unicast. Do przesyłania komunikatów PTP mogą zostać użyte również ramki Ethernet bez nagłówków IP. W celu zapewnienia szybszej i pewniejszej transmisji w przypadku obciążenia sieci wiadomości ramki zawierające wiadomości PTP często oznaczane są nagłówkiem VLAN o odpowiednio wysokim priorytecie.

Zsynchronizowane ze sobą urządzenia poprzez cały czas działania protokołu wysyłają zapytania do zegara nadrzędnego (lub do urządzeń sąsiadujących w przypadku trybu P2P), o aktualny czas opóźnienia. Pozwala to dynamicznie reagować na zmiany zachodzące w sieci.

Linki zewnętrzne[edytuj | edytuj kod]