`
wanxiaotao12
  • 浏览: 467555 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

简单的文本协议、二进制协议

 
阅读更多

写网络程序躲不过协议,协议其实就是定义了消息的格式,以及消息是如何交换的。协议可简单可复杂,复杂精密如TCP协议,简单奔放如HTTP的协议。这里将我所接触到的协议稍微总结一下,最后抛出一个个人设计的简单通用的文本协议。

设计一个协议不是一件很容易的事情,尤其是当对设计的要求包含很好的描述性和可扩展性的时候。如果再将效率考虑在内,则更是件耗脑力的活。在继续讨论下去之前,先看看现有的一些协议吧。这里主要讨论的是应用层的协议,应用层的协议大多是请求响应模式(除了zeromq这个变态的家伙,后面再说),所以这里侧重讨论消息格式。

HTTP协议

这可能是大家接触得最多的协议了,HTTP协议是一个比较简单的基于文本的协议。消息格式基于文本,换行分隔键值串,键和值用冒号分隔,同时定义了一些标准的键和值。这个协议描述性教强——人类可读。扩展性强——加自定义的头很容易,也几乎不会有副作用(除了消息体积增加一点点)。但是,缺点就是标准定义的东西太多了,细节太多。解析较复杂。

memcached协议

memcached有两种协议,文本协议二进制协议,文本协议以换行表示一个请求结束。请求内部参数以空格分隔。为了二进制安全,在二进制数据前要加上长度这个参数,如set x 3 abc\r\n。

文本协议固然简单,可是当请求很小的时候,过多的协议本身的数据则显得浪费(比如每个HTTP请求只发送一个字母,可HTTP头可能有上百的字符,太浪费了),而且,server在接收到请求之后还要做文本解析,也耗cpu,于是memcached又推出了二进制协议,为了锦上添花,是的memcached更加高效。二进制协议的优点就是高效,因为所有信息都以最少的数据量来表达,且server解析请求时做的是数学比较而不是字符串比较,效率高很多。

memcached的协议比起HTTP来就轻得多了(当然,两者所面向的场景不一样,故这个比较没太大意义)。但是,也有缺点,就是扩展性较差,协议定得比较死,哪个位置上有哪些东西,是什么意义是定死的。所以,直接哪来用在不同的场景下不大现实。

redis协议

redis的协议也是文本协议,但是设计得比较小心和通用(我后面自己定义的协议深受其影响),在保证描述性的同时尽量减少协议本身的数据量,比如,在memcached的文本协议中,错误用“ERROR\r\n”来表示,而redis使用“-”来表示,用“:”开头的行表示整数等等。这样的设计结合了文本协议的简单和一部分二进制协议的高效。用在redis这个场合,很是适合。交换方式同样是请求响应。redis协议有一个缺点,就是,一个消息有多少参数是需要在开头指定的。不像HTTP协议用空行来表示结束。这就带来一个缺点,不好流水操作,也就是说消息必须在发送第一个字节之前被完全确定,因为第一个东西就是参数个数:-(。

上面讨论的基本都是文本协议,当然还有很多采用二进制协议的服务,如gearman、mysql等,二进制协议就相当于压缩版的文本协议,提高了传输效率,但是降低了描述性和灵活性(万一那个位置预留的位数不够就囧了)。

总的来说,这就是一个平衡的过程。如果消息体不是很小(比如每次只传一个字节的消息就很小了),那么采用文本协议还是值得的。毕竟文本协议简单,好扩展,利于调试(telnet就可以当客户端用),虽说消息是让计算机读的,但有时候也要人去看。所以,能用文本还是用文本吧。

简单文本协议

最后我定义了一个简单的基于文本的协议,叫做simpletp(Simple Text based Protocol),详细定义在这里http://simpletp.org,这个协议是为了简单的RPC而设计,结合了HTTP协议的灵活(以空行结束),redis协议的轻量(size+data)。但为了简单通用,没有采用redis的单字符表示类型的设计,因为这样就会引入额外的复杂性,如表示整数用“:”,那么浮点数、复数等等怎么办,干脆什么类型都没有,就简单的传输size+data串(有点类似zeromq,但是比zeromq做的事情少),而具体的类型则交由其他机制去处理,如protocol buffer。

分享到:
评论

相关推荐

    文本到二进制的转换,比较简单。

    总之,文本到二进制的转换是计算机处理信息的基础步骤,无论是在简单的文件存储还是复杂的网络通信中,都离不开这种转换。了解并掌握这一概念,对于深入理解计算机系统和进行相关开发工作至关重要。

    易语言文本和16进制相互转换工具

    文本和16进制之间的转换是编程中常见的需求,特别是在处理二进制数据、文件解析或通信协议时。易语言提供的工具和方法使得这种转换变得简单易行。 在易语言中,进行文本和16进制转换主要涉及到以下几个知识点: 1....

    文本及二进制通信命令

    总的来说,文本和二进制通信协议的选择取决于具体需求,文本协议适用于简单、清晰的数据交换,而二进制协议则适用于高效、复杂的数据传输。理解这两种协议的工作原理及其相互转换,对于开发和维护网络应用程序至关...

    二进制-文本互转工具

    在IT领域,二进制与文本之间的转换是常见的操作,特别是在数据处理、编程以及通信协议的理解中。这个名为“二进制-文本互转工具”的软件是基于Microsoft Foundation Classes (MFC) 框架开发的,专为解决这类转换问题...

    基于JAVA NIO 的轻量级消息传输框架。主要功能包括:文本消息传输、二进制文件传输、文本及二进制混合传输.zip

    在接收端,根据协议解析接收到的字节流,将文本和二进制数据正确分离并处理。 为了实现这些功能,这个框架可能会包含以下组件: - **服务器端**:负责监听客户端连接,创建用于通信的`SocketChannel`,并分配资源...

    HTTP二进制

    HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,它主要用于传输文本、图像、音频和视频等多种类型的数据,其中就包括二进制数据。本文将深入探讨HTTP二进制传输的原理、应用场景以及相关的编程工具。 ...

    二进制文件To文本转换器

    在IT领域,我们经常需要处理各种类型的文件,其中包括二进制文件和文本文件。二进制文件通常包含非打印字符,直接阅读困难,而文本文件则以人类可读的字符编码存储信息。"二进制文件To文本转换器"就是一个解决这种...

    UDP协议二进制实例分析

    ### UDP协议二进制实例分析 #### 概述 本文档基于博客文章“[UDP协议二进制实例分析](http://blog.csdn.net/u010476739/article/details/48402705)”的内容进行详细解读。该文档通过Wireshark工具捕获了一个UDP...

    MATLAB二进制转十六进制函数

    在MATLAB中,二进制数据转换为十六进制是一个常见的操作,特别是在处理数字信号处理、数据存储或通信协议时。MATLAB提供了多种内置函数来完成这种转换,其中一个关键的函数就是`bin2hex`。这个函数使得用户能够将二...

    二进制查看小工具 也可以用来编辑代码

    4. **数据转换**:工具通常包含将二进制数据转换为其他格式(如文本、图像或音频)的功能,或者将其他格式的数据转换回二进制。 5. **分析工具**:高级的二进制查看器可能包含分析功能,比如计算校验和、识别特定...

    Base64转二进制文件,Base64 To File

    它将任意的二进制数据转化为ASCII字符序列,这样就可以在文本格式的邮件、网页源代码等场景中方便地使用。Base64编码会将3个字节的二进制数据转化为4个字符的Base64字符串,每个Base64字符代表6位的二进制数,总共能...

    mysql 二进制转换工具

    因此,对二进制数据的处理和传输必须谨慎,确保遵循最佳安全实践,如限制权限、使用安全的传输协议,并定期更新和审计数据库系统。 6. **aa.bat和upfile.exe**: 压缩包中的这两个文件可能是工具的一部分。`aa.bat`...

    处理二进制文件源代码

    对于复杂格式的二进制文件,如数据库文件或特定协议的数据,可能需要使用解析库,如C++中的Boost库,或者Python中的pandas、protobuf等。这些库提供高级功能,如自动解析、数据验证和序列化。 总结,处理二进制文件...

    SFTP工具,二进制传输

    如果一个二进制文件被误用ASCII模式传输,可能会导致文件损坏,因为ASCII模式会尝试对非文本数据进行错误的字符转换。因此,对于不确定类型的文件,使用二进制模式通常是更安全的选择。 总结来说,SFTP工具,尤其是...

    16进制转文本工具

    在实际应用中,16进制转文本工具可能与诸如Wireshark这样的网络嗅探工具、hex编辑器如HexEdit,或者调试器等配合使用,以帮助解析和理解原始二进制数据的含义。对于初学者,了解并掌握这种转换技巧是理解和探索底层...

    RFC856_Telnet二进制传输 .doc

    总之,RFC856提供了一种标准化的方法,使得在Telnet协议中能够安全有效地传输二进制数据,扩展了Telnet的功能,使其能够处理更广泛的应用场景。通过规范二进制传输的启用和管理,该文档对于构建和维护网络应用程序的...

    二进制汉字互转程序

    在IT领域,二进制与汉字的转换是计算机科学中的基础操作,特别是在文本编码、数据存储和通信协议中。本文将深入探讨“二进制转汉字”和“汉字转二进制”的互转程序,以及如何使用C#编程语言实现这一功能。 首先,...

    WebService二进制处理

    在传统的SOAP(简单对象访问协议)消息中,所有数据都以XML格式进行编码,这可能导致效率低下,因为XML对二进制数据的处理相对臃肿。为了解决这个问题,MTOM(Message Transmission Optimization Mechanism,消息...

    BianryViewer(二进制文件查看器)

    3. **网络协议分析**:网络数据通常以二进制包的形式传输,查看器可以揭示这些包的底层结构。 4. **系统调试**:在系统级问题诊断中,查看内存映射的二进制数据有助于找到问题根源。 总之,BinaryViewer这样的二...

Global site tag (gtag.js) - Google Analytics