注意

本文档适用于 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 个数据字节,然后是一个 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::liststd::vectorstd::dequestd::setstd::unordered_set

Blob(二进制大对象)

Blob 仅仅是一个字节列表。

struct ceph_string {
        ceph_list<u8>;
}

// AKA

struct ceph_string {
        u32le size;
        u8    data[size];
}

Blob 用于编码 std::stringconst 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::mapstd::multimapstd::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 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入