Pracowałem tylko na aplikacjach klienckich (w szczególności mobilnych) na Androidzie, gdzie cała sieć jest obsługiwana w warstwie HTTP przy użyciu komponentów dostarczonych przez framework, takich jak HttpUrlConnection.
Ale systemy przesyłania wiadomości typu push, takie jak Websockets / XMPP itp., Utrzymują stałe połączenie z serwerem. Nawet GCM Google'a, który jest wbudowany w urządzenia obsługiwane przez Google Play, utrzymuje stałe połączenie z serwerami.
Moje pytanie brzmi: jak to działa bez rozładowywania baterii? Jeśli sekwencyjnie wysyłamy ciągłe żądania HTTP, zużycie baterii jest znaczne. W jaki sposób utrzymywane są te trwałe połączenia bez napotkania tego samego problemu?
networking
sockets
Vinay S. Shenoy
źródło
źródło
Odpowiedzi:
Otwarte połączenie TCP jest stanem logicznym. Nie oznacza to, że dane te są zawsze przesyłane tam iz powrotem. Po początkowym potrójnym uzgadnianiu wszedłeś w stan „połączony”. Jesteś w tym stanie, dopóki nie nastąpi rozłączenie w 3 kierunkach lub nie powiedzie się utrzymywanie aktywności.
W trakcie trwania połączenia mogą zostać ustanowione zasoby z podstawowego „fizycznego” nośnika do przesyłania danych dla tego połączenia. W przypadku połączenia przewodowego chodzi o przenoszenie ramek Ethernet. W przypadku połączenia bezprzewodowego 3G / 4G odbywa się to poprzez ustanowienie w razie potrzeby połączeń z protokołami niższego poziomu.
Przez cały czas trwania połączenia nie istnieje fizyczne połączenie danych. Zamiast tego leży uśpiony, czekając, aż któryś z połączeń TCP będzie musiał wysłać dane.
Inną kwestią jest to, że TCP ACK oparty. Uczestnicy TCP mogą dość skutecznie informować się nawzajem o tym, co zostało ostatecznie odebrane. W przypadku awarii TCP retransmituje. Działa to doskonale w przypadku dość niezawodnych łączy fizycznych, ale zwykle rozpada się na bardzo głośne / zepsute łącza, takie jak połączenia bezprzewodowe. Jak możesz sobie wyobrazić, acks / retransmisje występowałyby bardzo często w tych środowiskach.
Zazwyczaj bazowy protokół bezprzewodowy robi wszystko, co w jego mocy, aby zmniejszyć potrzebę retransmisji TCP. Na przykład w warstwie bezprzewodowej wbudowanych jest wiele funkcji sprawdzania błędów. Rówieśnicy w dziedzinie bezprzewodowej (stacja bazowa / telefon) również używają protokołu opartego na nak , aby poinformować drugą stronę, gdy coś nie otrzymali. Będąc nak oparty zmniejsza narzut na sprawdzanie błędów (zakładamy wszystko grzywny, chyba że druga strona mówi jej nie). Pomaga również błędy adresowe przedprzenoszą się do warstwy TCP - unikając w ten sposób mnożenia TCP próbującego retransmitować. Co więcej, ogranicza zakres retransmisji do bezprzewodowych urządzeń równorzędnych - telefon nie musi ponownie pytać serwera w Internecie o pakiet, tylko stację bazową przez łącze bezprzewodowe.
źródło