TsgcWebTransportSession › Eigenschaften › QuarterStreamId
Die Sitzungsidentität in der kompakten Form, die WebTransport-Datagramme verwenden: SessionId geteilt durch 4.
property QuarterStreamId: Int64 read GetQuarterStreamId;
Int64 (__int64 in C++Builder, long in C#).
Wird bei jedem Lesen als SessionId div 4 berechnet. Es gibt keinen gespeicherten Wert und keinen eigenen Standardwert.
Schreibgeschützt. Diese Eigenschaft ist undurchsichtig, solange Sie nicht wissen, warum der RFC durch vier teilt, hier daher die Begründung.
Woher die Vier kommt. QUIC vergibt Stream-IDs nicht fortlaufend. Es kodiert zwei Bedeutungsbits am unteren Ende jeder Stream-ID: Bit 0 gibt an, wer den Stream geöffnet hat (0 = Client, 1 = Server), und Bit 1 gibt an, ob er bidirektional (0) oder unidirektional (1) ist. Daher schreiten die vier Stream-Arten in Schritten von vier voran:
| Stream-ID | Art |
|---|---|
0, 4, 8, ... | clientinitiiert, bidirektional |
1, 5, 9, ... | vom Server initiiert, bidirektional |
2, 6, 10, ... | vom Client initiiert, unidirektional |
3, 7, 11, ... | server-initiiert, unidirektional |
Eine WebTransport-Session-ID ist immer die ID eines vom Client initiierten bidirektionalen Streams, der Extended-CONNECT-Anfrage. Diese IDs sind daher immer Vielfache von vier: 0, 4, 8, 12 und so weiter. Die untersten zwei Bits tragen in diesem Kontext keine Information, sie sind immer null.
Warum das wichtig ist. Jedes WebTransport-Datagramm muss seine Sitzung benennen, und ein Datagramm hat keinen Stream, der es identifiziert. Da ein Datagramm unzuverlässig und oft klein ist, wäre es verschwenderisch, Bytes für einen redundanten Bezeichner aufzuwenden. RFC 9297 (HTTP Datagrams) stellt deshalb jedem Datagramm eine Quarter-Stream-ID voran: die Session-ID um zwei Stellen nach rechts verschoben, wobei die beiden Bits entfallen, die immer null sind. Zum Kodieren durch vier teilen, zum Dekodieren mit vier multiplizieren, es geht nichts verloren, und der Varint ist häufig ein Byte kürzer.
Was Sie damit tun. Normalerweise nichts. Die Bibliothek kodiert das Präfix in SendDatagram und dekodiert es auf dem eingehenden Pfad, wobei sie den Wert mit dem QuarterStreamId jeder Sitzung abgleicht, um die richtige Sitzung zu finden. Die Eigenschaft wird für Diagnose und Tracing auf Paketebene bereitgestellt. Da Datagramme im Auslieferungszustand inaktiv sind (siehe SendDatagram), ist QuarterStreamId vor allem beim Lesen eines Paketmitschnitts von Interesse.
Beachten Sie, dass eine Session-ID von 0 und eine von 3 beide eine Quarter-Stream-ID von 0 ergeben würden. Das ist in der Praxis keine Kollision, da eine Session-ID konstruktionsbedingt immer ein Vielfaches von vier ist.
// SessionId 4 -> QuarterStreamId 1, encoded as varint(1) in a datagram prefix
memoLog.Lines.Add(Format('session %d has quarter-stream-id %d',
[oSession.SessionId, oSession.QuarterStreamId]));