====== std.net.quic ====== QUIC (RFC 9000) ist ein modernes Transportprotokoll auf UDP-Basis, das von Google entwickelt und durch die IETF standardisiert wurde. Gegenüber TCP+TLS bietet QUIC integrierte TLS 1.3-Verschlüsselung, Stream-Multiplexing ohne Head-of-Line-Blocking und schnellere Verbindungsaufbauzeiten (0-RTT/1-RTT Handshake). QUIC ist die Transportschicht von HTTP/3. Die Unit implementiert den QUIC-Handshake, Stream-Management (öffnen/schließen/lesen/schreiben), alle Frame-Typen (STREAM, ACK, PADDING, CRYPTO, CONNECTION_CLOSE) und variable-length Integer-Codierung (Varint). Einsatzbereiche sind hochperformante verschlüsselte Kommunikation und HTTP/3-Implementierungen. ---- ===== Imports ===== * ''std.net.socket'' * ''std.net.dns'' * ''std.net.types'' ---- ===== Konstanten ===== ^ Name ^ Typ ^ Wert ^ Sichtbarkeit ^ | ''QUIC_PORT'' | ''int64'' | ''443'' | pub | | ''QUIC_VERSION_1'' | ''int64'' | ''$00000001'' | pub | | ''QUIC_PKT_INITIAL'' | ''int64'' | ''0'' | pub | | ''QUIC_PKT_0RTT'' | ''int64'' | ''1'' | pub | | ''QUIC_PKT_HANDSHAKE'' | ''int64'' | ''2'' | pub | | ''QUIC_PKT_RETRY'' | ''int64'' | ''3'' | pub | | ''QUIC_PKT_1RTT'' | ''int64'' | ''4'' | pub | | ''QUIC_FRAME_PADDING'' | ''int64'' | ''$00'' | pub | | ''QUIC_FRAME_PING'' | ''int64'' | ''$01'' | pub | | ''QUIC_FRAME_ACK'' | ''int64'' | ''$02'' | pub | | ''QUIC_FRAME_ACK_ECN'' | ''int64'' | ''$03'' | pub | | ''QUIC_FRAME_RESET_STREAM'' | ''int64'' | ''$04'' | pub | | ''QUIC_FRAME_STOP_SENDING'' | ''int64'' | ''$05'' | pub | | ''QUIC_FRAME_CRYPTO'' | ''int64'' | ''$06'' | pub | | ''QUIC_FRAME_NEW_TOKEN'' | ''int64'' | ''$07'' | pub | | ''QUIC_FRAME_STREAM_BASE'' | ''int64'' | ''$08'' | pub | | ''QUIC_FRAME_MAX_DATA'' | ''int64'' | ''$10'' | pub | | ''QUIC_FRAME_MAX_STREAM_DATA'' | ''int64'' | ''$11'' | pub | | ''QUIC_FRAME_MAX_STREAMS_BIDI'' | ''int64'' | ''$12'' | pub | | ''QUIC_FRAME_MAX_STREAMS_UNI'' | ''int64'' | ''$13'' | pub | | ''QUIC_FRAME_DATA_BLOCKED'' | ''int64'' | ''$14'' | pub | | ''QUIC_FRAME_STREAM_DATA_BLOCKED'' | ''int64'' | ''$15'' | pub | | ''QUIC_FRAME_STREAMS_BLOCKED_BIDI'' | ''int64'' | ''$16'' | pub | | ''QUIC_FRAME_STREAMS_BLOCKED_UNI'' | ''int64'' | ''$17'' | pub | | ''QUIC_FRAME_NEW_CONNECTION_ID'' | ''int64'' | ''$18'' | pub | | ''QUIC_FRAME_RETIRE_CONNECTION_ID'' | ''int64'' | ''$19'' | pub | | ''QUIC_FRAME_PATH_CHALLENGE'' | ''int64'' | ''$1A'' | pub | | ''QUIC_FRAME_PATH_RESPONSE'' | ''int64'' | ''$1B'' | pub | | ''QUIC_FRAME_CONNECTION_CLOSE'' | ''int64'' | ''$1C'' | pub | | ''QUIC_FRAME_CONNECTION_CLOSE_APP'' | ''int64'' | ''$1D'' | pub | | ''QUIC_FRAME_HANDSHAKE_DONE'' | ''int64'' | ''$1E'' | pub | | ''QUIC_ERR_NO_ERROR'' | ''int64'' | ''$00'' | pub | | ''QUIC_ERR_INTERNAL_ERROR'' | ''int64'' | ''$01'' | pub | | ''QUIC_ERR_CONNECTION_REFUSED'' | ''int64'' | ''$02'' | pub | | ''QUIC_ERR_FLOW_CONTROL_ERROR'' | ''int64'' | ''$03'' | pub | | ''QUIC_ERR_STREAM_LIMIT_ERROR'' | ''int64'' | ''$04'' | pub | | ''QUIC_ERR_STREAM_STATE_ERROR'' | ''int64'' | ''$05'' | pub | | ''QUIC_ERR_FINAL_SIZE_ERROR'' | ''int64'' | ''$06'' | pub | | ''QUIC_ERR_FRAME_ENCODING_ERROR'' | ''int64'' | ''$07'' | pub | | ''QUIC_ERR_TRANSPORT_PARAMETER_ERROR'' | ''int64'' | ''$08'' | pub | | ''QUIC_ERR_CONNECTION_ID_LIMIT_ERROR'' | ''int64'' | ''$09'' | pub | | ''QUIC_ERR_PROTOCOL_VIOLATION'' | ''int64'' | ''$0A'' | pub | | ''QUIC_ERR_INVALID_TOKEN'' | ''int64'' | ''$0B'' | pub | | ''QUIC_ERR_APPLICATION_ERROR'' | ''int64'' | ''$0C'' | pub | | ''QUIC_ERR_CRYPTO_BUFFER_EXCEEDED'' | ''int64'' | ''$0D'' | pub | | ''QUIC_ERR_KEY_UPDATE_ERROR'' | ''int64'' | ''$0E'' | pub | | ''QUIC_ERR_AEAD_LIMIT_REACHED'' | ''int64'' | ''$0F'' | pub | | ''QUIC_ERR_NO_VIABLE_PATH'' | ''int64'' | ''$10'' | pub | | ''QUIC_MAX_PACKET_SIZE'' | ''int64'' | ''1452'' | pub | | ''QUIC_MIN_INITIAL_SIZE'' | ''int64'' | ''1200'' | pub | | ''QUIC_CONN_ID_LEN'' | ''int64'' | ''8'' | pub | **Transportparameter fehlen vollständig.** Frühere Fassungen dieser Seite führten hier 17 Konstanten ''QUIC_TP_ORIGINAL_DESTINATION_CONNECTION_ID'' bis ''QUIC_TP_RETRY_SOURCE_CONNECTION_ID'' auf. **Keine davon existiert** — die Unit kennt kein einziges Symbol mit dem Präfix ''QUIC_TP_'': $ lyxc q1.lyx -o /dev/null sema error (line 2): undefined symbol 'QUIC_TP_MAX_IDLE_TIMEOUT' Von den Transportparametern nach RFC 9000 §18 ist allein der Fehlercode ''QUIC_ERR_TRANSPORT_PARAMETER_ERROR'' vorhanden — gemeldet werden kann ein fehlerhafter Parameter also, ausgehandelt wird keiner. Damit fehlen unter anderem Idle-Timeout, Flusskontrollgrenzen und die Stream-Obergrenzen; ''QUICConnect'' handelt nichts davon aus. ---- ===== Typen ===== ==== QUICConn (struct) ==== Der Verbindungszustand. Wird von ''QUICConnect'' gefüllt und an ''QUICOpenStream'' weitergereicht. ^ Feld ^ Typ ^ Bedeutung ^ | ''sock'' | ''UDPSocket'' | der zugrunde liegende UDP-Socket | | ''connected'' | ''int64'' | 1, wenn die Verbindung steht | | ''localConnId'' | ''int64'' | Zeiger auf die eigene Connection-ID (8 Byte) | | ''remoteConnId'' | ''int64'' | Zeiger auf die Connection-ID der Gegenstelle (8 Byte) | | ''nextStreamId'' | ''int64'' | nächste zu vergebende Stream-Nummer | | ''packetNumber'' | ''int64'' | laufende Paketnummer | | ''serverIp'' | ''int64'' | aufgelöste Server-Adresse | | ''serverPort'' | ''int64'' | Server-Port | | ''clientKey'' | ''int64'' | Zeiger auf den 16-Byte-AEAD-Schlüssel | | ''clientIV'' | ''int64'' | Zeiger auf den 12-Byte-IV | | ''clientHP'' | ''int64'' | Zeiger auf den 16-Byte-Header-Protection-Schlüssel | ==== QUICStream (struct) ==== Ein Stream innerhalb der Verbindung. Mehrere Felder sind **Kopien aus ''QUICConn''** — der Stream trägt Socket, Adresse und Schlüssel selbst mit, statt über ''conn'' zuzugreifen. ^ Feld ^ Typ ^ Bedeutung ^ | ''conn'' | ''int64'' | **unbenutzt**, laut Quelltext nur für die ABI beibehalten | | ''streamId'' | ''int64'' | Stream-Nummer | | ''state'' | ''int64'' | 0 = geschlossen, 1 = offen | | ''offset'' | ''int64'' | bisher gesendete Bytes; dient zugleich als Paketzähler | | ''sockFd'' | ''int64'' | Socket-Deskriptor, aus ''conn'' kopiert | | ''serverIp'' | ''int64'' | aus ''conn'' kopiert | | ''serverPort'' | ''int64'' | aus ''conn'' kopiert | | ''keyPtr'' | ''int64'' | Zeiger auf den Schlüssel, aus ''conn'' | | ''ivPtr'' | ''int64'' | Zeiger auf den IV, aus ''conn'' | ==== QUICPacketHeader (struct) ==== Hilfsstruktur zum Zerlegen eines Paketkopfes. ^ Feld ^ Typ ^ Bedeutung ^ | ''headerForm'' | ''int64'' | 1 = Long Header, 0 = Short Header | | ''fixedBit'' | ''int64'' | das nach RFC 9000 stets gesetzte Bit | | ''packetType'' | ''int64'' | ''QUIC_PKT_*'' | | ''typeSpecific'' | ''int64'' | typabhängige Bits des ersten Bytes | | ''version'' | ''int64'' | Versionsfeld, ''QUIC_VERSION_1'' | | ''destConnIdLen'' | ''int64'' | Länge der Ziel-Connection-ID | | ''destConnId'' | ''int64'' | Zeiger auf die Ziel-Connection-ID | | ''srcConnIdLen'' | ''int64'' | Länge der Quell-Connection-ID | | ''srcConnId'' | ''int64'' | Zeiger auf die Quell-Connection-ID | | ''packetNumber'' | ''int64'' | Paketnummer | | ''payloadLen'' | ''int64'' | Länge der Nutzlast | ---- ===== Funktionen ===== ^ Signatur ^ Sichtbarkeit ^ Beschreibung ^ | ''QUICRandomBytes(buf: int64, len: int64)'' | pub | Kryptografisch zufällige Bytes erzeugen | | ''QUICWriteVarint(buf: int64, pos: int64, value: int64): int64'' | pub | Variable-Length-Integer in Puffer schreiben | | ''QUICReadVarint(buf: int64, pos: int64): int64'' | pub | Variable-Length-Integer aus Puffer lesen | | ''QUICVarintSize(buf: int64, pos: int64): int64'' | pub | Byte-Größe eines Varint bestimmen | | ''QUICBuildInitialPacket(destConnId: int64, destLen: int64, srcConnId: int64, srcLen: int64): int64'' | pub | QUIC-Initial-Paket für Handshake aufbauen | | ''QUICBuildStreamFrame(streamId: int64, data: int64, dataLen: int64, fin: int64): int64'' | pub | STREAM-Frame aufbauen | | ''QUICBuildPaddingFrame(len: int64): int64'' | pub | PADDING-Frame aufbauen | | ''QUICBuildAckFrame(largestAcked: int64, ackDelay: int64): int64'' | pub | ACK-Frame aufbauen | | ''QUICBuildConnectionClose(errorCode: int64, reason: pchar): int64'' | pub | CONNECTION_CLOSE-Frame aufbauen; ''reason'' ist ein ''pchar'', kein Zeiger als ''int64'' | | ''QUICConnect(host: int64, port: int64): QUICConn'' | pub | QUIC-Verbindung aufbauen | | ''QUICOpenStream(conn: QUICConn): QUICStream'' | pub | Neuen Stream in Verbindung öffnen | | ''QUICStreamWrite(stream: QUICStream, data: int64, len: int64): int64'' | pub | Daten in Stream schreiben | | ''QUICStreamRead(stream: QUICStream, buf: int64, bufsize: int64): int64'' | pub | Daten aus Stream lesen | | ''QUICCloseStream(stream: QUICStream)'' | pub | Stream schließen | | ''QUICDisconnect(conn: QUICConn)'' | pub | QUIC-Verbindung trennen |