【quic协议】quic介绍及部分ns3-quic源码解析

本文参考书籍

主要是参考这本书籍;
在这里插入图片描述
QUIC源码参考:github ns3-quic源码
注:该源码直接使用会有各种报错,例如0RTT建连失败等等;目前本人针对该源码进行了一定修改;但未完善;

注:本文主要参考来源如上,博主只是阶段quic学习使用者,如有不对请指正;

ns3-Quic主要文件介绍

  • quic-header.h文件有详细的包头的字段以及函数
  • quic-subheader封装 QUIC 协议帧的头部结构,提供帧的创建、序列化与反序列化功能
    • 控制帧:ACKRST_STREAMCONNECTION_CLOSE(连接管理)。
    • 流量控制帧:MAX_DATAMAX_STREAM_DATA(窗口更新)。
    • 数据帧:STREAM(数据传输,支持分片与FIN标志)。
    • 路径验证:PATH_CHALLENGEPATH_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(双向)。
      通过 SetStreamDirectionTypeGetStreamDirectionType 动态管理流方向。
    • 流状态机(QuicStreamStates_t
      + 发送端状态链:OPENSENDDATA_SENTDATA_RECVD
      + 接收端状态链:RECVSIZE_KNOWNDATA_READ
      状态转换通过条件判断(如 SetStreamStateSendIf)触发,确保协议逻辑的正确性。
    • 流标识管理
      SetStreamIdGetStreamId 用于设置和获取流的唯一 ID,QUIC 流 ID 的 LSB 决定了流类型 3。
    • 缓冲区控制
      GetStreamTxAvailable 提供发送缓冲区剩余空间的查询,支持流量控制。
    • 节点与连接绑定
      SetNodeSetConnectionId 将流与 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)协议的包头大小取决于使用的包头类型(长包头或短包头)以及具体字段的配置。

长首部报文格式

QUICv1长首部报文格式

初始报文

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

初始报文格式

客户端发送的包含初始报文的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报文只能由客户端发出
.握手报文
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值