Aller au contenu principal

7. Couche de tramage HTTP (HTTP Framing Layer)

Les trames HTTP sont transportées sur les flux QUIC, comme décrit dans la section 6. HTTP/3 définit trois types de flux : flux de contrôle, flux de requête et flux de poussée. Cette section décrit les formats de trame HTTP/3 et leurs types de flux autorisés ; voir le tableau 1 pour un aperçu.

Tableau 1 : Aperçu des trames HTTP/3 et des types de flux

TrameFlux de contrôleFlux de requêteFlux de pousséeSection
DATANonOuiOui7.2.1
HEADERSNonOuiOui7.2.2
CANCEL_PUSHOuiNonNon7.2.3
SETTINGSOui (1)NonNon7.2.4
PUSH_PROMISENonOuiNon7.2.5
GOAWAYOuiNonNon7.2.6
MAX_PUSH_IDOuiNonNon7.2.7
RéservéOuiOuiOui7.2.8

La trame SETTINGS ne peut apparaître que comme première trame d'un flux de contrôle ; ceci est indiqué dans le tableau 1 par un (1).

Notez que, contrairement aux trames QUIC, les trames HTTP/3 peuvent s'étendre sur plusieurs paquets.

7.1. Disposition des trames (Frame Layout)

Toutes les trames ont le format suivant :

HTTP/3 Frame Format {
Type (i),
Length (i),
Frame Payload (..),
}

Une trame comprend les champs suivants :

  • Type : Un entier de longueur variable qui identifie le type de trame
  • Length (Longueur) : Un entier de longueur variable qui décrit la longueur en octets de la charge utile de la trame
  • Frame Payload (Charge utile de la trame) : Une charge utile dont la sémantique est déterminée par le champ Type

La charge utile de chaque trame DOIT (MUST) contenir exactement les champs identifiés dans sa description. Une charge utile de trame contenant des octets supplémentaires ou se terminant prématurément DOIT (MUST) être traitée comme une erreur de connexion de type H3_FRAME_ERROR.

7.2. Définitions des trames (Frame Definitions)

7.2.1. DATA

Les trames DATA (type=0x00) transmettent des séquences d'octets arbitraires de longueur variable associées au contenu de requête ou de réponse HTTP.

Les trames DATA DOIVENT (MUST) être associées à une requête ou réponse HTTP. Si une trame DATA est reçue sur un flux de contrôle, le destinataire DOIT (MUST) répondre avec une erreur de connexion de type H3_FRAME_UNEXPECTED.

7.2.2. HEADERS

La trame HEADERS (type=0x01) est utilisée pour transporter une section de champ HTTP encodée avec QPACK.

Les trames HEADERS ne peuvent être envoyées que sur les flux de requête ou les flux de poussée. Si une trame HEADERS est reçue sur un flux de contrôle, le destinataire DOIT (MUST) répondre avec une erreur de connexion de type H3_FRAME_UNEXPECTED.

7.2.3. CANCEL_PUSH

La trame CANCEL_PUSH (type=0x03) est utilisée pour demander l'annulation d'une poussée serveur avant la réception du flux de poussée.

Lorsqu'un client envoie une trame CANCEL_PUSH, il indique qu'il ne souhaite pas recevoir la ressource promise. Le serveur DEVRAIT (SHOULD) abandonner l'envoi de la ressource.

Les trames CANCEL_PUSH sont envoyées sur le flux de contrôle. Recevoir une trame CANCEL_PUSH sur un flux de requête ou un flux de poussée DOIT (MUST) être traité comme une erreur de connexion de type H3_FRAME_UNEXPECTED.

7.2.4. SETTINGS

La trame SETTINGS (type=0x04) transmet les paramètres de configuration qui affectent la manière dont les points de terminaison communiquent.

Les trames SETTINGS DOIVENT (MUST) être envoyées comme première trame de chaque flux de contrôle. Les trames SETTINGS NE DOIVENT PAS (MUST NOT) être envoyées sur d'autres flux.

Les identifiants de paramètres définis incluent :

  • SETTINGS_MAX_FIELD_SECTION_SIZE (0x06) : Taille maximale de section de champ
  • SETTINGS_QPACK_MAX_TABLE_CAPACITY (0x01) : Paramètre lié à QPACK
  • SETTINGS_QPACK_BLOCKED_STREAMS (0x07) : Paramètre lié à QPACK

7.2.5. PUSH_PROMISE

La trame PUSH_PROMISE (type=0x05) est utilisée pour transporter une section de champ d'en-tête de requête promise du serveur au client sur un flux de requête.

Les trames PUSH_PROMISE ne peuvent être envoyées que sur les flux de requête. Recevoir une trame PUSH_PROMISE sur un flux de contrôle ou un flux de poussée DOIT (MUST) être traité comme une erreur de connexion de type H3_FRAME_UNEXPECTED.

7.2.6. GOAWAY

La trame GOAWAY (type=0x07) est utilisée pour initier l'arrêt gracieux d'une connexion.

Les trames GOAWAY sont toujours envoyées sur le flux de contrôle. Recevoir une trame GOAWAY sur un flux de requête ou un flux de poussée DOIT (MUST) être traité comme une erreur de connexion de type H3_FRAME_UNEXPECTED.

7.2.7. MAX_PUSH_ID

La trame MAX_PUSH_ID (type=0x0d) est utilisée par les clients pour contrôler le nombre de poussées serveur que le serveur peut initier.

Les trames MAX_PUSH_ID sont toujours envoyées sur le flux de contrôle. Un serveur NE DOIT PAS (MUST NOT) envoyer de trame MAX_PUSH_ID.

7.2.8. Types de trames réservés (Reserved Frame Types)

Les types de trames au format 0x1f * N + 0x21 pour des valeurs entières non négatives de N sont réservés pour exercer l'exigence que les types inconnus soient ignorés. Ces trames n'ont pas de sémantique et peuvent être envoyées sur n'importe quel flux.