MATERIAŁY DO PRZEDMIOTU "SYSTEMY I APLIKACJE PEER-TO-PEER"
MICROSOFT P2P TUTORIAL





Spis Treści:






Wstęp

Poniższy tutorial opisuje platformę Microsoft Peer-to-Peer. Wraz z tutorialem dostępne są programy demonstrującey możliwości tej technologii.
Program jest w formie projektu do programu Microsoft Visual Studio.
W treści tutorialu czytający będzie mógł zauważyć [program/plik; linia] do konkretnego miejsca w kodzie programu. Na przykład [pnrp.exe/pnrp.c; 923] oznacza, że użycie funkcji jest w projekcie programu pnrp.exe w pliku źródłowym pnrp.c w linii 923






Część 1: Wymagania systemowe


  1. System Microsoft Windows Vista, lub Microsoft Windows XP (z SP2). W tym tutorialu opisane jest użycie Windows XP (z SP2)
  2. W przypadku, gdy posiadamy Microsoft Windows XP wymagane jest zainstalowanie PNRP update: http://support.microsoft.com/default.aspx/kb/920342.
  3. Edytor Microsoft Visual Studio. W tutorialu użyto ostatniej wersji - 2008 Beta 2 PRO (~3gb): http://www.microsoft.com/downloads/details.aspx?FamilyID=B98A61BA-99B0-40B7-AB6E-5386A2B94217&displaylang=en.
  4. Przykładowy program ilustrujący poniższy tutorial.
    Program jest spakowanym katalogiem, który zawiera gotowe projekty do edytora Visual Studio: [MicrosoftP2P.zip] | [MicrosoftP2P.tar.gz].





Część 2: Ustawienie środowiska i uruchomienie przykładowych programów


