Note
This MongoDB Wire Protocol Specification is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 United States License. You may not use or adapt this material for any commercial purpose, such as to create a commercial database or database-as-a-service offering.本MongoDB有线协议规范根据知识共享署名-非商业性相同方式共享3.0美国许可证获得许可。您不得将此材料用于任何商业目的,例如创建商业数据库或数据库即服务产品。
Introduction介绍
The MongoDB Wire Protocol is a simple socket-based, request-response style protocol. Clients communicate with the database server through a regular TCP/IP socket.MongoDB Wire协议是一种简单的基于套接字的请求-响应式协议。客户端通过常规TCP/IP套接字与数据库服务器通信。
TCP/IP SocketTCP/IP套接字
Clients should connect to the database with a regular TCP/IP socket.客户端应使用常规TCP/IP套接字连接到数据库。
Port
The default port number for mongod and mongos instances is 27017. The port number for mongod and mongos is configurable and may vary.
Byte Ordering字节序
All integers in the MongoDB wire protocol use little-endian byte order: that is, least-significant byte first.
Messages Types and Formats
MongoDB uses the OP_MSG opcode for both client requests and database replies. There are several message formats used in older versions of MongoDB which have been deprecated in favor of OP_MSG.
Note
This page uses a C-like struct to describe the message structure.
The types used in this document, such as int32 and cstring, are the same as those defined in the BSON specification.
Standard Message Header标准消息头
In general, each message consists of a standard message header followed by request-specific data. The standard message header is structured as follows:
struct MsgHeader {
int32 messageLength; // total message size, including this
int32 requestID; // identifier for this message
int32 responseTo; // requestID from the original request
// (used in responses from the database)
int32 opCode; // message type
}
messageLength | |
requestID | |
responseTo | requestID taken from the messages from the client.requestID。 |
opCode |
Opcodes操作码
MongoDB uses these MongoDB使用这些opCode values:opCode值:
OP_COMPRESSED | 2012 | |
OP_MSG | 2013 | |
OP_REPLY
Deprecated in MongoDB 5.0. Removed in MongoDB 5.1. | 1 | Reply to a client request. responseTo is set. |
OP_UPDATE
Deprecated in MongoDB 5.0. Removed in MongoDB 5.1. | 2001 | |
OP_INSERT
Deprecated in MongoDB 5.0. Removed in MongoDB 5.1. | 2002 | |
RESERVED | 2003 | Formerly used for OP_GET_BY_OID. |
OP_QUERY
Deprecated in MongoDB 5.0. Removed in MongoDB 5.1. | 2004 | |
OP_GET_MORE
Deprecated in MongoDB 5.0. Removed in MongoDB 5.1. | 2005 | |
OP_DELETE
Deprecated in MongoDB 5.0. Removed in MongoDB 5.1. | 2006 | |
OP_KILL_CURSORS
Deprecated in MongoDB 5.0. Removed in MongoDB 5.1. | 2007 |
OP_COMPRESSED
Any opcode can be compressed and wrapped in an OP_COMPRESSED header. The OP_COMPRESSED message contains the original compressed opcode message alongside the metadata necessary to process and decompress it.
The format of the OP_COMPRESSED message is:
struct {
MsgHeader header; // standard message header
int32 originalOpcode; // value of wrapped opcode
int32 uncompressedSize; // size of deflated compressedMessage, excluding MsgHeader
uint8 compressorId; // ID of compressor that compressed message
char *compressedMessage; // opcode itself, excluding MsgHeader
}
MsgHeader | Message header, as described in Standard Message Header. |
originalOpcode | |
uncompressedSize | The size of the deflated compressedMessage, which excludes the MsgHeader. |
compressorId | The ID of the compressor that compressed the message. A list of compressorId values is provided below. |
compressedMessage | The opcode itself, excluding the MsgHeader. |
Each compressor is assigned a predefined compressor ID as follows:每个压缩机都分配了一个预定义的压缩机ID,如下所示:
| compressorId | Handshake Value | |
|---|---|---|
0 | noop | |
1 | snappy | |
2 | zlib | |
3 | zstd | |
4-255 | reserved |
OP_MSG
OP_MSG is an extensible message format used to encode both client requests and server replies on the wire.是一种可扩展的消息格式,用于在网络上对客户端请求和服务器回复进行编码。
OP_MSG has the following format:具有以下格式:
OP_MSG {
MsgHeader header; // standard message header
uint32 flagBits; // message flags
Sections[] sections; // data sections
optional<uint32> checksum; // optional CRC-32C checksum
}
header | Standard message header, as described in Standard Message Header. |
flagBits | An integer bitmask containing message flags, as described in Flag Bits. |
sections | Message body sections, as described in Sections. |
checksum | An optional CRC-32C checksum, as described in Checksum. |
Flag Bits标志位
The flagBits integer is a bitmask encoding flags that modify the format and behavior of OP_MSG.
The first 16 bits (0-15) are required and parsers MUST error if an unknown bit is set.
The last 16 bits (16-31) are optional, and parsers MUST ignore any unknown set bits. Proxies and other message forwarders MUST clear any unknown optional bits before forwarding messages.
| Bit | Request | Response | ||
|---|---|---|---|---|
| 0 | checksumPresent | ✓ | ✓ | The message ends with 4 bytes containing a CRC-32C [2] checksum. See Checksum for details. |
| 1 | moreToCome | ✓ | ✓ | Another message will follow this one without further action from the receiver. The receiver MUST NOT send another message until receiving one with moreToCome set to 0 as sends may block, causing deadlock. Requests with the moreToCome bit set will not receive a reply. Replies will only have this set in response to requests with the exhaustAllowed bit set. |
| 16 | exhaustAllowed | ✓ | The client is prepared for multiple replies to this request using the
|
Sections章节
An OP_MSG message contains one or more sections. Each section starts with a kind byte indicating its type. Everything after the kind byte constitutes the section's payload.OP_MSG消息包含一个或多个部分。每个部分都以一个表示其类型的类型字节开头。类型字节之后的所有内容都构成了该部分的有效载荷。
The available kinds of sections follow.可用的章节类型如下。
Kind 0: Body
A body section is encoded as a single BSON object. The size in the BSON object also serves as the size of the section. This section kind is the standard command request and reply body.
All top-level fields MUST have a unique name.
Kind 1: Document Sequence
| int32 | |
| C String |
|
|
Kind 2
This section is used for internal purposes.本节用于内部目的。
Checksum
Each message MAY end with a CRC-32C [2] checksum that covers all bytes in the message except for the checksum itself.
If you do not use TLS/SSL connections, mongod instances and mongos instances exchange messages with checksums.
If you use TLS/SSL connections, mongod instances and mongos instances skip the checksum.
Drivers and older binaries will ignore the checksum if presented with messages with checksum.如果显示带有校验和的消息,驱动程序和较旧的二进制文件将忽略校验和。
The presence of a checksum is indicated by the 校验和的存在由checksumPresent flag bit.checksumPresent标志位指示。
Legacy Opcodes传统操作码
Starting in MongoDB 5.1, these opcodes are removed in favor of OP_MSG:从MongoDB 5.1开始,这些操作码被删除,取而代之的是OP_MSG:
OP_DELETEOP_GET_MOREOP_INSERTOP_KILL_CURSORSOP_QUERY[1]OP_REPLYOP_UPDATE
If you are running an older version of MongoDB and need detailed information on the previous opcodes, see Legacy Opcodes.如果您运行的是旧版本的MongoDB,并且需要有关以前操作码的详细信息,请参阅传统操作码。
Footnotes
| [1] | MongoDB 5.1 removes support for both OP_QUERY find operations and OP_QUERY commands. As an exception, OP_QUERY is still supported for running the hello and isMaster commands as part of the connection handshake. |
| [2] | (1, 2) 32-bit CRC computed with the Castagnoli polynomial as described by https://tools.ietf.org/html/rfc4960#page-140. |