2009-10-08 17 views
31

Projektuję aplikację p2p, która działa na porcie 30000. Mój router nie jest UPnP, więc musiałem przesłać port do routera. Ale Skype inna aplikacja p2p działa bez przekierowania portów na moim komputerze. Kiedy przeanalizowałem go za pomocą wireshark, znalazłem jego użycie portu UDP 48980, 58544. Używam C++.Jak działa Skype bez przekierowania portów?

Istnieje biblioteka w pythonie here, która to robi dla routery Nat PnP. Czy możliwe jest programowe przekazanie portu do routera niezależnie od typu routera i systemu operacyjnego. Jakie powinno być podejście do tego w C++ lub jakimkolwiek innym języku.

Odpowiedz

20

Skype działa w bardzo interesujący sposób. Z tego co czytałem (i jest to jakiś czas temu), to działa w następujący sposób:

  • serwer Skype utrzymuje listę wszystkich użytkowników i adresów IP.
  • Użytkownik Skype A chce mówić do użytkownika B Użytkownik Skype A wysyła pakiet sieciowy na adres IP użytkownika B pod numerem i czeka na odpowiedź. (użytkownik B nigdy nie otrzymuje tego pakietu).
  • Skype użytkownik A informuje serwer o IP/port kombinacji, na którym jest oczekiwanie na odpowiedź
  • Server powiadamia użytkownika B wysłać odpowiedź
  • użytkownika A na określonego portu nawiązaniu połączenia .

Jest to prawdopodobnie zbyt uproszczone, ale ostatnio sprawdziłem, tak to działa. (Ktoś mnie poprawi, jeśli się mylę).

+0

ale pytanie jest to, że IP klientów PUBLICZNE? patrz na przykład A musi komunikować się z B, a serwer zna IP B, ale jakiego ip używa? jeśli tak, to możesz wysłać polecenie ping anyones ip? przepraszam, jeśli to głupie. –

+4

Ta odpowiedź opisuje tylko A i nie daje się komunikować z B, a serwer wysyła odpowiednią kombinację IP/Port do użytkownika B. Brakuje głównego punktu, który nazywany jest dziurkowaniem i jest bardzo dobrze opisany w linku dostarczone przez @MartinBeckett. Dodam tylko, że możliwe jest również przekazanie portu niezależnie od typu routera i systemu operacyjnego, o ile router obsługuje UPnP. – Igor

+1

@ Tak, więc co z symetrycznym NAT? – onmyway133

18

UDP hole punching jest (jeden) ze sposobów przechodzenia przez NAT.

+0

nie jestem w stanie zrozumieć różnicę pomiędzy routerem i NAT? Czy przekazujemy port do routera lub NAT? Nie jest dziurkowanie równoważne wysyłanie danych z obu stron w tym samym czasie, co nie działa, gdy pracujemy na innym porcie. Dzięki – Xinus

+1

Router przesyła informacje z jednej sieci do drugiej. NAT jest procesem posiadania prywatnego zakresu adresów w sieci wewnętrznej i tylko posiadanie routera ma prawidłowy adres w drugiej sieci. Router jest urządzeniem fizycznym, NAT to coś, co robisz. – rein

3

Należy użyć serwera pośredniczącego i zainicjować komunikację ze strony klienta. Jak wspomniał Yossarian, od tego momentu jedną z możliwości jest dziurkowanie UDP. W zależności od typu aplikacji (i tego czy jest to P2P, czy też nie), możesz utrzymywać serwer pośredniczący na miejscu przez cały czas.

0

Skype używa innych urządzeń równorzędnych jako punktów pośrednich, gdy bezpośrednie połączenie nie jest możliwe.

, tj. Peer A chce się połączyć z peerem B, ale peer B ma wszystkie porty zamknięte, a następnie inicjowana jest komunikacja przez peer C, który ma otwarte porty.

0

pewne doświadczenie we wdrażaniu aplikacji P2P i zachęcając do pracy za routerami NAT.

Skype używa dziurkowania UDP do pracy za routerami NAT. Napisałem artykuł i zrobiłem film demonstracyjny, aby pomóc innym w implementacji podobnych aplikacji. Dostarczono także linki do przydatnych bibliotek, które wykonują większość pracy z podłożem jak libutp.

>>> UDP hole punching Demo video and useful Libs.

Powiązane problemy