MongoDB的网络协议

关于TCP

TCP具有良好的拥塞控制,可靠传输等特性,比较适合数据库产品的通讯协议。一些对数据一致性,可靠性要求不高的产品也有采用UDP协议实现。如Redis,Memcached都支持UDP访问,但从实际的生产上来说,TCP来的更可靠,UDP的“不可靠”性质,反而会带来更多的运维负担,增加了排查问题的复杂性。

关于BSON

BSON作为JSON的一种扩展,支持了Binary的数据类型,日期数据等。相比较于Protocol Buffers而言,数据是Humman Readable。MongoDB经常提及的Documents,实际上就是BSON格式数据。同样的,支持嵌套的机制,BSON可以很好的映射成Object,这相对于表结构,在灵活性上提高了一大截。数据不在是扁平的,可以是树形的组织结构,比如:

{
    "_id" : 1,
    "name" : { "first" : "John", "last" : "Backus" },
    "contribs" : [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ],
    "awards" : [
               {
                 "award" : "W.W. McDowell Award",
                 "year" : 1967,
                 "by" : "IEEE Computer Society"
               },
               { "award" : "Draper Prize",
                 "year" : 1993,
                 "by" : "National Academy of Engineering"
               }
    ]
}

当然BSON也有非常讨厌的一些地方,比如编码后的数据过大,引入了过的括号,符号等。

Wire Protocol

TCP是一种Stream的通讯方式,每次请求之间没有间隔,数据源源不断的发来,那如何才能识别出一个完整的请求块?一般的解决方法是加上一个Header,Header的长度固定,用来描述余下的信息量,包括携带的信息长度。额外说明:MongoDB的网络协议都是little-endian。

参考util/net/message.h的代码:

struct Layout {
    int32_t messageLength; // total message size, including this
    int32_t requestID;     // identifier for this message
    int32_t responseTo;    // requestID from the original request
                               //   (used in responses from db)
    int32_t opCode;
};

messageLength表示整个协议的长度,因为是头部,所以Client每次发送命令时都要先将数据写到Buffer里,得到完整的长度后才能通过TCP发送整个请求。MongoDB规定,messageLength不能大于48MB(1000计算),过大的请求包一般意味着过于复杂的请求类型,或者过大的Document,这与NoSQL的设计原则也是违背的。

requestID/responseTo每个请求都有一个ID标识,同一时刻不应该出现相同的requestID,Driver和Server通过这个字段来确认是否是同一个请求的上下文

opCode操作代码,支持的类型:request-opcodes

相关的解析代码在MessagingPort::recv(Message& m)函数内,首先读取固定长度的Header(Layout),读取到Header后,根据messageLength数值做个预判是否是其他的协议类型,预判全部通过后等待读取余下的协议(messageLength-4),如果SocketBuffer中数据不足,就会阻塞在这里,等待数据包完整到达。

从网络上获得了完整的数据后交给MyMessageHandler::process来处理接下来的命令,这时opCode开始发挥作用,assembleResponse函数会根据opcode的不同,按照不同的协议去解析出相应的对象,然后执行命令。最后按照同样的协议格式发送给Client响应。发给Client的responseTo设置为与请求命令的requestID相同,以便Driver对应到相应的上下文。

参考引用
时间: 2024-11-03 01:12:50

MongoDB的网络协议的相关文章

Java网络协议 TCP和客户端/服务器范型

服务器|客户端|网络 在网络编程中(同样在其它形式的通讯中,例如数据库编程),使用套接字的应用程序也被分为两类--客户端程序和服务器程序.你可能对"客户端/服务器编程"术语比较熟悉,尽管这个术语的准确意思你不一定清楚.下面的范例就是讨论这个主题. 1. 客户端/服务器范型 客户端/服务器范型把软件分为两类--客户端程序和服务器程序.客户端软件启动一个连接并发送请求,而服务器软件监听连接并处理请求.在UDP编程环境中,没有建立实际的连接,并且UDP应用程序可以在相同的套接字上建立并接收请

电影服务器相关网络协议简介

网络协议在电影服务器中占有很重要的地位,可以说如果没有网络协议,电影服务器就根本无法正常发挥作用.本文简要介绍几种目前主流的网络协议,希望能够对大家了解电影服务器提供一些帮助. 1.FTP:全称File Transfer Protocol(文件传输协议),通过该协议可以在两台计算机之间实现文件的上传与下载,一台计算机作为FTP客户端,另一台计算机作为FTP服务器.目前,通过FTP协议来进行文件的传输是Internet上使用非常广泛的上传.下载文件的方法,可以下载的文件几乎包括所有的文件格式,比如

