Co dzieje się z połączeniem TCP i UDP (z multicastem), gdy aplikacja iOS weszła w tło

Stworzyłem kilka eksperymentów:

Konfiguracja 1: utworzyłem aplikację TCP Sender i aplikację TCP Receiver.

W tym eksperymencie uruchomiłem TCP Sender na urządzeniu z systemem iOS, a TCP Receiver na innym urządzeniu z systemem iOS. Następnie oba są weryfikowane pod kątem połączenia i wysyłania i odbierania danych. Następnie umieszczam aplikację odbiornika TCP w tle. Aplikacja TCP Sender wskazała utratę połączenia i awarię (tak, zamierzałem w ten sposób).

Setup 2: utworzyłem nadawcę UDP aplikacja i aplikacja odbiornika UDP.

Podobnie jak powyżej, uruchomiłem aplikację UDP Sender na urządzeniu z systemem iOS i aplikację UDP Receiver na innym urządzeniu z systemem iOS. W aplikacji odbiornika UDP subskrybowałem grupę multicastową itp. Zweryfikowałem, że aplikacja odbiornika UDP odbiera dane z tej grupy multiemisji wysłane przez aplikację nadawcy UDP. Następnie umieszczam aplikację odbiornika UDP w tle. Po 2 minutach dostaję aplikację nadawcy UDP, aby wysłać kolejną część danych. Następnie całkowicie zamykam aplikację nadawcy UDP i wyłącz to urządzenie z iOS. Następnie czekam na kolejne 2 minuty lub więcej, a następnie przywołuję aplikację odbiornika UDP z tła. Aplikacja odbiorca UDP odebrała dane, które zostały wysłane przez aplikację nadawcy UDP przed jej zakończeniem.

W setup1, moje wytłumaczenie jest takie, że TCP jest zorientowany na połączenie.

W setup2 rozumiem, że UDP jest bezpołączeniowy. Jakieś wyjaśnienie, dlaczego setup2 działało tak, jak z mojego doświadczenia? (Nadal odbieranie danych nawet w trybie tła)

Author: user523234, 2012-01-28

2 answers

Wszystko, co dzieje się, gdy umieszczasz aplikację w tle, a następnie puszczasz ją zawieszoną, to to, że przestaje być planowana przez jądro. Nie zrywa od razu żadnych połączeń ani nie zrywa żadnych gniazd (chyba że zmusisz go do tego.)

W Twoim przypadku UDP, jądro odbiera pakiet i umieszcza go w buforze jądra, czekając na odebranie pakietu przez Twoją aplikację. Ponieważ proces aplikacji istnieje, ale jest skutecznie zatrzymany, dane będą po prostu siedzieć w buforze jądra. Jeśli masz za dużo danych, przekroczy bufor jądra i zostanie upuszczony. W przeciwnym razie aplikacja może ją otrzymać, gdy (jeśli) zostanie ponownie zaplanowana.

W przypadku TCP, prawie to samo dotyczy.

Ale (duże ale): system operacyjny zawsze ma możliwość zrywania gniazd dla zawieszonych aplikacji, jeśli chce, na podstawie ciśnienia pamięci itp. Więc chociaż niekoniecznie zrobi to bezinteresownie, może to zrobić.

Nie wiem dokładnie, dlaczego widzisz, że połączenie TCP zerwane szybko. Możliwe, że jądro heurystyka serwerowania połączeń TCP jest bardziej agresywna niż w przypadku gniazd UDP, ponieważ połączenia TCP wymagają więcej stanu i bardziej ciągłego przetwarzania niż gniazda UDP.

Patrz Uwaga techniczna TN2277 sieciowanie i wielozadaniowość .

 11
Author: smparkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-29 00:19:13

Moja opinia jest z powodu systemu operacyjnego, to nie powinno się dziać, jeśli próbowałeś na systemie operacyjnym android, ponieważ IOs ma ograniczenia dotyczące tego, co może działać w tle, a co nie.

Z tego, co powiedziałeś, myślę, że to dlatego, że TCP wymaga więcej zasobów do wysyłania informacji. TCP wykorzystuje strumienie danych, a UDP bloki danych. Problem polega na tym, że TCP tworzy większe pakiety danych, podczas gdy UDP wykorzystuje 8 kb bloków danych.

 0
Author: Colin s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-29 12:33:16