Maison Opération et maintenance Sécurité Voyons comment apprendre les protocoles réseau via le protocole QUIC

Voyons comment apprendre les protocoles réseau via le protocole QUIC

Mar 01, 2022 am 09:57 AM
协议 网络协议

Cet article vous amènera à comprendre le protocole QUIC et à utiliser le protocole QUIC comme exemple pour expliquer comment apprendre les protocoles réseau. J'espère qu'il sera utile à tout le monde !

Voyons comment apprendre les protocoles réseau via le protocole QUIC

Dans un article précédent sur s2n-quic, un lecteur m'a demandé comment apprendre un protocole réseau comme QUIC. Pour la plupart des praticiens d'Internet, bien qu'ils travaillent quotidiennement sur Internet, peu de gens se soucient des détails du protocole réseau sous HTTP. La plupart du temps, il suffit d'avoir une compréhension générale et de savoir comment l'utiliser. Si vous n'avez aucune idée de QUIC, alors l'image suivante peut vous aider à bien comprendre la position de QUIC dans l'écosystème HTTP/3 :

Voyons comment apprendre les protocoles réseau via le protocole QUIC

Donc, si vous voulez juste en savoir plus sur QUIC en détail, comment obtenir commencé?

En tant qu'ancien développeur de protocoles réseau et d'équipements réseau, ma propre expérience est la suivante : commencer par RFC, complété par la capture de paquets Wireshark, pour maîtriser rapidement le protocole cible.

Pour QUIC, la première chose que nous devons lire est la RFC9000. Lire l'accord est très ennuyeux et demande une certaine patience. Si votre anglais n'est pas très bon, vous pouvez utiliser Google Translate pour le traduire en chinois et le parcourir rapidement (lecture approfondie). La première lecture consiste principalement à comprendre les principaux concepts et principaux processus.

Après cela, nous pouvons écrire un programme en utilisant le protocole QUIC, puis capturer les paquets via Wireshark. En étudiant les messages réels et en les comparant avec le contenu du protocole RFC (lecture intensive), nous pouvons acquérir une compréhension plus approfondie de. l'essence du protocole.

Nous allons construire le client et le serveur echo sur la base du code de l'article précédent. Pour faciliter la lecture par tout le monde, j'ai également publié le code. Les étudiants intéressés peuvent cloner mon dépôt et exécuter le code client/serveur.

Code client (voir github : tyrchen/rust-training/live_coding/quic-test/examples/client.rs) :

Voyons comment apprendre les protocoles réseau via le protocole QUIC

Code du serveur (voir github : tyrchen/rust-training/live_coding /quic -test/examples/server.rs) :

Voyons comment apprendre les protocoles réseau via le protocole QUIC

Ces deux morceaux de code construisent le serveur d'écho le plus simple. Nous pouvons utiliser Wireshark pour surveiller les paquets UDP sous l'interface de bouclage locale et capturer les paquets. Il convient de noter que pour le trafic utilisant le protocole TLS comme QUIC, même si les paquets sont capturés, seuls les premiers paquets peuvent être lisibles, et les paquets suivants sont cryptés et ne peuvent pas être lus. Par conséquent, lorsque nous construisons un client/serveur, nous devons trouver un moyen de capturer la clé de session négociée entre le serveur et le client pour que Wireshark puisse la déchiffrer. Généralement, les bibliothèques SSL/TLS proposent cette fonction. Par exemple, pour Rustls, nous pouvons utiliser key_log dans la configuration tls. Si vous regardez attentivement le code du serveur ci-dessus, vous verrez cette phrase :

let config = Builder::new()
    .with_certificate(CERT_PEM, KEY_PEM)?
    .with_key_logging()? # 使能 keylogging
    .build()?;
Copier après la connexion

Après avoir utilisé key_log, lors du démarrage du serveur, il nous suffit de spécifier SSLKEYLOGFILE :

SSLKEYLOGFILE=session.log cargo run --example server
Copier après la connexion

Une fois la capture du paquet terminée, ouvrez les préférences Wireshark, sélectionnez le protocole TLS et insérez le chemin du journal :

Voyons comment apprendre les protocoles réseau via le protocole QUIC

Ce qui suit est une capture complète du paquet de l'interaction entre le client et le serveur. Nous voyons que toutes les "charges utiles protégées" sont affichées normalement :

Voyons comment apprendre les protocoles réseau via le protocole QUIC