Java编程那些事儿107——网络协议概念

13.2.5 网络协议 对于需要从事网络编程的程序员来说,网络协议是一个需要深刻理解的概念.那么什么是网络协议呢? 网络协议是指对于网络中传输的数据格式的规定.对于网络编程初学者来说,没有必要深入了解TCP/IP协议簇,所以对于初学者来说去读大部头的<TCP/IP协议>也不是一件很合适的事情,因为深入了解TCP/IP协议是网络编程提高阶段,也是深入网络编程底层时才需要做的事情. 对于一般的网络编程来说,更多的是关心网络上传输的逻辑数据内容,也就是更多的是应用层上的网络协议,所以后续的内容均以实

用Java的New IO开发网络协议

最近用Java的New IO开发了一套简单的网络协议,在这里我把开发中的一些心得整理一下,总结出一套简单的可以重用的网络协议开发框架,希望能够给初学者一点帮助. 网络协议基本的通讯单位是一个一个的消息包.在用socket传输这些包的时,首先要解决的一个问题是如何解决包与包之间的边界问题.socket传输的是流,一个send中发出的消息,在对方不一定在一个recv中收到,可能要多次recv,或者一个recv收到多个send中放出的包.所以必须由应用层协议自己来解决包的定界问题.通常有两种方法,一种

SQL Server 2005使用的网络协议

  在客户端计算机连接到数据库引擎之前,服务器必须在侦听启用的网络库,并且要求启用服务器网络协议.使用SQL Server配置管理器可以进行以下的设置. 启用SQL Server实例要侦听的服务器协议. 禁用不再需要的服务器协议. 指定或更改每个数据库引擎.将侦听的IP地址.TCP/IP端口和命名管道等. 为所有已启用的服务器协议启用安全套接字层加密. 若要连接到SQL Server 2005数据库引擎,必须启用网络协议.SQL Server 2005数据库可一次通过多种协议为请求服务.客户端用

电脑缺少网络协议怎么办

  电脑缺少网络协议怎么办 按下"Win+R"组合键呼出运行,在框中输入"services.msc"点击确定,打开"服务". 在服务窗口中确保: Telephony Remote Access Connection Manager Remote Access Auto Connection Manager 3个服务都已开启,如未开启,双击点开未开启的 服务,将"启动方式"修改为"自动",点击"应用

网吧网络协议故障的排除方法

  有时候网络协议会发生各种问题,很多网管在面对问题时无从下手.本篇说说网吧网络协议故障的排除方法. 一.网吧网络协议故障的表现 协议故障通常表现为以下几种情况: 1.网吧电脑无法登录到服务器; 2.电脑在"网上邻居"中即看不到自己,也看不到其他计算机,或者找不到其他计算机; 3.电脑在"网上邻居"中能看到自己和其他成员,但无法访问其他计算机上的资源(如拷贝); 4.电脑在"网上邻居"中既看不到自己,也无法在网络中访问其他计算机上的资源. 5.电

Win8系统网络协议如何准确安装或卸载

  网络协议是计算机网络中进行数据建议从而建立的约定和规则,相信不少用户遇到系统网络协议带来的故障问题,比如某些软件或游戏需要不同网络协议才能够正常使用,这时候需要用户手动去安装或卸载相关的网络协议,比如说我们常见的win7 32位网络协议.那么在win8操作系统又该如何安装或卸载网络协议呢? 安装或卸载方法/步骤: 1.在"网络"标签里面直接单击"安装"按键,这样就可以打开"选择网络功能类型"选项,然后选择里面的"协议",单

了解网络应用与网络协议

  网络应用(network application)是计算机网络之所以存在的理由.要是我们设想不出任何有用的网络应用,那就没有必要设计支持它们的网络协议了.不过,过去30年内已有不少人设计出大量精妙的网络应用.这些应用既包括从20世纪80年代流行起来的基于文本的经典应用,例如远程计算机访问.电子邮件.文件传送.新闻组.聊天等;也包括近些年来所谓的多媒体应用,例如Web.因特网电话.视频会议.音频/视频点播等. 尽管网络应用品种繁多是有许多彼此交错的部件,其软件却几乎总处于核心地位.网络应用的软