Nie chodzi o konkretną technikę programowania (język, biblioteki), tylko o samą ideę i zasadę działania P2P.
Co do działania, to ja rozumiem, że P2P polega na tym, że każdy może połączyć się z każdym, natomiast połączenie TCP/IP wymaga zewnętrznego adresu i portu urządzenia, na którym jest serwer, a klient nie musi mieć (może być za NATem).
Załóżmy, że są czterej użytkownicy programu, który może być i serwerem i klientem, tylko, że mają taką konfigurację swoich urządzeń:
Adam - jest za NATem
Barbara - jest za NATem
Celina - posiada zewnętrzny IP
Dorota - posiada zewnętrzny IP
Ci, którzy mają NAT nie mają ustawionego przekierowania na routerze, nie ma ograniczeń portów połączeń, żadnych proxy, VPN itp. Z powyższego wnioskuję, że:
Adam NIE MOŻE podłączyć się do Barbary i Barbara NIE MOŻE podłączyć się do Adama, czyli łączność Adam-Barbara NIE MOŻE być zestawiona
Adam może podłączyć się do Celiny, ale Celina NIE MOŻE podłączyć się do Adama, czyli łączność Celina-Dorota może być zestawiona wyłącznie z inicjatywy Adama
Celina może podłączyć się do Doroty i Dorota może podłączyć się do Celiny, czyli łączność Celina-Dorota może być zestawiona z inicjatywy Celiny lub Doroty
Czy mam rację?
Przekładając na język grafów, między tymi użytkownikami można narysować skierowany, gdzie między Celiną i Dorotą będą dwa krawędzie w przeciwnych kierunkach, między Adamem i Barbarą nie będzie żadnej krawędzi, od Adama lub Barabary do Celiny lub Doroty będzie jedna krawędź jednokierunkowa.
Załóżmy, że chciałbym napisać program do wymiany plików działający jako P2P (coś, jak BitTorrent, eMule, eDonkey, Gnutella) na tych czterech komputerach. Pomińmy kwestie przekazywania listy udostępnionych plików oraz przeszukiwania sieci. ZTCW, przy przesyłaniu pliku łączą się dwa komputery bezpośrednio, bo na tym polega P2P, przez co nie da się takiej sieci unieruchomić przez wyłączenie konkretnego urządzenia.
Jeżeli Celina chce pobrać plik od Doroty lub Dorota od Celiny, to nie ma żadnego problemu. Po prostu należy podłączyć się po adresie IP i porcie, każdy tutorial opisuje, jak nasłuchiwać na porcie i przyjąć połączenie, oraz jak podłączyć się do innej maszyny po adresie IP i porcie. Podobnie w przypadku, gdy Adam chce pobrać plik od Celiny, również nie ma problemu (ale w drugą stronę, to już nie bardzo).
Pytanie jest następujące:
Jak będzie wyglądać sytuacja, gdy Celina chce pobrać plik od Adama, skoro bezpośrednio nie może się podłączyć? Jeżeli Adam przypadkowo podłączył się do Doroty, to czy w takiej sytuacji Celina podłączy się do Doroty i program na komputerze Doroty wykorzystując zestawione połączenie z Adamem zażąda od Adama zainicjowanie połączenia z Celiną, a jak Celina przyjmie połączenie od Adama, to wtedy rozpocznie się transfer właściwych danych?
Jeżeli tak, to jak będzie wyglądało w przypadku, gdy Adam chce pobrać plik od Barbary? Czy w takiej sytuacji cały transfer będzie szedł przez komputer Celiny lub Doroty (do Celiny lub Doroty może być podłączony zarówno Adam, jak i Barbara), czy jednak da się zestawić bezpośrednie połączenie między dwoma urządzeniami za NATem? Jeżeli się da, to jak to się robi na ogół w sieciach P2P?
Jeśli chodzi o język i technologię, to C#/.NET, lub Java SE (obsługa server-client wygląda prawie tak samo w obu tych technologiach).
Nie szukając daleko, P2P jest w Skype lub TeamViewer. Nie wyobrażam sobie, żeby przekaz audio/video wszystkich użytkowników szedł przez serwer TeamViewer lub Skype, bo przy kilku milionach się zarżnie, a nawet, jak to udźwignie, to byłoby to nie rozsądne.