本文参考书籍
主要是参考这本书籍;

QUIC源码参考:github ns3-quic源码
注:该源码直接使用会有各种报错,例如0RTT建连失败等等;目前本人针对该源码进行了一定修改;但未完善;
注:本文主要参考来源如上,博主只是阶段quic学习使用者,如有不对请指正;
ns3-Quic主要文件介绍
- quic-header.h文件有详细的包头的字段以及函数
- quic-subheader封装 QUIC 协议帧的头部结构,提供帧的创建、序列化与反序列化功能
- 控制帧:
ACK、RST_STREAM、CONNECTION_CLOSE(连接管理)。 - 流量控制帧:
MAX_DATA、MAX_STREAM_DATA(窗口更新)。 - 数据帧:
STREAM(数据传输,支持分片与FIN标志)。 - 路径验证:
PATH_CHALLENGE、PATH_RESPONSE(NAT 穿透)。
- 控制帧:
- QuicTransportParameters 连接握手阶段交换的核心参数集合,用于协商连接特性(如流量控制、空闲超时等)
- 流量控制参数 连接行为参数:
- quic-l4-protocol.h
- QuicUdpBinding类实现了quic套接字与udp套接字的绑定
- QuicL4Protocol类(数据的收发和路由,连接的安全性,管理 QUIC 和 UDP 的交互)
- 创建Quic套接字CreateSocket(由 QuicSocketFactory 调用)
- Udp套接字和Quic套接字绑定
- 处理节点 QUIC 套接字之间的数据多路复用/分解
- 分解:从 UDP 接收数据包,将数据包转发到正确的套接字
- 复多路复用(Multiplexing)通过 SendPacket 函数完成:将数据包向下发送到协议栈

- 管理对等节点之间的连接认证:通过检查从 UDP 层接收的数据包来实现认证,检查向下传递到协议栈的数据包
- bool m_0RTTHandshakeStart 标志是否开启0RTT握手
- quic-l5-protocol
- CreateStream 方法处理QUIC流
- QUIC套接字绑定到相应的流上。
- 解复用(Demultiplexing):从QUIC套接字接收数据包,并将其转发给关联的流。
- 多路复用(Multiplexing):数据包通过此方法被分发到不同的流上,实现了多路复用技术

- 接受处理(接收来自 QUIC 套接字的数据包,将其拆解为多个 帧(Frames)。根据帧的类型和用途,决定由套接字处理还是转交给对应的流(Stream))

- quic-congestion-ops quic拥塞控制算法基类public TcpNewReno
- 用到QuicSocketState:public TcpSocketState(为实现quic的特有功能)
- quic-bbr :public QuicCongestionOps
- 实现基于quic的bbr拥塞算法
- quic-stream
- 流类型(
QuicStreamTypes_t
+CLIENT_INITIATED_BIDIRECTIONAL:客户端发起的双向流(如 HTTP/3 请求-响应)。
+SERVER_INITIATED_BIDIRECTIONAL:服务端发起的双向流。
+CLIENT/SERVER_INITIATED_UNIDIRECTIONAL:单向流(如服务端推送) - 流方向(
QuicStreamDirectionTypes_t
+SENDER(发送端)、RECEIVER(接收端)、BIDIRECTIONAL(双向)。
通过SetStreamDirectionType和GetStreamDirectionType动态管理流方向。 - 流状态机(
QuicStreamStates_t)
+ 发送端状态链:OPEN→SEND→DATA_SENT→DATA_RECVD。
+ 接收端状态链:RECV→SIZE_KNOWN→DATA_READ。
状态转换通过条件判断(如SetStreamStateSendIf)触发,确保协议逻辑的正确性。 - 流标识管理
SetStreamId和GetStreamId用于设置和获取流的唯一 ID,QUIC 流 ID 的 LSB 决定了流类型 3。 - 缓冲区控制
GetStreamTxAvailable提供发送缓冲区剩余空间的查询,支持流量控制。 - 节点与连接绑定
SetNode和SetConnectionId将流与 ns-3 节点及 QUIC 连接绑定,实现多路复用。
- 流类型(
-
Quic报文
分层

- 连接(Connection)是最基本的QUIC实例,一个连接代表客户端和服务器之间的单次会话。
- 流(Stream)是QUIC提供给应用层的有序字节流抽象,在QUIC协议内部以流标识(Stream ID)区分,在QUIC报文中封装为STREAM帧。

- QUIC协议将应用的数据封装在STREAM帧中,和QUIC协议自身的其他QUIC语义的帧封装成QUIC报文一起发送
报文格式
QUIC 报头长度是一个动态值,取决于报头的类型和字段内容;
- 一类是长首部报文,用于建立QUIC连接和建立连接前发送应用数据;
- 一类是短首部报文,用于在QUIC连接建立后发送应用数据和QUIC协议内容



长首部格式

长包头用于连接建立的初始阶段(如Initial、Handshake、0-RTT、Retry包);通常为 16-32 字节;长首部报文用于QUIC连接建立,直到1-RTT密钥协商成功才可以开始使用短首部报文;
QUIC(Quick UDP Internet Connections)协议的包头大小取决于使用的包头类型(长包头或短包头)以及具体字段的配置。


初始报文
客户端使用初始报文来发起连接,服务器使用初始报文和握手报文回应客户端的连接请求:

客户端发送的包含初始报文的UDP数据报必须填充至1200字节,这可以跟0-RTT报文或其他报文合并,也可以使用PADDING帧填充。同样,服务器发送的包含引发确认的初始报文的数据报也必须填充至1200字节。这样可以确保两个方向都满足QUIC的最小PMTU要求
0-RTT报文

- 0-RTT报文只能包含STREAM帧,不能包含ACK帧,服务器使用1-RTT报文中的ACK帧确认客户端的0-RTT报文,所以两者使用同一个报文编号空间。根据TLS 1.3和QUIC的规定,0-RTT报文只能由客户端发出

最低0.47元/天 解锁文章
4529

被折叠的 条评论
为什么被折叠?



