注意
本文档适用于 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
数据字节,
基本类型别名
这些类型只是基本类型的别名。
// From /src/include/types.h
typedef u32le epoch_t;
typedef u32le ceph_seq_t;
typedef u64le ceph_tid_t;
typedef u64le version_t;
结构体
这些是结构体编码的方式。请注意,这些结构体实际上不存在于源代码中,但它们是不同类型编码的方式。
可选
可选值表示为一个存在字节,如果存在,则后跟该项目。
struct ceph_optional<T> {
u8 present;
T element[present? 1 : 0]; // Only if present is non-zero.
}
可选值用于编码boost::optional
以及,自从Ceph引入C++17以来,std::optional
.
对
对是第一个项目后跟第二个项目。
struct ceph_pair<A,B> {
A a;
B b;
}
对用于编码std::pair
.
三元组
三元组只是三个元素依次排列。
struct ceph_triple<A,B,C> {
A a;
B b;
C c;
}
三元组用于编码ceph::triple
.
列表
列表表示为元素计数,后跟那么多元素。
struct ceph_list<T> {
u32le length;
T elements[length];
}
Note
列表中的元素大小不一定相同。
列表用于编码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
.
Note
Blob的内容是任意的二进制数据。
Map
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];
}
Map用于编码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
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.