Was war die motivation für das hinzufügen der IPV6_V6ONLY Flagge?
In IPv6-Netzwerken, die IPV6_V6ONLY-flag wird verwendet, um sicherzustellen, dass eine Buchse nur IPv6 verwenden, und insbesondere, dass die IPv4-zu-IPv6-Zuordnung nicht verwendet werden, die für diesen socket. Auf vielen OS ' s, die IPV6_V6ONLY ist standardmäßig nicht gesetzt, aber auf einigen Betriebssystemen (z.B. Windows 7), es ist standardmäßig festgelegt.
Meine Frage ist: Was war die motivation für die Einführung dieser Flagge? Gibt es etwas, über das IPv4-zu-IPv6-Zuordnung, die verursacht wurde Probleme und damit die Menschen brauchten einen Weg, um es zu deaktivieren? Es scheint mir, dass, wenn jemand nicht verwenden möchten, IPv4-zu-IPv6-Zuordnung, Sie konnte einfach nicht geben Sie eine IPv4-mapped IPv6-Adresse. Was vermisse ich hier?
- Eijkelenboom: Nein, tut es nicht
- Da dies ist eine networking-Frage, und es ist nicht die Programmierung bezogen, bin ich davon ausgegangen, es habe.
- diese flags sind Parameter gegeben, um die system-Aufrufe, einen socket zu öffnen. beim Programmieren benutzen, nicht bei der Konfiguration oder der Aufrechterhaltung. IOW: es ist der Entwickler und nicht der admin, der es benutzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, warum, es wäre Standard, aber es ist die Art von Fahnen, würde ich immer wieder explizite setzen, egal was die Standardeinstellung ist.
Darüber, warum existiert es dann in Erster Linie, denke ich, dass es ermöglicht es Ihnen, um die bestehende IPv4-only-Server, und führen Sie einfach neue auf den gleichen port, aber nur für IPv6-verbindungen. Oder vielleicht den neuen server kann einfach proxy-clients auf die alte, so dass die IPv6-Funktionalität schnell und einfach hinzufügen zu alten Leistungen.
Nicht alle IPv6-fähigen Plattformen unterstützen dualstack-sockets-also ist die Frage wird, wie Anwendungen müssen maximimize IPv6-Kompatibilität entweder wissen dualstack unterstützt wird oder binden separat, wenn seine nicht? Die einzige Universelle Antwort ist IPV6_V6ONLY.
Einer Anwendung ignoriert IPV6_V6ONLY oder geschrieben, bevor dualstack-fähig IP-stacks existiert möglicherweise findet die Bindung separat zu V4 kann in einer dualstack-Umgebung als IPv6-dualstack-socket binden auf IPv4 zu verhindern IPv4-socket-binding. Der Antrag kann auch nicht erwartet werden, IPv4 über IPv6 durch Protokoll-oder Anwendungsebene Fragen oder IP-Zugriff steuert.
Diese oder ähnliche Situationen wahrscheinlich aufgefordert, MS et al Standardwert 1 sogar tho RFC3493 erklärt die 0 als Standardwert festlegen. 1 theoretisch maximiert die Abwärtskompatibilität. Speziell Windows XP/2003 nicht unterstützt dualstack-sockets.
Gibt es auch keinen Mangel an Anwendungen, die leider übergeben müssen niedrigere layer-Informationen, um ordnungsgemäß zu funktionieren, und so diese option kann sehr nützlich für die Planung einer IPv4/IPv6-Kompatibilität-Strategie, die am besten passt die Anforderungen und die vorhandene codebase.
Den Grund, der am häufigsten erwähnt wird, ist für den Fall, wo der server hat irgendeine form von ACL (Access Control List). Zum Beispiel, stellen Sie sich einen server mit Regeln wie:
Es läuft auf IPv4. Nun, jemand läuft auf einem Computer mit IPv6 und, abhängig von einigen Parametern, IPv4-Anfragen akzeptiert werden, die auf dem IPv6-Buchse, wie abgebildet ::192.0.2.4 und dann nicht mehr aufeinander abgestimmt, indem die erste ACL. Plötzlich, der Zugriff würde verweigert werden.
Wird explizit in Ihrer Anwendung (mit IPV6_V6ONLY) würde das problem lösen, was auch immer Standard-Betriebssystem hat.
Für Linux, beim schreiben ein Dienst, der lauscht auf IPv4-und IPv6-sockets auf der gleichen service-port, z.B. port 2001, rufen Sie setsockopt(s, SOL_IPV6, IPV6_V6ONLY, &one, sizeof(one)); auf die IPv6-socket. Wenn Sie dies nicht tun, die operation bind() für die IPv4-socket-Fehler "Adress already in use".
Gibt es plausible Möglichkeiten, in denen die (schlecht benannten) "IPv4-mapped" - Adressen verwendet werden können, zu umgehen, schlecht konfigurierten Systemen oder schlecht stapeln, oder auch in einem gut konfigurierten system kann nur verlangen, belastende Mengen bugproofing. Ein Entwickler möchte dieses flag verwenden, um Ihre Anwendung sicherer durch nicht unter Verwendung dieser Teil der API.
Finden Sie unter: http://ipv6samurais.com/ipv6samurais/openbsd-audit/draft-cmetz-v6ops-v4mapped-api-harmful-01.txt
Stellen Sie sich ein Protokoll beinhaltet, dass in dem Gespräch eine Netzwerk-Adresse, z.B. der Datenkanal für FTP. Wenn Sie IPv6 verwenden, die Sie gehen zu senden, die IPv6-Adresse, wenn der Empfänger passiert zu sein, eine IPv4-mapped-address es wird keine Möglichkeit haben, die Verbindung zu dieser Adresse.
Gibt es ein sehr häufiges Beispiel, wo die Dualität des Verhaltens ist ein problem. Die standard -
getaddrinfo()
Anruf mitAI_PASSIVE
- flag bietet die Möglichkeit zum bestehen einer nodename parameter und gibt eine Liste der Adressen Abhören. Einen besonderen Wert in form einer NULL-Zeichenfolge akzeptiert nodename und bedeutet hören auf wildcard-Adressen.Auf einigen Systemen
0.0.0.0
und::
zurückgegeben werden, in dieser Reihenfolge. Beim dual-stack-sockel ist standardmäßig aktiviert, und Sie setzen nicht die BuchseIPV6_V6ONLY
, der server eine Verbindung zu0.0.0.0
- und dann schlägt die Verbindung zu dual-stack -::
und daher (1) funktioniert nur auf IPv4 und (2) meldet Fehler.Halte ich die Reihenfolge falsch IPv6 wird erwartet, dass Sie bevorzugt werden. Aber auch, wenn Sie das erste mal einen dual-stack -
::
und dann nur-IPv4 -0.0.0.0
weiterhin auf dem server meldet einen Fehler für den zweiten Anruf.Ich persönlich halte die ganze Idee eines dual-stack-socket-Fehler. In meinem Projekt würde ich eher immer ausdrücklich
IPV6_V6ONLY
zu vermeiden. Einige Leute scheinbar sah es als eine gute Idee, aber in diesem Fall würde ich wohl explizit unsetIPV6_V6ONLY
und übersetzenNULL
direkt zu0.0.0.0
unter Umgehung dergetaddrinfo()
Mechanismus.