- iquic有两种类型的quic头
- long
- |flag(8)|version(32)|dcid-len(8)|dcid(0-160)|scid-len(8)|scid(0-160)|payload
- short
- |flag(8)|dcid(0-160)|pkt-num(8-32)|payload
- iquic的cid存在协商的过程
- iqiuc不同版本头部结构也存在差异
- draft-ietf-27,draft-ietf-29,rfc9000
- 在draft-ietf的小于等于21版本的long类型的格式和22后的有不一样, 21前和Q046的格式一样
- draft-ietf-27,draft-ietf-29,rfc9000
- long
- gquic头部
- version < Q046 - 是固定8字节长度的cid
- |flag(8)|cid(64)|payload
- version == Q046 - Q046也和iquic一样有long/short两种头部, 这个个long头部和draft-21兼容, 但是dcid长度是固定8, scid长度固定0, 所有DCIL(4)|SCIL(4)字段是固定的0x50, dcid长度为DCIL+3
- |flag(8)|version(32)|dcil(4)|scil(4)|dcid(0/64)|scid(0/64)|packet nu|payload
- version > Q046
- Q046以后的版本Q050..就和iqiuc draft-22后的头部兼容了
- 所以gquic的cid解析需要分三种情况:小于Q046(Q043),Q046,大于Q046(Q050,T050, T051)
- version < Q046 - 是固定8字节长度的cid
- 通过udp数据第一个字节flags区分gquic和iqiuc
- flags=packet[0]: bit0(0x80),bit1(0x40),bit2(0x20),bit3(0x10),bit4(0x08),bit5(0x04),bit6(0x02),bit7(0x01)
- Q043: bit0必须是0(reserve), bit1必须是0,bit4必须是1(表示有cid), bit7为1表示用于协商version
- Q046:
- long:bit0和bit1必须是1, bit4是reserve;bit7是packet num len的一部分, flag后面一个字节必须是0x50或者0x05
- short:bit0必须是0, bit1必须是1;bit3是reserve
- iqiuc
- long:bit0和bit1必须是1, bit4是reserve;bit7是packet num len的一部分
- short:bit0必须是0, bit1必须是1;bit4是reserve
- 取dcid
-
if (bit1 == 0) { //Q043 if (bit4 != 1) { abort() } else { dcid = packet[1:9] } } else { //Q046 or Q50.. or iquic>=22 if (bit0 == 1) { //long dcid_len = packet[5] if (dcid_len==0x50) {//Q046 dcid = packet[6:14] } else { //iquic or Q50.. dcid = packet[6:6+dcid_len] } } else { //short dcid = packet[1:9] } }
-
0条评论