注意

本文档适用于 Ceph 开发版本。

网络编码

这描述了用于序列化数据的编码方式。它不涵盖特定的对象/消息,而是专注于基本类型。

这些类型没有任何自描述性。除非你知道它们是什么,否则无法解码。

约定

整数

使用的整数类型将被命名{signed}{size}{endian}。例如u16le是一个无符号16位整数,以小端字节序编码s64be是一个有符号64位整数,以大端编码。此外u8s8将分别表示有符号和无符号字节。有符号整数使用二进制补码编码。

复杂类型

本文档将使用类似C的语法来描述结构体。结构体表示将要通过线路传输的数据。元素之间没有填充,并且元素将按照它们出现的顺序发送。例如:

struct foo {
        u8    tag;
        u32le data;
}

当编码这些值0x050x12345678时,将分别出现在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::setstd::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_mapstd::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. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.