QUIC(Quick UDP Internet Connections)源代码阅读

本文 http://blog.codeg.cn/2015/06/17/quic-source-code-reading/ 是作者zieckey在研究和学习相关内容时所做的笔记,欢迎广大朋友指正和交流! 版权所有,欢迎转载和分享,但请保留此段声明。

基础类

base

  1. Pickle:针对二进制数据进行packunpack操作
  2. MessagePump:消息泵基类,也就是做消息循环用的
  3. TimeDelta:一个int64整型的封装,单位:微妙

net

  1. IOVector : 对 struct iovec 的封装。提供了 struct iovec 相关的读写操作。
  2. IPEndPoint:代表一个 IP:Port
  3. QuicConfig:Quic相关的配置信息类(与加解密不相关)
  4. QuicDataReader:对一段内存数据的读取做了封装,比较方便的读取整数、浮点数、字符串等等。
  5. QuicDataWriter:与QuicDataReader相对,能够比较方便的将整数、浮点数、字符串、IOVector等数据写入到一段内存buffer中。
  6. QuicRandom:随机数产生器。
  7. QuicFramerVisitorInterface:关于收到的数据包的处理的函数接口类。
  8. QuicDispatcher::QuicFramerVisitor:从QuicFramerVisitorInterface继承,用于处理QUIC数据包
  9. QuicData:对 <char*,size_t> 这中内存数据的封装。
  10. QuicEncryptedPacket:继承自QuicData,并没有新的接口,只是更明确的表明这是一个Quic加密的报文。
  11. QuicDispatcher:数据包处理类
    1. 收到一个数据包会调用 QuicDispatcher::ProcessPacket
    2. 进而会调用 QuicFramer::ProcessPacket
  12. QuicTime::Delta:是对 base::TimeDelta 的封装
  13. QuicTime:一个相对的时间点
  14. TimeTicks:滴答时间。
    1. TimeTicks::Now():返回系统启动到当前时间点的
    2. TimeTicks::UnixEpoch():返回Unix时间戳
  15. QuicAlarm:定时器的抽象类。
  16. DeleteSessionsAlarm:删除过期session的定时器。
  17. QuicFramer:用于对QUIC数据包的解析和组装。
  18. QuicPacketPublicHeader:Quic Public包头。包括 CID,CID长度, reset标记,version标记, 序列化长度,version等。
  19. QuicPacketHeader:Quic包头。包括 FEC标记、加密算法标记,加密Hash,序列号,是否是FEC_group,FEC_group等。
  20. UDPSocket:UDP socket协议相关类,ReadFrom/SendTo 等等。ReadFrom的最后一个回调函数是会在读取到数据的时候调用。具体调用点为:UDPSocketLibevent::ReadWatcher::OnFileCanReadWithoutBlocking。具体平台的实现类有两个:UDPSocketLibevent/UDPSocketWin
  21. UDPServerSocket:从DatagramServerSocket这个接口类继承,并对UDPSocket进行了封装
  22. QuicSimplePerConnectionPacketWriter:与每个连接相关的数据包writer。很多连接可能共享一个QuicServerPacketWriter,因此当需要向某个连接发送数据时,无法区分该连接。这个类实际上就是QuicServerPacketWriterQuicConnection的一个组合包装。
  23. QuicSimpleServerPacketWriter:用来发送数据的。

相关源文件

  1. quic_flags.h : 整个项目相关的全局配置信息,是全局变量。

源码阅读

QuicPacketPublicHeader

struct QuicPacketPublicHeader {
  // Universal header. All QuicPacket headers will have a connection_id and
  // public flags.
  QuicConnectionId connection_id;
  QuicConnectionIdLength connection_id_length;
  bool reset_flag;
  bool version_flag;
  QuicSequenceNumberLength sequence_number_length;
  QuicVersionVector versions;
};

QuicPacketHeader

struct QuicPacketHeader {
  QuicPacketPublicHeader public_header;
  bool fec_flag;
  bool entropy_flag;
  QuicPacketEntropyHash entropy_hash;
  QuicPacketSequenceNumber packet_sequence_number;
  InFecGroup is_in_fec_group;
  QuicFecGroupNumber fec_group;
};

void QuicDispatcher::OnUnauthenticatedHeader(const QuicPacketHeader& header)