三、TokyoTyrant的网络协议
1、简单介绍
介绍这个,其实价值不大,因为详细的文档都在那里呢:http://1978th.net/tokyotyrant/spex.html#protocol
不过,还是要说一下,因为我对TT的协议,颇有些不满。
TT的协议,各位如果仔细看,就会发现,这是一个典型的未经重构的,临时拼凑起来的协议。最初的TT,只考虑了基本的put、putkeep、putcat、out、get、mget等等命令,每个命令都以0xC8开头,然后再加上一个16位二进制数。
put 0×10
putkeep 0×11
putcat 0×12
putshl 0×13
putnr 0×18
out 0×20
get 0×30
mget 0×31
……
但是,他还有一个misc命令,所有与Table数据类相关的命令,都包含在misc里面,misc的格式是这样的:
[magic:2][nsiz:4][opts:4][rnum:4][nbuf:*][{[asiz:4][abuf:*]}:*]
magic: 0xC8 0×90
nsiz: name的长度
opts: option参数
rnum: 后续参数的个数
nbuf: name
asiz与abuf交替出现,表示每一个参数
因此,我们针对RDBTBL的操作,最终都会调用misc命令。
rdb = RDB::new
rdb.open("localhost", 3900)
rdb.put("foo", "hop")
#发出0xC8 0×10 0×0003 0×0003 "foo" "hop"
# magiccode ksiz vsiz kbuf* vbuf*
rdb = RDBTBL::new
rdb.open("localhost",3900)
rdb.put("foo",{"hop"=>"value"})
#发出0xC8 0×90 0×0003 0×0000 0×0003 "put" 0×0003 "foo" 0×0003 "hop" 0×0005 "value"
magiccode nsiz opts rnum nbuf* asiz1 abuf1* asiz2 abuf2* asiz3 abuf3*
看上去非常类似的代码,发出的网络数据流,却完全不同。
2、misc的问题
TT的协议中,最麻烦的,就是这个misc命令,效率最低的,也是这个misc命令,Table型数据,一共支持10个不同的命令,却全部被堆到一个misc里来完成了。
按照某种合理的逻辑,这些命令,应该跟正常的其他命令类似,各自分配到自己的magic code,各自有自己的命令格式和定义,而不是像现在这个样子。
即使是这个misc本身,也非常糟糕,将key与value,放到一个数组里,而且整个数组也没有一个总的长度,使得解析也变得效率低下了。
目前的TCDatabase,因为是在TT的skeleton基础上开发,因此接收的命令与TT完全一致。这当然降低了开发的难度。但是,要想进一步改善TT,或者说要想做出一个TCDatabase,抛弃现有的二进制协议,另起炉灶,应该是一个必然的选择。
3、TCDatabase的协议设想
这个是一个初步的设想,还需要跟riceball详细讨论,才能确定下来:
- 每个命令一个不同的magic code
- [key_size] 如果需要key作为参数的话
- [key_buf*] 如果需要key作为参数的话
- [opts] 选项
- [arguments_size] 参数总长度
- [arguments_length] 参数个数
- [arguments_1_size] 第一个参数的长度
- [arguments_1_buf*] 第一个参数
- ……
相比原来的TT协议,这样应该更容易解析一些,效率也会有提升。
(待续)
分享到:
相关推荐
TCDatabase 封装FMDB,支持全文检索、支持条件对象查询、支持定时收回SQLite空间、支持JSON定义表、自动增加表字段等
基于yolov5目标检测的跌倒检测数据集(voc格式)——上部
工程代码基于STM32F103C8T6,通过ADC多通道检测4个数据,使用一个电位器产生0-3.3v连续变化的模拟电压信号,和三个传感器:光敏电阻模块,热敏电阻模块,红外反射模块。之后用stm32的adc读取数据,并且通过oled屏幕显示4个数据。
2024年中国便携式RFID读写器行业研究报告
2024年中国超声腐蚀监测系统行业研究报告
惠普打印机主板免芯片编程器固件HP 136NW/W,实测HP 136WM也可以用,另外还有原机固件备份! 免芯片就是加粉不需要更换芯片了,一直显示满粉
蚁群算法MATLAB代码
ManifestDownload_230712_52pojie.zip.cab
【作品名称】:基于Socket作为服务器与传感器通讯手段实现的家庭能源管理系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。
2024年中国被动长波红外镜头行业研究报告
简介:配送路线优化系统,Web端项目 算法:遗传算法+蚁群算法+多目标优化 技术栈:前端采用Vue-CLI开发(frontend),后端采用Django框架开发(ulb_manage)
2024年中国超声波凝固和切割装置行业研究报告
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
这是一组从网站上的精选用户那里收集的 20,000 多款游戏 Lichess.org,以及如何收集更多游戏。我还将在未来收集更多游戏时上传它们。此套装包含:游戏 ID;额定值 (T/F);开始时间;结束时间;匝数;游戏状态;胜利者;时间增量;白色玩家 ID;白人球员评分;黑色玩家 ID;黑人球员评分;所有动作均采用标准国际象棋符号;Opening Eco(任何给定开口的标准化代码,在此处列出); 开场名称;开盘(开盘阶段的移动次数)
自己的NLP学习笔记,暂时还没有加上参考文章的链接~ 以后一定补上!
建伍8100车载对讲写频软件
ISO 4892-3 2016 塑料实验室光源暴露方法第3部分:荧光紫外灯.pdf
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
特斯拉AP(autopilot)和FSD(Full Self-Drive
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。