Należy ściągnąć i zainstalować edytor Microsoft Visual Studio. W przypadku posiadania Microsoft Windows XP (z service pack'iem 2) należy pobrać i zainstalować aktualizację (pakiet KB920342). Jest to uaktualnienie protokołu Peer Name Resolution Protocol (PNRP) z wersji 1.0 do wersji 2.0. Wersja 1.0 nie jest kompatybylna z wersją 2.0 zainstalowaną domyślnie w Windows Vista.
Po zainstalowaniu pakietu, należy włączyć wspomaganie platformy P2P.
Programy przedstawione w tym tutorialu są dostępne na stronie projektu Windows Peer-to-Peer Networking: http://technet.microsoft.com/en-us/network/bb545868.aspx. Plik archiwum zawiera dwa katalogi (dwa projekty), w których są zawarte pliki źródłowe i pliki projektów *.vcproj, które nalezy załadować do edytora.

Włączenie platformy P2P w systemie Windows XP

Z "Panelu Sterowania" wybrać Dodaj/Usuń programy, a następnie wybrać zakładkę Dodaj/Usuń składniki systemu Windows.
W oknie "Kreator składników systemu Windows" zaznaczyć Usługi sieciowe i wybrać opcję Szczegóły.., a następnie zaznaczyć opcję Równorzędne. Opcja ta włącza platformę Peer-2-Peer.
Na poniższym rysunku przedstawiono okna z zaznaczonymi opcjami:


Po zaznaczeniu opcji Równorzędne wybrać ok a następnie dalej. Kreator doinstaluje i skonfiguruje odpowiednie elementy platformy.



Po pomyślnym zainstalowaniu należy sprawdzić, czy obsługa platformy P2P jest włączona.
w wierszu poleceń wpisujemy komendę:

netsh p2p pnrp cloud show list



Powinniśmy uzyskać wynik jak na obrazku powyżej. Domyślnie jesteśmy przypisani do chmury (pojęcie opisane w dalszej części tutorialu i odpowiada grupie węzłów) Globalnej (Global_), oraz do chmury lokalnej (LinkLocal) odpowiadającej naszemu połączeniu lokalnemu.
W przypadku, gdy posidamy kilka połączeń sieciowych jest możliwe, aby nasz host był przypisany do większej ilości chmur.
Dodatkowo po wydaniu polecenia ifconfig otrzymujemy nowe interfejsy zgodnie z rysunkiem poniżej:








Uruchomienie programu PNRP

Program PNRP demonstruje użycie protokołu Peer Name Resolution Protocol. Po prawidłowym wczytaniu projektu do Visual Studio otrzymamy widok jak na rysunku poniżej:



Aby zbudować projekt należy wybrać Build, a następnie opcję Build pnrp, która spowoduje skompilowanie i utworzenie pliku wykonywalnego *.exe


Aby uruchomić program należy zlokalizować plik pnrp.exe i uruchomić go. Plik znajduje się w katalogu projektowym, w podkatalogu /Debug, lub LH_DEBUG.
Program działa w trybie tekstowym i psiada menu z opcjami do wyboru:



Pozwala zarejestrować nazwę Peera (1), wyszukać nazwę peera (2), oraz wylistować dołączone do peera chmury węzłów (3). Podczas użycia aplikacji nie da się uzyskać nazwy, którą zarejestrowała ta sama kopia programu (należy uruchomić drugi program, żeby uzyskać zarejestrowaną nazwę).
Poniższy przykład pokazuje użycie programu. Na początku wyświetlono do których chmur dołączony jest program, a następnie zarejestrowano nazwę.



Podczas rejestracji nazwy zdecydowano się użyć domyślnego adresu i zarejestrować nazwę do chmury lokalnej. Ustawiono komentarz na "PNRPTest" i dodatkowe dane na ciąg znaków: "<<<nic>>>".
nie zdecydowano się na zabezpieczanie nazwy (część authority w nazwie będzie miała wartość '0'), a classifier ustawiono na "MojPeer".
Program zarejestrował nazwę jako 0.MojPeer (szczegóły nazw PNRP omówiono w dalszej części tutoriala).
Aby przetestować, czy program prawidłowo zarejestrował nazwę peera trzeba uruchomić drugą kopię programu (nie wyłączając pierwszej), a następnie wybrać opcje zgodnie z rysunkiem poniżej:



Jak widać program właściwie odnalazł adres przypisany do nazwy 0.MojPeer






Uruchomienie programu GraphChat

Program GraphChat demonstruje użycie GRAPHING API oraz adresacji PNRP. Aplikacja pozwala na: Utworzenie grafu, dołączenie się (i odłączenie) do istniejącego grafu, dodawanie rekordów do grafu (tutaj rekordami są wypowiedzi w czacie), oraz połączeń bezpośrednich. Program posiada Graficzny Interfejs Użytkownika i składa się z dwóch projektów (jeden dla Win XP a drugi dla Win Vista)
Po prawidłowym wczytaniu projektu do Visual Studio otrzymamy widok jak na rysunku poniżej:



Aby zbudować projekt należy wybrać Build, a następnie opcję Build pnrp, która spowoduje skompilowanie i utworzenie pliku wykonywalnego *.exe (analogicznie jak w poprzednim przykładzie)


Aby uruchomić program należy zlokalizować plik graphchat.exe i uruchomić go. Plik znajduje się w katalogu projektowym, w podkatalogu /Debug, lub LH_DEBUG.
Po uruchomieniu programu otworzy się okno pokazane poniżej:



Wybieramy opcję Graph i New Graph a następnie w nowo otwartym oknie wpisujemy nazwę grafu (nazwa pojawi się jako część classifier w adresacji PNRP), nazwę użytkownika, oraz zasięg (chmurę). Na potrzeby programu wybrano chmurę lokalną i nazwę moj_czat



Po zatwiedzeniu program rejestruje nazwę w PNRP i tworzy nowy graf. Możemy wpisywać wiadomości, które pojawią się w głównym obszarze. Po prawej stronie obszaru głównego będzie wyświetlana lista dołączonych do grafu.
Komunikaty zaczynające się od [System] są komunikatami systemu, pozostałe komunikaty zaczynają się od ciągu typu [nick_użytkownika]: a następnie wypisywana jest wiadomość od użytkownika



Dla lepszego zobrazowania użycia PNRP spróbujmy wyszukać zarejestrowaną nazwę przy pomocy programu pnrp.exe
Wyszukujemy ciąg 0.moj_czat. Jak widać program właściwie odnalazł adres przypisany do nazwy 0.moj_czat



Uruchamiamy drugą (kolejną) kopię programu. Wybieramy opcję Graph i Open Graph a następnie wpisujemy nazwę grafu do wyszukania (musimy ją znać), i zaznaczamy chmurę, w której będziemy szukać (Local)



Okna obu programów poinformują użytkowników o obecnych w grafie osobach (lista po prawej stronie).
Wpisywane wiadomości pojawiają się natychmiast na wszystkich oknach (synchronizacja odpowiednimi mechanizmami z Graphing API).
Możliwe jest także połączenie bezpośrednie. Należy dwukrotnie kliknąć na obiekt listy, do którego chcemy wysłać wiadomość, i w pojawiające się okieko "Whisper" wpisać wiadomość. Po zatwierdzeniu wiadomość zostanie bezpośrednio przesłana do wybranego węzła (nie pojawi się u wszystkich).



Każda uruchomiona kopia programu rejestruje taką samą nazwę pod swoim adresem (ipV6). Aby wyszukać wszystkie kopie programu "czatu" wykorzystujemy program pnrp.exe wyszukując ciągu 0.moj_czat


Jak widać powyżej znaleziono uruchomione lokalnie dwa adresy przypisane do tej nazwy.
Enumerację taką można przeprowadzić również przy wykorzystaniu programu netsh wykonując wyszukiwanie w wybranej chmurze.
W poniższym przykładzie wyszukiwanie przeprowadzono w chmurze lokalnej (nazwę chmury lokalnej nalezy wpisać jako ostatni parametr):

netsh p2p pnrp peer enumerate 0.moj_czat LinkLocal_{22806A0A-..........FFC}



Uzyskano dwa adresy odpowiadające uruchomionym programom "czatu".

Jak widać program właściwie odnalazł adres przypisany do nazwy 0.MojPeer






Część 3: Architektura programu testowego

Archiwum składa się z dwóch projektów:
pnrp - program prezentujący protokół Microsoft PNRP
graphchat - program prezentujący możliwości Graphing API


Pliki źródłowe:

Pliki umieszczone są w odpowiednich katalogach projektowych i dzielą się na pliki nagłówkowe (header files) *.h i odpowiadające im pliki *.c
Pliki mają długość około 1000 linii kodu i zawierają zarówno funkcje podstawowe jak i funkcje dodatkowe służące do komunikacji z użytkownikiem.


W katalogach znajdują się także pliki *.vcproj będące plikami projektowymi do edytora Microsoft Visual Studio.






Część 4: Opis Elementów Microsoft PNRP



Chmury PNRP (PNRP Clouds)

Chmura jest zbiorem węzłów, które mają możliwość komunikacji między sobą (nie muszą być podłączone). Każdy host jest dołączony domyślnie do chmury głównej Global_. Chmura ta odpowiada zasięgowi adresacji IPv6 i reprezentuje wszystkie podłączone do internetu hosty. Jest tylko jedna chmura tego typu.
Host może być podłączony także do jednej (lub więcej) chmury LinkLocal_ odpowiadającej podłączonej do hosta sieci lokalnej. Jeżeli host jest podłączony do większej ilości podsieci, może należeć do większej ilości chmur tego typu.
PeerPnrpGetCloudInfo - [pnrp.exe/pnrp.c; 923] | [graphchat.exe/GraphChat.c; 1869]



Nazwy Peerów i identyfikatory PNRP (PNRP ID's)

Protokół PNRP jest zbliżony w działaniu do DNS (tłumaczy nazwy na adresy IPv6), jednak sposób działania nie jest scentralizowany. Każdy host może ogłosić "nazwę" i odpowiadający jej adres IPv6. Pozostałe hosty mogą wyszukać tę nazwę i uzyskać dowiązany do niej adres IPv6 nie używając serwera (odmiennie niż DNS).
Nazwy peerów składają się z dwóch części: authority oraz Classifier. Nazwa Peera może być bezpieczna lub niezabezpieczona. W przypadku, gdy nie uzywamy zabezpieczeń część authority jest cyfrą '0'.
Jeżeli chcemy aby nasza nazwa była zabezpieczona (przed podrobieniem), authority jest wunikiem funkcji haszującej obliczonej z klucza publicznego przypisanego do naszego węzła.
Classifier jest dowolnie wybraną nazwą (n.p. nazwą serwisu, który udostępniamy). Cała nazwa ma format authority.classifier.
Nazwy publikuje się w chmurach. Nazwy są możliwe do wyszukania tylko jeżeli zostały opublikowane w danej chmurze.

Identyfikator PNRP ma długość 256 bitów i składają się z dwóch 128 bitowej długości części. Pierwsza część jest wynikiem funkcji haszującej obliczonej z nazwy peera. Druga część (tzw. Service locator) jest wartością wygenerowaną, która identyfikuje inne instancje o tej samej nazwie (możemy w ten sposób mieć więcej niż jedną usługę danego typu dostępną w sieci.

Tworzenie nazwy peera odbywa się za pomocą metody
PeerCreatePeerName - [pnrp.exe/pnrp.c; 253] | [graphchat.exe/GraphChat.c; 1909]

Publikowanie nazwy peera do chmury następuje poprzez wykonanie metody
PeerPnrpRegister - [pnrp.exe/pnrp.c; 320]

Wyszukanie nazwy Peera przeprowadza się za pomocą metod:
PeerPnrpResolve - [pnrp.exe/pnrp.c; 550]
lub
PeerPnrpStartResolve - [pnrp.exe/pnrp.c; 610]






Część 5: Opis Elementów Microsoft Graphing



Graphing jest technologią umożliwiającą peerom łączenie się w grafy (grupy węzłów). Graf utrzymuje swoją bazę danych, do której wszyscy dołączeni mogą dodawać rekordy.
Baza danych jest synchronizowana między dołączonymi węzłami za pomocą flooding'u. Peer-to-Peer Graphing jest protokołem odpowiedzialnym za utrzymanie połączeń w grafie oraz replikacje danych pomiędzy węzłami. Aktualnie dołączone węzły w grafie można uzyskać za pomocą funkcji PeerGraphEnumNodes, która zwraca listę wszystkich węzłów podłączonych do grafu (oczywiście w czasie wykonania funkcji).
PeerGraphEnumNodes - [graphchat.exe/GraphChat.c; 933]



Rekord (Record) - dane, które zostały opublikowane przez węzeł do grafu. Są podstawową jednostką komunikacji w grafie. Są identyfikowane poprze unikalny (w skali grafu) identyfikator rekordu (Record ID).

Rekord można dodać do grafu za pomocą funkcji:
PeerGraphAddRecord - [graphchat.exe/GraphChat.c; 1505]
Rekord jest wysyłany do wszystkich węzłów w grafie. Aby odczytać rekord węzeł wykonuje funkcję:
PeerGraphGetRecord - [graphchat.exe/GraphChat.c; 1505]
Funkcja odczytuje rekord na podstawie identyfikatora rekordu.



Sąsiad (Neighbor) - Węzeł, który jest połączony z drugim węzłem za pomocą połączenia typu "Neighbor Connection".


Połączenie typu "Neighbor Connection" - połączenie między węzłami, które używane jest do flooding'u oraz synchronizacji.



Połączenie bezpośrednie - połączenie między węzłami, które umożliwia wysyłanie danych bezpośrednio do węzła (nie dodaje rekordów do grafu)
Otwarcie połączenia wywołuje się funkcją:
PeerGraphOpenDirectConnection - [graphchat.exe/GraphChat.c; 960]
Funkcja umożliwia peerowi bezpośrenie połączenie z innym węzłem w grafie. Połączenie może być zrealizowane tylko jeżeli węzeł odbiorczy obsługuje zdarzenie PEER_GRAPH_EVENT_DIRECT_CONNECTION. W programie graphchat.exe odbywa się to za pomocą dwukrotnego kliknięcia na odpowiednią pozycję listy dołączonych do grafu (tzw. whispering).
Po połączeniu można wysłać dane do odbiorcy poprzez wywołanie:
PeerGraphSendData - [graphchat.exe/GraphChat.c; 1636]



Czas (Peer Time) - W grafie czas jest dzielony pomiędzy wszystkimi dołączonymi węzłami. Czas jest aproksymowany przez węzeł na podstawie czasu UTC oraz czasu innych węzłów. Umożliwia to bezkolizyjne dodawanie rekordów do grafu, a także kontrolę nad synchronizacją danych.
PeerGraphUniversalTimeToPeerTime - [graphchat.exe/GraphChat.c; 933]
Funkcja konwertuje czas ustawiony lokalnie na węźle na czas używany w grafie.




Tworzenie, Przyłączanie węzła do grafu
Graf tworzymy za pomocą funkcji:
PeerGraphCreate - [graphchat.exe/GraphChat.c; 1062]
Funkcja umożliwia także ustawienie informacji dotyczących typu zabezpieczenia używanego przez graf. Funkcja tworzy graf, ale nie łączy do niego wywołującego funkcję węzła.
Połączenie do węzła następuje dopiero po wywołaniu przez węzeł funkcji:
PeerGraphConnect - [graphchat.exe/GraphChat.c; 1221]

Po ustaleniu połączenia z grafem, węzeł otrzymuje listę węzłów, do których może się połączyć tworząc swoją listę sąsiadów (Neighbours)


PeerGraphOpen - [graphchat.exe/GraphChat.c; 1138]
Funkcja służy do dołączenia do grafu stworzonego wcześniej przez inny węzeł. Podobnie jak w funkcji PeerGraphCreate węzeł nie łączy się do grafu (wymagane wywołanie PeerGraphConnect)




created by: Tomasz Kaszuba 2007

Valid HTML 4.01 Transitional