RTCIceCandidate: usernameFragment-Eigenschaft
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.
Die schreibgeschützte usernameFragment
-Eigenschaft im RTCIceCandidate
-Interface ist ein String, der den Benutzerfragment ("ufrag") angibt, der eine einzelne ICE-Interaktionssitzung eindeutig identifiziert.
Dieser Wert wird mit der usernameFragment
-Eigenschaft im candidateInfo
-Optionsobjekt angegeben, das an den RTCIceCandidate()
-Konstruktor übergeben wird. Wenn Sie den Konstruktor mit einem m-line-String anstelle des Optionsobjekts aufrufen, wird der Wert von usernameFragment
aus dem angegebenen Kandidaten-m-line-String extrahiert.
Beachten Sie, dass 24 Bits des Benutzerfragments vom Browser zufällig sein müssen. Siehe Randomisierung unten für Details.
Wert
Ein String, der das Benutzerfragment enthält (im Allgemeinen in Kurzform als "ufrag" oder "ice-ufrag" bezeichnet), das zusammen mit dem ICE-Passwort ("ice-pwd") eine einzelne laufende ICE-Interaktion eindeutig identifiziert, einschließlich der Kommunikation mit dem STUN-Server. Der String darf bis zu 256 Zeichen lang sein und hat keinen Standardwert.
Randomisierung
Mindestens 24 Bits des Textes im ufrag
müssen zu Beginn der ICE-Sitzung vom ICE-Layer zufällig ausgewählt werden. Die Details, welche Bits zufällig sind und was der Rest des ufrag
-Textes ist, bleiben der Entscheidung der Browser-Implementierung überlassen. Zum Beispiel könnte ein Browser sich entscheiden, immer ein 24-Zeichen langes ufrag
zu verwenden, bei dem Bit 4 jedes Zeichens zufällig zwischen 0 und 1 ausgewählt wird. Ein weiteres Beispiel: Er könnte einen benutzerdefinierten String nehmen und drei 8-Bit-Zufallsbytes anhängen. Oder vielleicht ist jedes Zeichen vollständig zufällig.
Nutzungshinweise
ICE verwendet das usernameFragment
und das Passwort, um die Integrität der Nachrichten sicherzustellen. Dies vermeidet Übersprechen zwischen mehreren laufenden ICE-Sitzungen, aber vor allem hilft es, ICE-Transaktionen (und alles in WebRTC im Allgemeinen) gegen Angriffe abzusichern, die versuchen könnten, sich in einen ICE-Austausch einzufügen.
Hinweis: Es gibt keine API, um das ICE-Passwort zu erhalten, aus offensichtlich recht plausiblen Sicherheitsgründen.
Das usernameFragment
und das Passwort ändern sich jedes Mal, wenn ein ICE-Neustart erfolgt.
Beispiele
Obwohl die WebRTC-Infrastruktur veraltete Kandidaten für Sie nach einem ICE-Neustart herausfiltert, können Sie dies selbst tun, wenn Sie versuchen möchten, die Anzahl der Nachrichten, die hin und her gesendet werden, absolut zu minimieren.
Zu diesem Zweck können Sie den Wert des usernameFragment
mit dem aktuellen usernameFragment
vergleichen, das für die Verbindung verwendet wird, nachdem Sie den Kandidaten vom Signalisierungsserver erhalten haben und bevor Sie addIceCandidate()
aufrufen, um ihn zum Satz möglicher Kandidaten hinzuzufügen.
Wenn die Webanwendung eine Nachricht vom Signalisierungsserver erhält, die einen Kandidaten enthält, der der RTCPeerConnection
hinzugefügt werden soll, können Sie (und sollten im Allgemeinen sollten) addIceCandidate()
aufrufen. Es gibt normalerweise keinen Bedarf, sich manuell über die Filterung der Kandidaten Gedanken zu machen.
Stellen wir uns jedoch vor, dass wir den Datenverkehr minimieren müssen. Die folgende Funktion, ssNewCandidate()
, wird aufgerufen, wenn eine Nachricht, signalMsg
, vom Signalisierungsserver eintrifft, die einen ICE-Kandidaten enthält, der der RTCPeerConnection
hinzugefügt werden soll. Um zu vermeiden, dass Kandidaten aufgenommen werden, die durch einen ICE-Neustart obsolet geworden sind, können wir Code wie diesen verwenden:
const ssNewCandidate = (signalMsg) => {
const candidate = new RTCIceCandidate(signalMsg.candidate);
const receivers = pc.getReceivers();
for (const receiver of receivers) {
const parameters = receiver.transport.iceTransport.getRemoteParameters();
if (parameters.usernameFragment === candidate.usernameFragment) {
return;
}
}
pc.addIceCandidate(candidate).catch(window.reportError);
};
Dies durchläuft die Liste der RTCRtpReceiver
-Objekte, die verwendet werden, um ICE-Daten zu empfangen, und prüft, ob das im Kandidaten angegebene usernameFragment
mit einem von ihnen übereinstimmt. Wenn dies der Fall ist, bricht ssNewCandidate()
ab. Andernfalls fügt es den neuen Kandidaten der Verbindung hinzu, nachdem es jeden Empfänger überprüft hat.
Spezifikationen
Specification |
---|
WebRTC: Real-Time Communication in Browsers # dom-rtcicecandidate-usernamefragment |