1. Introduction
Cette section n’est pas normative.
Cette spécification utilise des protocoles enfichables, avec QUIC [QUIC-TRANSPORT] comme un de ces protocoles, pour envoyer et recevoir des données des serveurs. Ça peut être utilisé comme WebSockets mais avec prise en charge de plusieurs flux, unidirectionnel les flux, la livraison dans le désordre et le transport fiable et non fiable.
Remarque: L’API présentée dans cette spécification représente une proposition préliminaire sur la base des travaux en cours au sein du groupe de travail IETF QUIC. Depuis le transport QUIC spécification est un travail en cours, le protocole et l’API sont susceptibles de changer considérablement à l’avenir.
2. Conformité
En plus des sections marquées comme non normatives, toutes directives de rédaction, les diagrammes, exemples et notes de cette spécification ne sont pas normatifs. Tout le reste dans cette spécification est normatif.
Les mots clés DOIT et DEVRAIT doivent être interprétés comme décrit dans [RFC2119] .
Cette spécification définit les critères de conformité qui s’appliquent à un seul produit : l’agent utilisateur qui implémente les interfaces qu’il contient.
Les exigences de conformité formulées sous forme d’algorithmes ou d’étapes spécifiques peuvent être mis en œuvre de quelque manière, tant que le résultat final est équivalent. (Dans en particulier, les algorithmes définis dans cette spécification sont destinés à être facile à suivre et non destiné à être performant.)
Les implémentations qui utilisent ECMAScript pour implémenter les API définies dans ce spécification DOIT les implémenter d’une manière cohérente avec l’ECMAScript Liaisons définies dans la spécification Web IDL [WEBIDL] , comme ceci La spécification utilise cette spécification et cette terminologie.
3. Terminologie
Le Gestionnaire d'événements
interface, représentant un rappel utilisé pour l’événement et les ErrorEvent
sont définies dans [HTML] .
Les concepts mettre en file d’attente une tâche et source de tâche de mise en réseau sont définis dans [HTML] .
Les termes un événement , gestionnaires d’événements et événement du gestionnaire d’événements types sont défini dans [HTML] .
En se référant aux exceptions, les termes lancer et create sont définis dans [WEBIDL] .
Les termes rempli , rejeté , résolu, en attente et colonisé utilisés dans le cadre des Promesses sont définis dans [ECMASCRIPT-6.0] .
Les termes ReadableStream
et WritableStream
sont définis dans [WHATWG-STREAMS] . Notez que malgré le partage du nom « stream », ce sont distinct de IncomingStream, OutgoingStream et BidirectionalStream défini ici. IncomingStream, OutgoingStream et BidirectionalStream défini ici correspond à un niveau d’abstraction plus élevé qui contient et dépendent des concepts de «flux» de niveau inférieur définis dans [WHATWG-STREAMS] .
4. UnidirectionalStreamsTransport
Mixin
UNE UnidirectionalStreamsTransport
peut envoyer et recevoir flux unidirectionnels. Les données d’un flux sont livrées dans l’ordre, mais les données entre les flux peuvent être livrés hors service. Les données sont généralement envoyées de manière fiable, mais les retransmissions peuvent être désactivées ou le flux peut être interrompu pour produire une forme de manque de fiabilité. Toutes les données de flux sont cryptées et contrôlé par la congestion.
interface mixin UnidirectionalStreamsTransport {Promettre SendStream >createSendStream (optionnel SendStreamParameters ={});
paramètres ReadableStream receiveStreams (); };
4.1. Méthodes
-
createSendStream ()
-
Crée un
SendStream
objet.Quand
createSendStream ()
est appelée , l’agent utilisateur DOIT exécuter le Etapes suivantes:-
Laisser transport Soit le
UnidirectionalStreamsTransport
sur lequelcreateSendStream
est invoqué. -
Si transport ‘s
Etat
est"fermé"
ou"échoué"
, retourner immédiatement un nouveau refusée promesse avec un nouvellement crééInvalidStateError
et abandonnez ces étapes. -
Laisser p soit une nouvelle promesse.
-
Revenir p et continuez les étapes suivantes dans Contexte.
-
Résoudre p avec un nouveau
SendStream
objet et ajouter le SendStream à transport lorsque toutes les conditions suivantes sont remplies rencontré:-
Le transport ‘s
Etat
est en transition à"lié"
. -
Le contrôle du flux de création de flux n’est pas violé en dépassant le limite de flux maximale définie par le point de terminaison distant. Pour QUIC, c’est spécifié dans [QUIC-TRANSPORT].
-
p n’a pas été colonisé.
-
-
Rejeter p avec un nouveau
InvalidStateError
lorsque tous les conditions suivantes sont remplies:-
Le transport transitions d’état vers
"fermé"
ou"échoué"
. -
p n’a pas été colonisé.
-
-
-
receiveStreams ()
-
Renvoie un
ReadableStream
deReceiveStream
reçus de l’hôte distant.Quand
receiveStreams
est appelé, l’utilisateur l’agent DOIT exécuter ce qui suit pas:-
Laisser transport Soit le
UnidirectionalStreamsTransport
sur lequelreceiveStreams
est invoqué. -
Renvoyer la valeur de
[[ReceivedStreams]]
emplacement interne. -
Pour chaque flux unidirectionnel reçu, créez un correspondant
Flux entrant
et insérez-le dans[[ReceivedStreams]]
. Comme données est reçue sur le flux unidirectionnel, insérez ces données dans le correspondantIncomingStream
. Lorsque le côté distant se ferme ou s’interrompt le flux, fermez ou abandonnez le correspondantIncomingStream
.
-
4.2. Procédures
4.2.1. Ajouter SendStream à UnidirectionalStreamsTransport
4.3. SendStreamParameters Dictionary
Le SendStreamParameters
le dictionnaire comprend des informations concernant la configuration du flux
dictionnaire SendStreamParameters { };
5. BidirectionalStreamsTransport
Mixin
UNE BidirectionalStreamsTransport
peut envoyer et recevoir flux bidirectionnels. Les données d’un flux sont livrées dans l’ordre, mais les données entre les flux peuvent être livrés hors service. Les données sont généralement envoyées de manière fiable, mais les retransmissions peuvent être désactivées ou le flux peut être interrompu pour produire un formulaire de manque de fiabilité. Toutes les données du flux sont cryptées et contrôlées par la congestion.
interface mixin BidirectionalStreamsTransport {Promettre Flux bidirectionnel >createBidirectionalStream ();ReadableStream receiveBidirectionalStreams (); };
5.1. Méthodes
-
createBidirectionalStream ()
-
Crée un
BidirectionalStream
objet.Quand
createBidirectionalStream
est appelé, l’utilisateur l’agent DOIT exécuter le Etapes suivantes:-
Laisser transport Soit le
BidirectionalStreamsTransport
sur lequelcreateBidirectionalStream
est invoquée. -
Si transport ‘s
Etat
est"fermé"
ou"échoué"
, retourner immédiatement un nouveau refusée promesse avec une nouvelle créationInvalidStateError
et abandonnez ces étapes -
Si transport ‘s
Etat
est"lié"
, immédiatement retourner un nouveau promesse remplie avec une nouvelle créationFlux bidirectionnel
objet, ajoutez le BidirectionalStream à la transporter et abandonner ces étapes. -
Laisser p soit une nouvelle promesse.
-
Revenir p et continuez les étapes suivantes dans Contexte.
-
Résoudre p avec un nouveau
BidirectionalStream
objet et ajoutez le BidirectionalStream à transport lorsque tous les éléments suivants les conditions sont remplies:-
Le transport ‘s
Etat
est passé à" lié"
. -
Le contrôle du flux de création de flux n’est pas violé en dépassant le limite de flux maximale définie par le point de terminaison distant. Pour QUIC, c’est spécifié dans [QUIC-TRANSPORT].
-
p n’a pas été colonisé.
-
-
Rejeter p avec un nouveau
InvalidStateError
lorsque tous les les conditions suivantes sont remplies:-
Le transport transitions d’état vers
"fermé"
ou"échoué"
. -
p n’a pas été colonisé.
-
-
-
receiveBidirectionalStreams ()
-
Renvoie un
ReadableStream
deFlux bidirectionnel
s qui ont été reçu de l’hôte distant.Quand
receiveBidirectionalStreams
est appelée, la méthode l’agent utilisateur DOIT s’exécuter les étapes suivantes:-
Laisser transport Soit le
BidirectionalStreamsTransport
sur lequelreceiveBidirectionalStreams
est invoqué. -
Renvoyer la valeur de
[[ReceivedBidirectionalStreams]]
emplacement interne. -
Pour chaque flux bidirectionnel reçu, créez un correspondant
Flux bidirectionnel
et insérez-le dans[[ReceivedBidirectionalStreams]]
. Lorsque des données sont reçues sur le flux bidirectionnel, insérez ces données dans le correspondantFlux bidirectionnel
. Lorsque le côté distant se ferme ou s’interrompt le flux, fermez ou abandonnez le correspondantFlux bidirectionnel
.
-
5.2. Procédures
5.2.1. Ajouter BidirectionalStream à BidirectionalStreamsTransport
6. DatagramTransport
Mixin
UNE DatagramTransport
peut envoyer et recevoir datagrammes. Les datagrammes sont envoyés dans le désordre, de manière non fiable, et ont une taille maximale limitée. Les datagrammes sont cryptés et la congestion contrôlée.
interface mixin DatagramTransport {lecture seulement attribut non signé court maxDatagramSize ;WritableStream sendDatagrams ();ReadableStream recevoir des diagrammes (); };
6.1. Les attributs
-
maxDatagramSize
, de type court non signé , lecture seulement -
Les données de taille maximale qui peuvent être transmises à
sendDatagrams
.
6.2. Méthodes
-
sendDatagrams ()
-
Envoie des datagrammes qui sont écrits sur le retour
WritableStream
.Quand
sendDatagrams
est appelé, l’utilisateur l’agent DOIT exécuter les étapes suivantes:-
Laisser transport Soit le
DatagramTransport
sur lequelsendDatagram
est invoqué. -
Renvoyer la valeur de
[[SentDatagrams] ]
emplacement interne.
-
-
receiveDatagrams ()
-
Renvoyer la valeur de
[[ReceivedDatagrams]]
emplacement interne.Pour chaque datagramme reçu, insérez-le dans
[[ReceivedDatagrams]]
. Si aussi de nombreux datagrammes sont mis en file d’attente car le flux n’est pas lu rapidement assez, supprimez les datagrammes pour éviter la file d’attente. Les implémentations devraient être plus anciennes datagrammes en faveur de datagrammes plus récents. Le nombre de datagrammes à mettre en file d’attente doit être suffisamment petit pour éviter d’ajouter une latence importante au paquet livraison lorsque le flux est lu lentement (en raison de la lenteur du lecteur) mais suffisamment grand pour éviter de perdre des paquets lorsque le flux n’est pas lu pendant de courtes périodes (en raison d’une pause du lecteur).
7. WebTransport
Mixin
Le WebTransport
comprend les méthodes communes à tous les transports, tels que l’état, les changements d’état et la possibilité de fermer le transport.
interface mixin {
WebTransport lecture seulement attribut WebTransportState Etat ;lecture seulement attribut Promettre WebTransportCloseInfo >fermé ;néant proche (optionnel WebTransportCloseInfo ={});
closeInfo attribut Gestionnaire d'événements onstatechange ; };
7.1. Les attributs
-
Etat
, de type WebTransportState , lecture seulement -
L’état actuel du transport. En obtenant, il DOIT retourner la valeur de les
[[WebTransportState]]
emplacement interne. -
fermé
, de type Promise WebTransportCloseInfo >, en lecture seule -
Cette promesse DOIT être résolu lorsque le transport est fermé; une la mise en œuvre DEVRAIT inclure des informations d’erreur dans le
raison
etcode d'erreur
champs deWebTransportCloseInfo
. -
onstatechange
, de type Gestionnaire d’événements -
Ce gestionnaire d’événements, de type événement gestionnaire d’événements
statechange
, DOIT être renvoyé à tout moment le[[WebTransportState]]
change d’emplacement, sauf si l’état change en raison de l’appelproche
.
7.2. Méthodes
-
proche()
-
Ferme l’objet WebTransport. Pour QUIC, cela déclenche un Immédiat Fermer comme décrit dans [QUIC-TRANSPORT] section 10.3.
Lorsque close est appelé, l’agent utilisateur DOIT exécuter le Etapes suivantes:
-
Laisser transport être le WebTransport sur lequel
proche
est invoqué. -
Si transport ‘s
[[WebTransportState]]
est"fermé"
ou"échoué"
, puis abandonnez ces étapes. -
Ensemble transport ‘s
[[WebTransportState]]
à"fermé"
. -
Laisser
closeInfo
être le premier argument. -
Pour QUIC, démarrez le Fermeture immédiate en envoyant un Cadre CONNECTION_CLOSE avec sa valeur de code d’erreur définie sur la valeur
code d'erreur
et sa valeur de raison définie sur valeur deraison
.
-
7.3. WebTransportState
Enum
WebTransportState
indique l’état du transport.
énumération WebTransportState {"de liaison" ,"lié" ,"fermé" ,"échoué" };
-
"de liaison"
-
Le transport est en train de négocier une connexion sécurisée . Une fois par une connexion sécurisée est négociée, les données entrantes peuvent circuler.
-
"lié"
-
Le transport a terminé la négociation d’une connexion sécurisée. Sortant les données et les médias peuvent désormais circuler.
-
"fermé"
-
Le transport a été fermé intentionnellement via un appel à
proche()
ou réception d’un message de fermeture de la télécommande côté. Quand leWebTransport
interne[[WebTransportState]]
fente transitions versfermé
l’agent utilisateur DOIT exécuter les étapes suivantes:-
Laisser transport Soit le
WebTransport
. -
Fermer la
ReadableStream
dans transport[[ReceivedStreams]]
emplacement interne. -
Fermer la
ReadableStream
dans transport[[ReceivedBidirectionalStreams]]
emplacement interne. -
Pour chaque
OutgoingStream
dans transport[[OutgoingStreams]]
slot interne exécutez ce qui suit:-
Laisser courant Soit le
Flux sortant
. -
Retirer le courant du transport
[[OutgoingStreams]]
emplacement interne.
-
-
-
"échoué"
-
Le transport a été fermé suite à une erreur (comme la réception de une alerte d’erreur). Lorsque l’interne du WebTransport
[[WebTransportState]]
Transitions de slot verséchoué
l’agent utilisateur DOIT exécuter les étapes suivantes:-
Fermer la
ReadableStream
dans transport ‘s[[ReceivedStreams]]
emplacement interne. -
Fermer la
ReadableStream
dans transport ‘ s[[ReceivedBidirectionalStreams]]
fente interne . -
Pour chaque
Flux sortant
dans transport[[OutgoingStreams]]
la fente interne exécute ce qui suit:-
Retirer le courant du transport
[[OutgoingStreams]]
emplacement interne.
-
-
7.4. WebTransportCloseInfo
Dictionnaire
Le WebTransportCloseInfo
dictionnaire comprend des informations relative au code d’erreur pour la fermeture d’un WebTransport
. Pour QUIC, cela les informations sont utilisées pour définir le code d’erreur et la raison d’un CONNECTION_CLOSE Cadre.
dictionnaire WebTransportCloseInfo {non signé court code d'erreur =0;DOMString raison =""; };
Le dictionnaire DOIT avoir les attributs suivants:
-
code d'erreur
, de type court non signé , par défaut0
-
Le code d’erreur communiqué au pair.
-
raison
, de type DOMSt sonnerie , par défaut à""
-
La raison de la fermeture du
WebTransport
.
7.5. QuicTransportStats
Dictionnaire
Le QuicTransportStats
le dictionnaire comprend des informations sur les statistiques de niveau de connexion QUIC.
dictionnaire QuicTransportStats {DOMHighResTimeStamp horodatage ;non signé longue longue octetsEnvoyé ;non signé longue longue paquets Envoyés ;non signé longue numOutgoingStreamsCreated ;non signé longue numIncomingStreamsCreated ;non signé longue longue octets reçus ;non signé longue longue paquets reçus ;DOMHighResTimeStamp minRtt ;non signé longue numReceivedDatagramsDropped ; };
Le dictionnaire DOIT avoir les attributs suivants:
-
horodatage
, de type DOMHighResTimeStamp -
Le
horodatage
pour quand les statistiques sont recueillies, par rapport à la Époque UNIX (1er janvier 1970, UTC). -
octetsEnvoyé
, de type non signé long long -
Le nombre d’octets envoyés sur la connexion QUIC, y compris retransmissions. N’inclut pas UDP ou tout autre cadrage extérieur.
-
paquets Envoyés
, de type non signé long long -
Le nombre de paquets envoyés sur la connexion QUIC, y compris retransmissions.
-
numOutgoingStreamsCreated
, de type non signé long -
Le nombre de flux QUIC sortants créés sur la connexion QUIC .
-
numIncomingStreamsCreated
, de type non signé long -
Le nombre de flux QUIC entrants créés sur la connexion QUIC .
-
octets reçus
, de type non signé long long -
Le nombre total d’octets reçus sur la connexion QUIC, comprenant données en double pour les flux. N’inclut pas UDP ou tout autre cadrage extérieur.
-
paquets reçus
, de type non signé long long -
Le nombre total de paquets reçus sur la connexion QUIC, comprenant paquets qui n’étaient pas traitables.
-
minRtt
, de type DOMHighResTimeStamp -
Le RTT minimum observé sur l’ensemble de la connexion.
-
numReceivedDatagramsDropped
, de type non signé long -
Le nombre de datagrammes qui ont été supprimés, en raison de trop de nombreux datagrammes tamponnés entre les appels au
receiveDatagrams ()
.
8. QuicTransport
Interface
Le QuicTransport
est un UnidirectionalStreamsTransport
, une BidirectionalStreamsTransport
, et un DatagramTransport
. SendStream
le sable ReceiveStream
s sont implémentés avec des flux QUIC unidirectionnels tels que définis dans [QUIC-TRANSPORT] . Flux bidirectionnel
sont implémentés avec des flux QUIC bidirectionnels comme défini dans [QUIC-TRANSPORT] . Les datagrammes sont implémentés avec des datagrammes QUIC comme défini dans [QUIC-DATAGRAM] .
8.1. Configuration
dictionnaire QuicTransportOptions {séquence RTCDtlsFingerprint >serverCertificateFingerprints ; };
QuicTransportOptions
est un dictionnaire de paramètres qui déterminent comment la connexion QuicTransport est établie et utilisée.
-
serverCertificateFingerprints
, de type séquence RTCDtlsFingerprint > -
S’il n’est pas vide, l’agent utilisateur DOIT considérer certificat de serveur approuvé si et seulement si cela peut réussir vérifier une empreinte digitale de certificat contre
serverCertificateFingerprints
et satisfait Exigences de certificat personnalisé . L’agent utilisateur DOIT ignorer tout empreinte digitale qui utilise un inconnualgorithme
ou a un mal formévaleur
. S’il est vide, l’agent utilisateur DOIT utiliser les procédures de vérification des certificats qu’il utiliserait pour la normale récupérer les opérations .
À calculer un certificat empreinte digitale, procédez comme suit:
À vérifier une empreinte digitale de certificat , procédez comme suit:
-
Laisser fprs être le tableau d’entrée des empreintes digitales .
-
Laisser ref_fpr Soit le calculé empreinte digitale du certificat d’entrée.
-
Pour chaque empreinte digitale fpr dans fprs :
-
Si
algorithme
de fpr est égal à « sha-256 », etvaleur
de fpr est égal à ref_fpr , les le certificat est valide. Retourne vrai.
-
-
Retour faux.
Le exigences de certificat personnalisé sont les suivants: le certificat DOIT être un certificat X.509v3 tel que défini dans [RFC5280] , l’heure actuelle DOIT être dans la période de validité du certificat tel que défini dans la section 4.1.2.5 de [RFC5280] et la durée totale de la période de validité NE DOIT PAS dépasser deux semaines.
Réexaminez la période ci-dessus. Nous voulons qu’il soit suffisamment grand que les applications qui l’utilisent pour les certificats éphémères peuvent le faire sans avoir à lutter contre le décalage horaire, mais suffisamment petit pour décourager une utilisation à long terme sans rotation des touches.
8.2. Définition de l’interface
[Exposed =(Window ,Worker )]interface QuicTransport {(
constructeur USVString ,
URL optionnel QuicTransportOptions ={});
options Promettre QuicTransportStats >getStats (); };QuicTransport comprend UnidirectionalStreamsTransport ;QuicTransport comprend BidirectionalStreamsTransport ;QuicTransport comprend DatagramTransport ;QuicTransport comprend WebTransport ;
Quand le QuicTransport ()
constructeur est invoqué, l’utilisateur l’agent DOIT exécuter les étapes suivantes:
-
Laisser parsedURL Soit le Enregistrement d’URL résultant de analyse de
URL
. -
Si parsedURL est un échec, jeter une
Erreur de syntaxe
exception. -
Si parsedURL schème n’est pas
quic-transport
, jeter uneErreur de syntaxe
exception. -
Si parsedURL fragment est non nulle, jeter une
Erreur de syntaxe
exception. -
Laisser transport être nouvellement construit
QuicTransport
objet. -
Laisser transport avoir un
[[OutgoingStreams]]
fente interne représentant une séquence deFlux sortant
objets, initialisés à vider. -
Laisser transport avoir un
[[ReceivedStreams]]
fente interne représentant unReadableStream
deIncomingStream
objets, initialisés à vider. -
Laisser transport avoir un
[[ReceivedBidirectionalStreams]]
emplacement interne représentant unReadableStream
deFlux entrant
objets, initi alizé pour vider. -
Laisser transport avoir un
[[WebTransportState]]
interne emplacement, initialisé à"de liaison"
. -
Laisser transport avoir un
[[SentDatagrams]]
fente interne représentant unWritableStream
deUint8Array
s, initialisé à vide. -
Laisser transport avoir un
[[ReceivedDatagrams]]
interne emplacement représentant unReadableStream
deUint8Array
s, initialisé à vide. -
Exécutez ces étapes en parallèle:
-
Laisser clientOrigin être transport ‘ s objet de paramètres pertinents [QUIC-TRANSPORT] origine, sérialisé .
-
Établissez une connexion QUIC à l’adresse identifiée par parsedURL en suivant les procédures de [WEB-TRANSPORT-QUIC] section 3 et en utilisant clientOrigin comme « origine du client » référencée dans la section 3.2. 1. Lors de l’établissement de la connexion, suivez tous les paramètres spécifié dans le
options
. -
Si la connexion échoue, réglez transport ‘ s
[[WebTransportState]]
emplacement interne à"échoué"
et abandonner ces étapes . -
Ensemble transport ‘s
[[WebTransportState]]
emplacement interne à"lié"
.
-
-
Revenir transport.
8.3. Méthodes
-
getStats ()
-
Recueille des statistiques pour cela
QuicTransport
est QUIC connexion et rapporte le résultat de manière asynchrone.Lorsque close est appelé, l’agent utilisateur DOIT exécuter le Etapes suivantes:
-
Laisser transport être le QuicTransport sur lequel
getStats
est invoqué. -
Laisser p soit une nouvelle promesse.
-
Revenir p et continuez les étapes suivantes dans Contexte.
-
Rassemblez les statistiques de la connexion QUIC sous-jacente.
-
Une fois les statistiques recueillies, résolvez p avec le
QuicTransportStats
, représentant les statistiques recueillies.
-
-
9. Interface Mixin Flux sortant
Une Flux sortant
est un flux qui peut être écrit, comme soit un SendStream
ou un BidirectionalStream
.
[Exposed =(Window ,Worker ) ]interface mixin Flux sortant {lecture seulement attribut WritableStream inscriptible ;lecture seulement attribut Promettre StreamAbortInfo >écrit Avorté ;néant abortWriting (optionnel StreamAbortInfo ={}); };
abortInfo
9.1. Aperçu
Le Flux sortant
s’initialise avec ce qui suit:
-
Laisser courant Soit le
Flux sortant
. -
Laisser courant avoir un
[[Writable]]
slot interne initialisé sur un nouveauWritableStream
.
9.2. Les attributs
-
inscriptible
, de type WritableStream , en lecture seule -
Le
inscriptible
l’attribut représente unWritableStream
(d’octets) pouvant être utilisé pour écrire auFlux sortant
. Une fois obtenu, il DOIT retourner le valeur de[[Writable]]
fente. -
écrit Avorté
, de type Promise StreamAbortInfo >, en lecture seule -
Le
écritAvorté
attribut représente une promesse que est rempli lorsqu’un message du côté distant interrompant le flux est reçu. Pour QUIC, ce message est une trame STOP_SENDING. Lorsque le flux reçoit ce message, l’agent utilisateur DOIT exécuter ce qui suit:-
Laisser courant Soit le
OutgoingStream
objet. -
Laisser transport Soit le
WebTransport
, lequel à courant a été créé de. -
Supprimer le flux du transport ‘s
[[OutgoingStreams]]
fente interne. -
Résoudre la promesse avec le résultat
StreamAbortInfo
avec lescode d'erreur
réglé sur la valeur de l’avortement message du côté distant.
-
9.3. Méthodes
-
abortWriting ()
-
Un arrêt dur du
Flux sortant
. Il peut être appelé indépendamment de si leFlux sortant
a été créé par l’homologue local ou distant. Quand lesabortWriting
est appelée, l’agent utilisateur DOIT exécuter ce qui suit pas:-
Laisser courant Soit le
Flux sortant
objet qui est sur le point d’avorter l’écriture. -
Laisser transport Soit le
WebTransport
, lequel les courant a été créé de. -
Retirez le flux du transport
[[OutgoingStreams]]
interne fente. -
Laisser abortInfo sera le premier argument.
-
Démarrez la procédure de fermeture en envoyant une trame RST_STREAM avec son code d’erreur défini sur la valeur de | abortInfo.errorCode |.
-
9.4. StreamAbortInfo
Dictionnaire
Le StreamAbortInfo
dictionnaire comprend des informations relatif au code d’erreur pour abandonner un flux entrant ou sortant. (Pour QUIC, dans une trame RST_STREAM ou une trame STOP_SENDING).
dictionnaire StreamAbortInfo {non signé court code d'erreur =0; };
Le dictionnaire DOIT avoir les champs suivants:
-
code d'erreur
, de type court non signé , par défaut0
-
Le code d’erreur. La valeur par défaut de 0 signifie « FERMETURE ».
dix. Interface Mixin IncomingStream
Une IncomingStream
est un flux qui peut être lu depuis , comme soit un ReceiveStream
ou un BidirectionalStream
.
[Exposed =(Window ,Worker ) ]interface mixin Flux entrant {lecture seulement attribut ReadableStream lisible ;lecture seulement attribut Promettre StreamAbortInfo >lectureAvorté ;néant avortReading (optionnel StreamAbortInfo ={});
abortInfo Promettre ArrayBuffer >arrayBuffer (); };
10.1. Aperçu
Le IncomingStream
s’initialise avec ce qui suit:
-
Laisser courant Soit le
IncomingStream
. -
Laisser courant avoir un
[[Readable]]
slot interne initialisé sur un nouveauReadableStream
.
10.2. Les attributs
-
lisible
, de type ReadableStream , lecture seulement -
Le
lisible
l’attribut représente unReadableStream
qui peut être utilisé pour lire à partir duFlux entrant
. Une fois obtenu, il DOIT retourner le valeur deFlux entrant
[HTML] [[Readable]] fente. -
lectureAvorté
, de type Promise StreamAbortInfo >, en lecture seule -
Le
lectureAvorté
attribut représente une promesse que est rempli lorsque le message du côté distant est abandonné le flux est reçu. Pour QUIC, ce message est une trame RST_STREAM. Lorsque le flux reçoit ce message, l’agent utilisateur DOIT exécuter ce qui suit:-
Laisser courant Soit le
IncomingStream
objet pour lequel l’avortement message a été reçu. -
Laisser transport Soit le
WebTransport
, lequel à courant a été créé de. -
Résoudre la promesse avec le résultat
StreamAbortInfo
avec lescode d'erreur
mis à la valeur de l’abandon message du côté distant.
-
10.3. Méthodes
-
abortReading ()
-
Un arrêt dur du
Flux entrant
. Il peut être appelé indépendamment de si leFlux entrant
a été créé par le pair local ou distant. Quand lesabortWriting
est appelée, l’agent utilisateur DOIT exécuter ce qui suit pas:-
Laisser courant Soit le
Flux entrant
objet sur le point d’abandonner en train de lire. -
Laisser transport Soit le
WebTransport
, lequel à courant a été créé de. -
Laisser abortInfo sera le premier argument.
-
Démarrez la procédure de fermeture en envoyant un message à la télécommande côté indiquant que le flux a été abandonné (pour QUIC, il s’agit d’un Cadre STOP_SENDING) avec son code d’erreur défini sur la valeur de | abortInfo.errorCode |.
-
-
arrayBuffer ()
-
Une méthode pratique qui lit de manière asynchrone tout le contenu de | IncomingStream.readable | et le renvoie comme un ArrayBuffer. Cela verrouille le diffuser pendant la lecture, comme si | IncomingStream.readable.getReader () | étaient utilisé.
11. Interface BidirectionalStream
[Exposed =(Window ,Worker ) ]interface { };
BidirectionalStream Flux bidirectionnel comprend Flux sortant ;Flux bidirectionnel comprend Flux entrant ;
12. Interface SendStream
[Exposed =(Window ,Worker ) ]interface { };
SendStream SendStream comprend Flux sortant ;
13. Interface ReceiveStream
[Exposed =(Window ,Worker ) ]interface { };
ReceiveStream ReceiveStream comprend Flux entrant ;
14. Http3Transport
Interface
14.1. Aperçu
Une Http3Transport
est un UnidirectionalStreamsTransport
, une BidirectionalStreamsTransport
, et un DatagramTransport
. SendStream
s, ReceiveStream
le sable Flux bidirectionnel
s sont implémenté avec des flux HTTP / 3 comme défini dans [WEB-TRANSPORT-HTTP3] . Les datagrammes sont implémentés avec des datagrammes QUIC tels que définis dans [WEB-TRANSPORT-HTTP3] .
14.2. Définition de l’interface
[Exposed =(Window ,Worker )]interface Http3Transport {(
constructeur DOMString ); };
url Http3Transport comprend UnidirectionalStreamsTransport ;Http3Transport comprend BidirectionalStreamsTransport ;Http3Transport comprend DatagramTransport ;Http3Transport comprend WebTransport ;
14.2. 1. Constructeurs
Quand le Http3Transport ()
constructeur est invoqué, l’utilisateur l’agent DOIT exécuter les étapes suivantes:
-
Laisser transport être nouvellement construit
Http3Transport
objet avec état « de liaison ». -
Laisser transport avoir un
[[OutgoingStreams]]
slo interne t représentant une séquence deFlux sortant
objets, initialisés à vide. -
Laisser transport avoir un
[[ReceivedStreams]]
fente interne représentant unReadableStream
deFlux entrant
objets, initialisés à vider. -
Laisser transport avoir un
[[ReceivedBidirectionalStreams]]
sl interne ot représentant unReadableStream
deFlux entrant
objets, initialisés pour être vides. -
Laisser transport avoir un
[[SentDatagrams]]
interna fente représentant unWritableStream
deUint8Array
s, initialisé à vide. -
Laisser transport avoir un
[[ReceivedDatagrams]]
int éternel emplacement représentant unReadableStream
deUint8Array
s, initialisé à vide. -
Exécutez ces étapes en parallèle:
-
Établir une connexion HTTP / 3 ou réutiliser une connexion existante HTTP / 3 connexion à l’hôte spécifié par l’url, comme spécifié dans [WEB-TRANSPORT-HTTP3] .
-
S’il n’y a pas une telle connexion HTTP / 3 à réutiliser et la création de une nouvelle connexion HTTP / 3, définissez transport
[[WebTransportState]]
emplacement interne pour"échoué"
et abandonnez ces étapes. -
Une fois la connexion établie, une connexion HTTP / 3 est établie, suis les étapes spécifié dans [WEB-TRANSPORT-HTTP3] section 4 pour l’établissement d’un Session WebTransport dans la connexion HTTP / 3.
-
Si l’établissement de la session WebTransport échoue, définissez les paramètres de transport
[[WebTransportState]]
emplacement interne à"échoué"
et abandonner celles-ci pas. -
Une fois la session établie, réglez transport
[[WebTransportState]]
emplacement interne à"lié"
et abandonner ces pas.
-
-
Revenir transport.
15. Considérations sur la confidentialité et la sécurité
Cette section n’est pas normative; il ne spécifie aucun nouveau comportement, mais à la place résume les informations déjà présentes dans d’autres parties de la spécification.
15.1. Confidentialité des communications
Le fait que la communication ait lieu ne peut pas être caché à adversaires qui peut observer le réseau, cela doit donc être considéré comme une information publique.
Tous les protocoles de transport décrits dans ce document utilisent soit TLS [RFC8446] ou un protocole sémantiquement équivalent, fournissant ainsi tous les propriétés de sécurité de TLS, y compris la confidentialité et l’intégrité du circulation. QuicTransport et Http3Transport utilisent le même certificat mécanisme de vérification en tant que requêtes HTTP sortantes, reposant ainsi sur le même infrastructure à clé publique pour l’authentification du serveur distant. Dans WebTransport, les erreurs de vérification de certificat sont fatales; pas d’interstitiel permettant de contourner la validation du certificat est disponible.
15.2. Persistance de l’état
WebTransport ne crée pas en soi de nouveaux identifiants uniques ou de nouvelles façons pour stocker l’état de manière persistante, et il n’expose pas automatiquement état persistant existant sur le serveur. Par exemple, aucun des transports défini dans ce document envoie automatiquement des cookies, supporte HTTP mécanismes d’authentification ou de mise en cache d’invalidation. Puisqu’ils utilisent TLS, ils peuvent prendre en charge les tickets de session TLS, qui pourraient être utilisés par le serveur (mais pas par observateurs de réseaux passifs) pour corréler différentes connexions à partir du même client. Ce n’est pas spécifique à WebTransport en soi, mais plutôt inhérent propriété de tous les protocoles basés sur TLS; ainsi, ceci est hors de portée pour cette spécification.
15.3. Sécurité du protocole
WebTransport impose un ensemble d’exigences communes à tous les protocoles, décrit dans [WEB-TRANSPORT-OVERVIEW] . Les plus notables incluent:
-
Tous les transports doivent s’assurer que le serveur distant sait que les la connexion en question provient d’une application Web; Ceci est nécessaire pour empêcher les attaques entre protocoles. Les transports basés sur QUIC utilisent ALPN [RFC7301] Dans ce but.
-
Tous les transports doivent permettre au serveur de filtrer les connexions en fonction de les origine de la ressource à l’origine de la session de transport.
-
Tous les transports nécessitent que les agents utilisateurs vérifient continuellement que le serveur est toujours intéressé à leur parler (concept communément appelé «consentement Fraîcheur »).
Les considérations de sécurité du protocole liées aux transports individuels sont décrit dans les Considérations de sécurité des sections correspondantes documents de protocole, [WEB-TRANSPORT-QUIC] et [WEB-TRANSPORT-HTTP3] .
Les API de mise en réseau peuvent être couramment utilisées pour analyser le réseau local pour disponible hôtes, et donc être utilisé pour les empreintes digitales et d’autres formes d’attaques. WebTransport suit le WebSocket approche à ce problème: l’erreur de connexion spécifique n’est renvoyée que une le point de terminaison est vérifié comme étant un point de terminaison WebTransport; ainsi, l’application Web ne peut pas faire la distinction entre un point de terminaison inexistant et le point de terminaison qui n’est pas prêt à accepter les connexions du Web.
16. Exemples
16.1. Envoi d’un tampon de datagrammes
Cette section n’est pas normative.
L’envoi d’un tampon de datagrammes peut être réalisé en utilisant le sendDatagrams ()
méthode. Dans l’exemple suivant les datagrammes ne sont envoyés que si DatagramTransport
est prêt à envoyer.
const transport= getTransport() ; const écrivain= transport. sendDatagrams(). getWriter(); const datagrammes= getDatagramsToSend(); datagrammes. pour chaque(( datagramme) => { attendre l'écrivain. prêt; écrivain. écrire( datagramme); });
16.2. Envoi de datagrammes à un taux fixe
Cette section n’est pas normative.
Envoi de datagrammes à un taux fixe peu importe si le transport est prêt à envoyer peut être réalisé en utilisant simplement sendDatagrams ()
et pas en utilisant le prêt
attribut. Des scénarios plus complexes peuvent utiliser le prêt
attribut.
// Envoie des datagrammes toutes les 100 ms. const transport= getTransport(); const écrivain= transport. sendDatagrams(). getWriter(); setInterval(() => { écrivain. écrire( createDatagram()); }, 100 );
16,3 . Réception de datagrammes
Cette section n’est pas normative.
La réception des datagrammes peut être obtenue en appelant receiveDatagrams ()
, rappelant de vérifier la valeur null valeurs indiquant que les paquets ne sont pas traités assez rapidement.
const transport= getTransport(); const lecteur= transport. recevoir des diagrammes(). getReader(); tandis que ( vrai ) { const { valeur: datagramme, terminé} = attendent le lecteur. lis() ; si ( terminé) { Pause ; } // Traite les données }
16.4. Réception de ReceiveStream
Cette section n’est pas normative.
La lecture à partir de ReceiveStreams peut être réalisée en appelant receiveStreams ()
, puis obtenir le lecteur pour chacun ReceiveStream
.
const transport= getTransport(); const receiveStreamReader= transport. receiveStreams() . getReader(); tandis que ( vrai ) { const { valeur: receiveStream, terminé: readingReceiveStreamsDone} = attendre recevoirStreamReader. lis(); si ( readingReceiveStreamsDone) { Pause ; } // Traite les flux de réception créés par le point de terminaison distant. const chunkReader= receiveStream. lisible. getReader(); tandis que ( vrai ) { const { valeur: tronçon, terminé: lecture de morceaux terminés} = attendent chunkReader. lis(); si ( lecture ChunksDone) { Pause ; } processTheData( tronçon); } }
17. Remerciements
Les éditeurs souhaitent remercier les présidents des groupes de travail et l’équipe de contact, Harald Alvestrand, Stefan Håkansson, Bernard Aboba et Dominique Hazaël-Massieux, pour leur soutien. Contributions à cette spécification ont été fournis par Robin Raymond.
Le QuicTransport
et QuicStream
Les objets ont été initialement décrits dans le W3C ORTC CG , et ont été adaptés pour utiliser dans cette spécification.