.

Étant donné que notre client echo n'effectue que l'action la plus simple (ouvre uniquement un flux bidirectionnel), grâce à cette capture de paquets, nous pouvons nous concentrer sur l'étude du processus d'établissement d'une connexion à l'aide du protocole QUIC.

Le premier paquet envoyé par le client

Regardons le premier message envoyé par le client :

Voyons comment apprendre les protocoles réseau via le protocole QUIC

Ce message contient des informations très riches. Tout d'abord, contrairement à la prise de contact TCP, le premier paquet de QUIC est très volumineux, jusqu'à 1 200 octets (le protocole nécessite une charge utile UDP d'au moins 1 200 octets), y compris l'en-tête QUIC, une trame CRYPTO de 255 octets et 890 octets. trame de PADDING d’octets. Comme vous pouvez le voir sur l'en-tête, le type de ce package QUIC est Initial.

Type de message QUIC

Pour les paquets QUIC, l'en-tête est en texte brut et toutes les charges utiles de trame suivantes sont en texte chiffré (à l'exception des premiers paquets). Nous voyons que ce premier paquet est un message Long Header. Dans la section 17.2 de la RFC9000, le Long Header Packet est défini :

Long Header Packet {
   Header Form (1) = 1,
   Fixed Bit (1) = 1,
   Long Packet Type (2),
   Type-Specific Bits (4),
   Version (32),
   Destination Connection ID Length (8),
   Destination Connection ID (0..160),
   Source Connection ID Length (8),
   Source Connection ID (0..160),
   Type-Specific Payload (..),
 }
Copier après la connexion

Si vous êtes intéressé, vous pouvez lire vous-même le chapitre correspondant de la RFC. Pour les messages à en-tête long, il existe les types suivants :

Voyons comment apprendre les protocoles réseau via le protocole QUIC

既然有 Long Header packet,那么就有 Short Header packet,Short Header packet 目前的版本只有一种:

1-RTT Packet {
   Header Form (1) = 0,
   Fixed Bit (1) = 1,
   Spin Bit (1),
   Reserved Bits (2),
   Key Phase (1),
   Packet Number Length (2),
   Destination Connection ID (0..160),
   Packet Number (8..32),
   Packet Payload (8..),
}
Copier après la connexion

为什么需要 connection id?

在我们捕获的这个报文头中,我们看到有 Source Connection ID(SCID)和 Destination Connection ID(DCID)这个新的概念。你也许会好奇:QUIC 不是基于 UDP/IP 的协议么?底层的协议已经有五元组(src ip / src port / dst ip / dst port / protocol)来描述一个连接(connection),为什么还需要 connection id 这样一个新的概念?

这是为了适应越来越多的移动场景。有了 QUIC 层自己的 connection id,底层网络(UDP/IP)的变化,并不会引发 QUIC 连接的中断,也就是说,你从家里开车出门,即便手机的网络从 WIFI(固网运营商分配给你的 IP)切换到蜂窝网络(移动运营商分配给你的 IP),整个 UDP/IP 网络变化了,但你的 QUIC 应用只会感受到细微的延迟,并不需要重新建立 QUIC 连接。

从这个使用场景来看,QUIC 底层使用无连接的 UDP 是非常必要的。

首包中就包含了 TLS hello?

我们接下来看看 CRYPTO frame:

Voyons comment apprendre les protocoles réseau via le protocole QUIC

可以看到,QUIC 在建立连接的首包就把 TLS Client Hello 囊括在 CRYPTO frame 中。并且使用的 TLS版本是 1.3。在 Client Hello 的 extension 中,QUIC 协议使用了一个 quic_transport_parameters 的 extension,用来协商 QUIC 自己的一些初始值,比如支持多少个 stream,这个连接中可以最多使用多少个 active connection id 等等。

QUIC 支持哪些 frame?

现在我们已经见到了两种 Frame:CRYPTO 和 PADDING。下表中罗列了 QUIC 所有支持的 frame:

Voyons comment apprendre les protocoles réseau via le protocole QUIC

服务器的回包

我们来看 server 的回包:

Voyons comment apprendre les protocoles réseau via le protocole QUIC

这里有一些新东西。首先,一个 UDP 包内部可以包含若干个 QUIC payload,我们看到 server 回复了一个 QUIC Initial 报文和一个 QUIC Handshake 报文。在 Initial 报文中,我们看到了一个 ACK frame,可见 QUIC 虽然构建于 UDP,但在 QUIC 协议内部构建了类似 TCP 的确认机制。

