Wie kann man den Host und den Port in einer IPv6-URL unterscheiden?

87

URLs haben immer folgendes Format:

<protocol>://<host>[:<port>]/[<path>][#<hash>]

Das Problem ist, dass IPv6 Doppelpunkte verwendet, genau wie das Trennzeichen von Port und Host, zB:

2001:db8:1f70::999:de8:7648:6e8

Aber was ist, wenn dies der Host ist und ich über HTTP auf Port 100 eine Verbindung herstellen möchte?

http://2001:db8:1f70::999:de8:7648:6e8:100/

Das Problem ist der letzte Doppelpunkt. Da Nullen mit Doppelpunkten (zwischen 1f70 und 999) weggelassen werden, ist nicht bekannt, ob ': 100' zur IP oder zur Portnummer gehört. Wie können wir das wissen?

richtig falten
quelle

Antworten:

118

In diesem Fall muss die IPv6-IP-Nummer in eckigen Klammern angegeben werden:

http://[2001:db8:1f70::999:de8:7648:6e8]:100/

Das ist RFC 3986 , Abschnitt 3.2.2: Host

Ein Host, der durch eine Internet Protocol-Literaladresse (Version 6 [RFC3513] oder höher) identifiziert wird, wird dadurch gekennzeichnet, dass das IP-Literal in eckige Klammern ("[" und "]") eingeschlossen wird. Dies ist der einzige Ort, an dem eckige Klammern in der URI-Syntax zulässig sind. In Erwartung zukünftiger, noch nicht definierter IP-Literal-Adressformate kann eine Implementierung ein optionales Versionsflag verwenden, um ein solches Format explizit anzugeben, anstatt sich auf eine heuristische Bestimmung zu verlassen.

sysadmin1138
quelle
38
Es sei darauf hingewiesen, dass die Klammern nicht optional sind. Dies ist der einzige eindeutige Mechanismus, mit dem der Browser eine numerische IPv6-Adresse identifizieren kann.
TylerL
Sollte sich der Port nicht in den Klammern befinden?
Jayarjo
2
@jayarjo Nein, da die Klammern eine eindeutige Trennung zwischen der IP-Adresse, die Doppelpunkte enthält, und dem Port ermöglichen, der durch einen Doppelpunkt von der IP-Adresse getrennt ist.
sysadmin1138