Netzwerk-Broadcast/Multicast wird nicht vom iPhone im persönlichen Hotspot-Modus gesendet

Basierend auf neueren empirischen Erkenntnissen und basierend auf verschiedenen Beiträgen im Internet scheint es, dass eine Anwendung, die auf einem iPhone mit aktiviertem persönlichem Hotspot läuft, keine Broadcasts und/oder Multicasts an das Netzwerk des persönlichen Hotspots senden kann. Kann jemand die Ursache dieses Problems beleuchten?

Die Anwendung

Ich habe eine IOS-Anwendung, die mit plattformübergreifendem C++-Code erstellt wurde und ihre Anwesenheit per Broadcast und Multicast in das Netzwerk überträgt, auf dem sie ausgeführt wird. Die Anwendung funktioniert einwandfrei, wenn das iPhone mit einem Wi-Fi-Netzwerk verbunden ist. In diesem Fall empfangen andere Geräte im Netzwerk die Broadcasts/Multicasts und alles funktioniert korrekt. Dies kann leicht überprüft werden, indem ein Computer, auf dem WireShark ausgeführt wird, mit dem Netzwerk verbunden wird – die Broadcast-/Multicast-Pakete sind in der Paketverfolgung zu sehen.

Natürlich funktioniert die Anwendung gut auf einem iPhone, das mit einem lokalen Wi-Fi verbunden ist.

Das Problem

Wenn ich die Anwendung auf einem iPhone mit aktiviertem persönlichem Hotspot ausführe, werden keine Broadcasts/Multicasts im Hotspot-Netzwerk veröffentlicht. Dies kann mit WireShark überprüft werden, das keine derartigen Pakete in seinem Trace anzeigt.

Gibt es Einschränkungen bei der Verwendung eines persönlichen Hotspots als Netzwerkrouter, der Broadcasts und Multicasts verarbeiten kann?

Wenn ich auf meinem „WireShark“-Gerät mit einem Browser eine Webseite angefordert habe, antwortet der persönliche Hotspot korrekt auf alle Pakete und gibt die Webinhalte zurück.

Informationen zu Sicherheiten

Ich bin auf andere Stack Overflow-Vergangenheiten gestoßen, die dieselben oder ähnliche Probleme melden:

  1. Die TCP-Verbindung funktioniert nicht richtig, wenn das iPhone als Hotspot verwendet wird
  2. Fehler beim Senden von SSDP-Broadcast durch persönlichen Hotspot

Ein gutes Tutorial zum Schreiben einer solchen Broadcasting/Multicasting-Anwendung auf dem iPhone ist Michael Tysons „ The Making of Talkie: Multi-Interface Broadcasting and Multicast “. Es genügt zu sagen, dass meine Anwendung allen Anforderungen entspricht (z. B. Setzen der Socket-Optionen SO_BROADCAST, SO_DONTROUTE und IP_MULTICAST_IF, wo zutreffend).

Eine Antwort auf die obige Referenz (1) schreibt: „ Könnte es daran liegen, dass der persönliche Hotspot Network Address Translation einführt? “. Ich habe die WireShark-Traces gefiltert, um nur Pakete anzuzeigen, die mit der Hotspot-IP verbunden sind, und es gibt keinen Hinweis darauf, dass der persönliche Hotspot etwas an eine NAT-Adresse sendet.

Zusammenfassend

Kann jemand erklären, warum ein iPhone, auf dem ein persönlicher Hotspot ausgeführt wird, keine Pakete sendet/multicastet und wie das Problem gelöst werden kann?

Vielen Dank im Voraus.

PS Ich habe diese Abfrage ursprünglich auf Stack Overflow gepostet und von diesem eher Apple-orientierten Forum erfahren.

Antworten (1)

Quick-and-Dirty-Workaround

Ich bin auch auf das gleiche Problem gestoßen, als ich eine iPhone-App entwickelt habe, die eine UDP-Multicast-Nachricht verwendet, um Geräte im Netzwerk zu erkennen. Anscheinend blockiert das iPhone Multicast-Nachrichten im persönlichen Hotspot-Modus.

172.20.10.0/28Das iPhone scheint jedoch das Subnetz für Geräte im persönlichen Hotspot-Netzwerk zu verwenden . Das bedeutet, dass es nur 16 mögliche Adressen gibt. Davon 172.20.10.0wird offenbar nichts genutzt, 172.20.10.1das iPhone selbst, und das Versenden von Nachrichten schlägt 172.20.10.15mit einem „nicht erlaubt“-Fehler fehl. Das bedeutet, dass nur die folgenden 13 Adressen von Clients verwendet werden können: 172.20.10.2, 172.20.10.3, ..., 172.20.10.14.

Meine Problemumgehung ist also ziemlich einfach: Anstatt Broadcast-Nachrichten nur an zu senden 224.0.0.0, sende ich sie auch an alle anderen möglichen Adressen im Subnetz ( 172.20.10.2- 172.20.10.14).

Um in einer Produktions-App zukunftssicher zu sein, sollten Sie natürlich die Liste der Netzwerkschnittstellen überprüfen, die IP und das Subnetz überprüfen usw., aber für meinen persönlichen Gebrauch ist diese Methode ausreichend.

Ich habe hier eine noch bessere Lösung gefunden: stackoverflow.com/a/40524524/322427