我们之前看到,在 Initial 报文的 CRYPTO frame 中,客户端发送了 TLS Client Hello,同样的,服务器在 Initial 报文的 CRYPTO frame 中发送了 TLS Server Hello。这个我们就略过不看。

在 Handshake 报文中:

Voyons comment apprendre les protocoles réseau via le protocole QUIC

服务器发送了自己的证书,并结束了 TLS handshake。

客户端结束 Handshake

我们再看第三个包,客户端发送给服务器结束 TLS 握手:

Voyons comment apprendre les protocoles réseau via le protocole QUIC

这个包依旧包含两个 QUIC 报文,其中第一个就是一个 ACK frame,来确认收到了服务器的 Server Hello 那个 QUIC 报文;第二个包含一个 ACK frame,确认服务器的 Handshake,随后有一个 CRYPTO frame 结束客户端的 TLS handshake。

TLS 握手结束之后,客户端和服务器就开始应用层的数据交换,此刻,所有数据都是加密的。

客户端发送一个 “hello” 文本

在我们的  echo client/server 代码中,客户端连接到服务器后,就可以等待用户在 stdin 的输入,然后将其发送到服务器。服务器收到客户端数据,原封不动发回,客户端再将其显示到 stdout 上。在这个过程的前后,客户端和服务器间有一些用于连接管理的 QUIC 报文,比如 PING。我们就略过,只看发送应用层数据的报文。下图是客户端发送的包含 “hello” 文本的报文:

Voyons comment apprendre les protocoles réseau via le protocole QUIC

Comme vous pouvez le voir, le message QUIC ici est un paquet Short Header En plus de la trame ACK, il possède également une trame STREAM. Les deux chiffres les plus bas de l'ID de flux de ce flux sont 00, ce qui représente un flux bidirectionnel lancé par le client. Puisque deux bits sont utilisés pour exprimer le type, le flux de QUIC a les types suivants :

Voyons comment apprendre les protocoles réseau via le protocole QUIC

Regardons la longueur (6) et les données (68 65 6c 6c 6f 0a) de la trame STREAM. Si le contenu de Data est exprimé en ASCII, il s'agit exactement de "hello" et sa longueur est de 6 octets.

Le serveur répond avec le texte "bonjour"

Finalement, le serveur répond :

Voyons comment apprendre les protocoles réseau via le protocole QUIC

C'est exactement le même que le message ci-dessus, donc je ne l'expliquerai pas.

Sage Moment

Je crois que l'introduction ci-dessus à QUIC basée sur la capture de paquets Wireshark peut vous donner une compréhension préliminaire du protocole QUIC. Dans le dernier article, nous avons dit que QUIC prend en charge le multiplexage et résout le problème du blocage en tête de file d'attente au niveau de la couche transport. A travers l’introduction de cet article, pouvez-vous répondre aux deux questions suivantes ?

  • Quel type de trame QUIC utilise-t-il pour le multiplexage ?

  • QUIC Comment résoudre le blocage en tête de file d'attente au niveau de la couche transport ?

Recommandations associées : Sécurité du serveur Web

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

À quel protocole appartient la charge rapide Vivo ? À quel protocole appartient la charge rapide Vivo ? Sep 06, 2022 pm 02:43 PM

Il existe deux protocoles principaux pour la charge rapide vivo : 1. Le protocole de charge rapide « QC 2.0 » est la technologie « Quick Charge 2.0 ». Il s'agit de la version 2.0 de la technologie de charge rapide publiée par Qualcomm. 9 V et 12 V, 20 V quatre groupes de tension ; 2. Le protocole de charge rapide PD est une spécification de charge rapide formulée par l'organisation « USB-IF ». Il s'agit de l'un des protocoles de charge rapide courants actuels et peut atteindre la puissance maximale par défaut actuelle. "5V/2A" L'interface "type-c" est augmentée à 100W.

Quelle est la puissance maximale du protocole de charge rapide PD3.0 ? Quelle est la puissance maximale du protocole de charge rapide PD3.0 ? Nov 08, 2022 pm 04:04 PM

