例如,查看定义 ALPN 的 RFC 7301:
enum {
application_layer_protocol_negotiation(16), (65535)
} ExtensionType;
(16)
是要使用的枚举值,但我应该如何阅读 (65535)
部分?
来自同一个文档:
opaque ProtocolName<1..2^8-1>;
struct {
ProtocolName protocol_name_list<2..2^16-1>
} ProtocolNameList;
...我应该如何阅读 <1..2^8-1>
和 <2..2^16-1>
部分?
答案 0 :(得分:0)
符号在 https://tools.ietf.org/html/rfc8446 中描述。
对于“枚举”(枚举),请参阅 https://tools.ietf.org/html/rfc8446#section-3.5,它表示括号中的值是该枚举成员的值,并且该枚举占用的八位字节与最高记录值所需的一样多。< /p>
因此,如果您想留出一些空间,则需要一个具有足够高值的未命名枚举成员。
<块引用>可以选择指定一个没有关联标签的值来强制定义宽度而不定义多余的元素。
<块引用>在以下示例中,Taste 将消耗数据流中的两个字节,但只能假定值 1、2 或 4。
enum { sweet(1), sour(2), bitter(4), (32000) } Taste;
对于向量,请参阅 https://tools.ietf.org/html/rfc8446#section-3.4。这说:
<块引用>可变长度向量是通过使用符号
所以符号 <1..2^8-1>
意味着 ProtocolName
必须至少是一个八位字节,长度最多为 255 个八位字节。
同样的,<2..2^16-1>
表示 protocol_name_list
必须至少有 2 个八位字节(非条目),最多可以有 65535 个八位字节(非条目)。
在这种特殊情况下,最少 2 个八位字节是因为它必须包含至少一个条目,该条目本身至少有 2 个八位字节长(u8 长度前缀,值中至少有一个八位字节)。
为了明确八位字节/条目的区别,在该部分的后面,它说:
uint16 longer<0..800>;
/* zero to 400 16-bit unsigned integers */