Utrzymuj komunikację między dwoma klientami, nawet jeśli ich adresy IP ulegną zmianie

Dec 11 2020

Próbuję dowiedzieć się, czy można mieć coś takiego, jak ten scenariusz:

Powiedzmy, że mamy dwie osoby, Alice i Bob. Alicja chce wysłać jakieś dane (nieważne, jakie to dane) do Boba i odwrotnie. Wiem, że WebRTC może być używany do wymiany wiadomości bez użycia serwera, ale wymaga to znajomości adresów IP przez Alice i Bob. Alicja i Bob stosunkowo łatwo mogą raz udostępnić swoje adresy IP, aby zainicjować połączenie, ale co się stanie, jeśli jeden z nich połączy się z inną siecią; może Bob jest na przykład w kawiarni i jego adres IP jest przez to inny? Wcześniej zainicjowane połączenie nie byłoby z jego obecnym adresem IP, więc musieliby ponownie zainicjować połączenie; ale jak?

Wydawałoby mi się, że musiałby już istnieć jakiś rodzaj istniejącej wcześniej komunikacji między nimi, aby mogli dzielić się swoimi adresami IP, ale dlaczego więc nie komunikować się po prostu za pomocą metody, którą zamiast tego przekazują swoje adresy IP? Alternatywnie może istnieć serwer, który łączy oba, ale pokonuje bezserwerową część systemu.

Czy jest więc jakiś sposób na utrzymanie komunikacji między dwoma klientami, nawet jeśli zdarzają się oni zmieniać sieci, a tym samym adresy IP? Być może istnieje bardziej ustalona metoda identyfikacji urządzeń niż ich adresy IP, jak widziałem w tej odpowiedzi SO , ale ma lata, więc może jest coś nowego? Wdrożyłbym to w JS, na wielu urządzeniach / systemach operacyjnych, więc ta odpowiedź prawdopodobnie nie zadziała. Wszelkie pomysły / przykłady będą bardzo mile widziane; Przede wszystkim chcę wiedzieć, czy jest to w ogóle możliwe, a jeśli tak, to w jaki sposób.

Odpowiedzi

2 cybercoder Dec 15 2020 at 00:38

Tak to mozliwe.

Trzeba użyć FQDN(lub subdomeny) zamiast IP Addressa DNSserwerem, a po stronie klienta util lub narzędzie do aktualizacji rekordu DNS przy zmianie adresu IP.

Nie ma darmowych rozwiązań w sieci, takich jak no-ip.com, cloud-flareitd

4 divinelemon Dec 15 2020 at 06:05

Prosta odpowiedź

Nie, chociaż jest to możliwe, jest to nierealne i niepotrzebne. Zobacz moje dłuższe wyjaśnienie poniżej. Ponadto, jeśli naprawdę chcesz to zrobić, chociaż jest to możliwe dzięki QUIC , prawdopodobnie nie będzie to potrzebne (jak wyjaśniono poniżej).

Dłuższa odpowiedź / pytanie do przemyślenia

Krótko mówiąc, nie jest to potrzebna funkcja WebRTC. Pozwól, że zadam ci pytanie:
Alicja i Bob są w kanale danych, wymieniając wiadomości na czacie przez WebRTC. Aby utworzyć połączenie WebRTC, musisz użyć serwera lodu ( pierwszy link , drugi link ), aby dostać się do Alice i Bob, aby zacytować Wikipedię:

... znaleźć sposób, w jaki dwa komputery będą rozmawiać ze sobą tak bezpośrednio, jak to tylko możliwe.

Oznacza to, że użyje aktualnego adresu IP Alicji, aby złożyć ofertę Bobowi za pośrednictwem serwera STUN lub TURN. Jeśli, tak jak powiedziałeś, Alice miałaby zmienić adresy IP, musiałaby zmienić lokalizację. Oznacza to, że będzie musiała przemieścić się na wystarczającą odległość, aby adres IP się zmienił. W praktyce oznacza to zapewne, że jedzie samochodem i gdzieś jeździ. Jeśli nie, dzwoni po Ubera lub taksówkę albo jeździ na rowerze. W większości tych scenariuszy będzie musiała zamknąć komputer, co spowoduje zakończenie połączenia p2p. Jeśli za pomocą jakiejś dziwnej magii nie zamknie swojego komputera / połączenia, przeglądarka najprawdopodobniej odświeży się, a zatem ponownie połączy się z kanałem danych WebRTC z nowego adresu IP . Kiedy będziesz musiał utworzyć kanał danych WebRTC i zająć się zmianami adresu IP? Długie wyjaśnienie na zakończenie, klienci zmieniający adresy IP bez kończenia / resetowania połączenia po prostu nie zdarzają się w praktyce.

Jeśli chcesz przyjrzeć się innym alternatywom, oto kilka przykładów:

ALTERNATYWY

Dodawanie detektora zdarzeń IP ★

Teraz nie jest to rzeczywista zmienna globalna, które można sprawdzić, ale można użyć API online (niektóre są wymienione tutaj ), aby sprawdzić adres IP użytkownika, należy go przechowywać w zmiennej (lub localStorage) i sprawdzić, czy zmiany IP . W pętli wykonasz prostą logikę, aby sprawdzić, czy tak się dzieje, resetujesz połączenie WebRTC, jeśli nie, utrzymujesz pętlę.

Korzystanie z serwera „piping”

Możesz skonfigurować prosty czat, korzystając z już skonfigurowanego, wyjaśnionego tutaj serwera http / https , zwanego serwerem potokowym. Możesz zapoznać się z artykułem, aby uzyskać więcej informacji, ale promuje on bezserwerowy system czatu (można go używać bez tworzenia serwera), który nie jest narażony na trudności związane ze zmianą adresów IP. Musisz jednak znać identyfikator peera, a oni muszą znać twój identyfikator, co skutecznie sprawia, że ​​rozwiązanie jest przestarzałe, ponieważ musisz mieć jakąś komunikację przed nawiązaniem tego prostego czatu.

Korzystanie z Node.js, Websockets i / lub Socket.io ★

Jeśli chcesz stworzyć prostą aplikację do czatu lub kanał danych, Node.js i Socket.io to najlepszy wybór. Jest to bardzo proste, jednak wymaga serwera, dlatego zostawiłem to na koniec. Jednak bardzo polecam to ze względu na łatwość i prostotę oraz nie polegam na adresach IP. Zobacz tutaj, aby uzyskać bardzo dobre początkowe zanurzenie w Node.js i frameworku Express. Daleko mi do eksperta od Websockets, ale MDN jest zawsze dobrym miejscem do rozpoczęcia. Jakkolwiek dobre są Websockets, myślę, że Socket.io jest dużo łatwiejsze dla początkujących, więc jeśli chcesz poświęcić trochę szybkości na prostotę, powinieneś zacząć tutaj . To wszystko są dobre punkty początkowe czatu po stronie serwera.

Spinki do mankietów

Prosta odpowiedź

Migracja połączenia QUIC

Odbiornik IP

Więc pytanie ,

Serwery do lodu

Dokumentacja MDN , Wikipedia

Serwer rurociągów

Prosty artykuł , repozytorium Github

Node.js, Websockets i Socket.io

Konfiguracja Node.js i Express , wprowadzenie do Websocket i wprowadzenie do Socket.io

Wszystkie alternatywy oznaczone gwiazdką (★) są polecane osobiście.