searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

获取不同版本quic协议包的dcid的方法

2024-11-28 09:53:29
10
0
  • 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存在协商的过程
      • image.png
    • iqiuc不同版本头部结构也存在差异
      • draft-ietf-27,draft-ietf-29,rfc9000
        • image.png
        • image.png
      • 在draft-ietf的小于等于21版本的long类型的格式和22后的有不一样, 21前和Q046的格式一样
        • image.png
  • 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)
  • 通过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条评论
0 / 1000
lll
4文章数
0粉丝数
lll
4 文章 | 0 粉丝
原创

获取不同版本quic协议包的dcid的方法

2024-11-28 09:53:29
10
0
  • 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存在协商的过程
      • image.png
    • iqiuc不同版本头部结构也存在差异
      • draft-ietf-27,draft-ietf-29,rfc9000
        • image.png
        • image.png
      • 在draft-ietf的小于等于21版本的long类型的格式和22后的有不一样, 21前和Q046的格式一样
        • image.png
  • 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)
  • 通过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]
          }
        }
        
文章来自个人专栏
oio
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0