Utrzymuj komunikację między dwoma klientami, nawet jeśli ich adresy IP ulegną zmianie
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
Tak to mozliwe.
Trzeba użyć FQDN
(lub subdomeny) zamiast IP Address
a DNS
serwerem, 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-flare
itd
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.