Le protocole de charge rapide PD3.0 prend en charge jusqu'à « 100 W ». En novembre 2015, la charge rapide USB PD a inauguré une mise à jour majeure de la version et est entrée dans l'ère de la charge rapide USB PD3.0 ; le protocole PD3.0 prend en charge les sorties 5V3A, 9V3A, 12V3A, 15V3A et 20V5A, et la puissance maximale peut atteindre 100 W. Il peut non seulement être utilisé pour charger des téléphones mobiles, mais également pour alimenter des ordinateurs portables ou des moniteurs.

Quels sont les 5 protocoles de communication industrielle ? Quels sont les 5 protocoles de communication industrielle ? Sep 28, 2022 am 11:52 AM

5 types de protocoles de communication industriels : 1. Protocole Modbus, qui est un langage universel utilisé dans les contrôleurs électroniques ; 2. Protocole RS-232, qui est une norme d'interface physique série 3. Protocole RS-485, basé sur RS232 développé ; sur la base de : 4. Le protocole HART est un protocole de communication utilisé entre les instruments intelligents sur site et les équipements de la salle de contrôle ; 5. Le protocole MPI est un protocole de communication multilingue utilisé pour écrire des ordinateurs parallèles.

Quels sont les protocoles réseau en langage Go ? Quels sont les protocoles réseau en langage Go ? Jun 10, 2023 pm 02:06 PM

Ces dernières années, le langage Go, en tant que langage de programmation simultané efficace, léger et excellent, a attiré l'attention et l'amour de plus en plus de gens. En termes de programmation réseau, le langage Go prend en charge un riche protocole réseau et peut aider les développeurs à créer des applications réseau rapidement et facilement. Jetons un coup d'œil aux protocoles réseau en langage Go. 1.TCPTCP (TransmissionControlProtocol, Transmission Control Protocol) est un protocole de transmission couramment utilisé dans les réseaux informatiques.

Quels sont les protocoles courants pour la programmation réseau Java ? Quels sont les protocoles courants pour la programmation réseau Java ? Apr 15, 2024 am 11:33 AM

Les protocoles couramment utilisés dans la programmation réseau Java incluent : TCP/IP : utilisé pour une transmission de données fiable et une gestion des connexions. HTTP : utilisé pour la transmission de données Web. HTTPS : version sécurisée de HTTP qui utilise le cryptage pour transmettre des données. UDP : Pour un transfert de données rapide mais instable. JDBC : utilisé pour interagir avec des bases de données relationnelles.

Guide du protocole SOAP en PHP Guide du protocole SOAP en PHP May 20, 2023 pm 07:10 PM

Avec le développement continu de la technologie Internet, de plus en plus d'applications au niveau de l'entreprise doivent fournir des interfaces avec d'autres applications pour réaliser l'interaction des données et des activités. Dans ce cas, nous avons besoin d’un protocole fiable pour transmettre les données et garantir leur intégrité et leur sécurité. SOAP (Simple Object Access Protocol) est un protocole basé sur XML qui peut être utilisé pour implémenter la communication entre des applications dans un environnement Web. En tant que langage de programmation Web populaire, PHP

Qu'est-ce que le protocole de charge rapide qc4+ ? Qu'est-ce que le protocole de charge rapide qc4+ ? Aug 18, 2022 pm 03:49 PM

Le protocole de charge rapide QC4+ est une combinaison du protocole USB PD PPS et du protocole de charge rapide QC3.0/2.0. Il s'agit d'une technologie de charge rapide multifonctionnelle et multiprotocole. Le protocole de chargement QC4+ est compatible avec USB PD3.0 (PPS) et est rétrocompatible avec USB PD2.0, QC3.0, QC2.0, BC1.2 et d'autres protocoles. La première condition préalable à la prise en charge de USB PD et QC4+ est la prise en charge des interfaces USB-C aux deux extrémités et le message de négociation de puissance basé sur le CC (canal de configuration) dans l'interface USB-C.

Quels sont les trois éléments des protocoles réseau ? Quels sont les trois éléments des protocoles réseau ? Dec 09, 2020 am 10:23 AM

Les trois éléments du protocole réseau : 1. La sémantique, qui explique la signification de chaque partie des informations de contrôle ; elle stipule quel type d'informations de contrôle doit être envoyée, ainsi que les actions effectuées et quel type de réponses doivent être apportées. . 2. Grammaire, c'est-à-dire la structure et le format des données utilisateur et des informations de contrôle, ainsi que l'ordre dans lequel les données apparaissent. 3. Chronométrage, c'est-à-dire une description détaillée de la séquence des événements.

See all articles