Von Beej's Guide zur Netzwerkprogrammierung
Sie können die Verwendung von IPv4 oder IPv6 im Feld ai_family erzwingen oder es als AF_UNSPEC belassen, um was auch immer zu verwenden. Das ist cool, weil Ihr Code IP-Versionsunabhängig sein kann.
Wie der Titel sagt - was wären die Nachteile (oder Risiken, falls überhaupt), dass immer AF_UNSPEC
verwendet wird, anstatt IPv4 oder IPv6 anzugeben?
Oder nur aus einem Grund - wenn die Version angegeben ist, garantiert dies, dass diese und nur diese Version unterstützt wird?
Ein kleiner Hintergrund - Ich denke über das Hinzufügen von Unterstützung für IPv6 in Client-Server (C ++) Anwendungen und beide Versionen sollten unterstützt werden. Also habe ich mich gefragt, ob es besser ist AF_UNSPEC
zu benutzen oder es ist besser, die Adresse aus der Zeichenkette zu "erkennen" und AF_INET6
oder AF_INET
zu benutzen, abhängig von der Adresse.
Sie müssen zwischen Client- und Serveranwendungen unterscheiden.
Auf dem Client ist es einfach: Rufen Sie einfach getaddrinfo()
auf und versuchen Sie jede der Antworten nacheinander, bis Sie eine Verbindung erhalten.
Auf dem Server sind die Dinge etwas schwieriger:
Auch auf Servern kann getaddrinfo()
verwendet werden. Dort benutzt du das Flag AI_PASSIVE
in den Hints. Dann bekommst du Ergebnisse. Auf diesen müssen Sie nur zuhören und vielleicht die IPV6_V6ONLY
-Flagge aktivieren.
accept()
sollte entweder nicht blockierend oder mit select()
oder poll()
ausgeführt werden (nicht sicher, ob Letzteres möglich ist).
Wie die Dinge sein sollten:
Anwendungen sollten Layer-3-Agnostiker sein. Die Verbindung zu einem anderen System sollte über den Namen erfolgen. Der Name sollte in eine oder mehrere Adressen aufgelöst werden, und die Anwendung sollte eine Verbindung zu ihnen herstellen, ohne auf das tatsächlich verwendete Protokoll zu achten. Auf diese Weise liegt die Netzwerkkonfiguration in der Verantwortung der Netzwerk- und Systemadministratoren. Wenn IPv6 in einem Netzwerk eingeführt wird, funktioniert die Anwendung weiter, ohne den Unterschied zu bemerken.
Einige reale Probleme:
Manchmal ist IPv6 schlecht konfiguriert, eine Firewall weiß nicht, wie man mit IPv6 umgeht, IPv6 wird nur im lokalen Netzwerk ohne Verbindung zum Internet usw. verwendet. Dies sollte kein Problem sein, aber manchmal begegnet man einem schlechte Implementierung oder Konfiguration Um damit fertig zu werden, arbeitet die IETF an einem Entwurf namens happy-eyeballs . Es stellt sicher, dass der Benutzer solche Probleme nicht bemerkt. Schauen Sie sich diesen Entwurf an. Mit den in diesem Entwurf angegebenen Techniken stellen Sie sicher, dass Ihre Anwendung für alle Benutzer gut funktioniert.
Eines der Risiken bei der Verwendung von AF_UNSPEC besteht darin, dass Sie den Client größeren Antworten von einem böswilligen DNS-Server aussetzen, der versucht, CVE-2015-7547 zu verwenden, um einen Stapelpufferüberlauf zu verursachen und bösartigen Code auszuführen der Kunde. In der Tat ist eine vorgeschlagene Abhilfe für den bekannten Fehler in getaddrinfo die Verwendung von AF_UNSPEC als detaillierte hier zu verhindern im Fehlerbericht. Der Überlauffehler für DNS-Antworten größer als 2K wirkt sich auf glibc ab 2.9 aus und ist in 2.23 behoben. Dies betrifft die meisten derzeit installierten Linux-Distributionen.
Tags und Links c c++ sockets network-programming unix