QUIC(Quick UDP Internet Connections)源代码阅读
Wed, Jun 17, 2015
类
基础类
base
Pickle:针对二进制数据进行pack
和unpack
操作
MessagePump:消息泵基类,也就是做消息循环用的
TimeDelta:一个int64
整型的封装,单位:微妙
net
IOVector : 对 struct iovec
的封装。提供了 struct iovec
相关的读写操作。
IPEndPoint:代表一个 IP:Port
对
QuicConfig:Quic相关的配置信息类(与加解密不相关)
QuicDataReader:对一段内存数据的读取做了封装,比较方便的读取整数、浮点数、字符串等等。
QuicDataWriter:与QuicDataReader
相对,能够比较方便的将整数、浮点数、字符串、IOVector等数据写入到一段内存buffer
中。
QuicRandom:随机数产生器。
QuicFramerVisitorInterface:关于收到的数据包的处理的函数接口类。
QuicDispatcher::QuicFramerVisitor:从QuicFramerVisitorInterface
继承,用于处理QUIC数据包
QuicData:对 <char*,size_t>
这中内存数据的封装。
QuicEncryptedPacket:继承自QuicData
,并没有新的接口,只是更明确的表明这是一个Quic加密的报文。
QuicDispatcher:数据包处理类
收到一个数据包会调用 QuicDispatcher::ProcessPacket
进而会调用 QuicFramer::ProcessPacket
QuicTime::Delta:是对 base::TimeDelta
的封装
QuicTime:一个相对的时间点
TimeTicks:滴答时间。
TimeTicks::Now():返回系统启动到当前时间点的
TimeTicks::UnixEpoch():返回Unix时间戳
QuicAlarm:定时器的抽象类。
DeleteSessionsAlarm:删除过期session的定时器。
QuicFramer:用于对QUIC数据包的解析和组装。
QuicPacketPublicHeader:Quic Public包头。包括 CID,CID长度, reset标记,version标记, 序列化长度,version等。
QuicPacketHeader:Quic包头。包括 FEC标记、加密算法标记,加密Hash,序列号,是否是FEC_group,FEC_group等。
UDPSocket:UDP socket协议相关类,ReadFrom/SendTo 等等。ReadFrom
的最后一个回调函数是会在读取到数据的时候调用。具体调用点为:UDPSocketLibevent::ReadWatcher::OnFileCanReadWithoutBlocking
。具体平台的实现类有两个:UDPSocketLibevent/UDPSocketWin
UDPServerSocket:从DatagramServerSocket
这个接口类继承,并对UDPSocket
进行了封装
QuicSimplePerConnectionPacketWriter:与每个连接相关的数据包writer。很多连接可能共享一个QuicServerPacketWriter
,因此当需要向某个连接发送数据时,无法区分该连接。这个类实际上就是QuicServerPacketWriter
和QuicConnection
的一个组合包装。
QuicSimpleServerPacketWriter:用来发送数据的。
相关源文件
quic_flags.h : 整个项目相关的全局配置信息,是全局变量。
源码阅读
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 ;
};
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 ;
};