注意
本文档适用于 Ceph 的开发版本。
网络编码
本文档描述了用于序列化数据的编码。它不涉及特定的对象/消息,而是侧重于基本类型。
这些类型本身没有任何自描述性。除非您知道它们的类型,否则无法对其进行解码。
约定
整数
使用的整数类型将命名为 {signed}{size}{endian}。例如,u16le 是一个无符号的 16 位整数,以小端字节顺序编码,而 s64be 是一个有符号的 64 位整数,以大端字节顺序编码。此外,u8 和 s8 分别表示有符号和无符号字节。有符号整数使用二进制补码编码。
复杂类型
本文档将使用类似于 C 语言的语法来描述结构体。结构体表示将通过网络传输的数据。元素之间没有填充,元素将按照它们出现的顺序发送。例如
struct foo {
u8 tag;
u32le data;
}
当编码值 0x05 和 0x12345678 时,它们在网络上将分别显示为 05 78 56 34 12。
可变数组
与 C 语言不同,长度数组可以在结构体中的任何位置使用,并且在协议中是内联的。此外,长度可以使用结构体中较早的项来描述。
struct blob {
u32le size;
u8 data[size];
u32le checksum;
}
此结构体被编码为一个 32 位的大小,后跟 size 个数据字节,然后是一个 32 位校验和。
基本类型别名
这些类型只是基本类型的别名。
// From /src/include/types.h
typedef u32le epoch_t;
typedef u32le ceph_seq_t;
typedef u64le ceph_tid_t;
typedef u64le version_t;
结构体
这些是结构体的编码方式。请注意,这些结构体并不实际存在于源代码中,而是不同类型的编码方式。
Optional(可选)
可选类型表示为一个存在字节,如果该项存在,则后跟该项。
struct ceph_optional<T> {
u8 present;
T element[present? 1 : 0]; // Only if present is non-zero.
}
可选类型用于编码 boost::optional,以及自 Ceph 引入 C++17 以来,用于编码 std::optional。
Pair(对)
对仅仅是第一个项后跟第二个项。
struct ceph_pair<A,B> {
A a;
B b;
}
对用于编码 std::pair。
Triple(三元组)
三元组仅仅是三个元素一个接一个。
struct ceph_triple<A,B,C> {
A a;
B b;
C c;
}
三元组用于编码 ceph::triple。
List(列表)
列表表示为一个元素计数,后跟该数量的元素。
struct ceph_list<T> {
u32le length;
T elements[length];
}
注意
列表中元素的大小不一定统一。
列表用于编码 std::list、std::vector、std::deque、std::set 和 std::unordered_set。
Blob(二进制大对象)
Blob 仅仅是一个字节列表。
struct ceph_string {
ceph_list<u8>;
}
// AKA
struct ceph_string {
u32le size;
u8 data[size];
}
Blob 用于编码 std::string、const char * 和 bufferlist。
注意
Blob 的内容是任意的二进制数据。
Map(映射)
映射是一个对的列表。
struct ceph_map<K,V> {
ceph_list<ceph_pair<K,V>>;
}
// AKA
struct ceph_map<K,V> {
u32le length;
ceph_pair<K,V> entries[length];
}
映射用于编码 std::map、std::multimap、std::unordered_map 和 std::unordered_multimap。
复杂类型
这些类型在源代码中并不难找到,但为了方便起见,这里列出了一些常见的类型。
utime_t
// From /src/include/utime.h
struct utime_t {
u32le tv_sec; // Seconds since epoch.
u32le tv_nsec; // Nanoseconds since the last second.
}
ceph_entity_name
// From /src/include/msgr.h
struct ceph_entity_name {
u8 type; // CEPH_ENTITY_TYPE_*
u64le num;
}
// CEPH_ENTITY_TYPE_* defined in /src/include/msgr.h