惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
V
Vulnerabilities – Threatpost
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
SecWiki News
SecWiki News
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
B
Blog
TaoSecurity Blog
TaoSecurity Blog
The Last Watchdog
The Last Watchdog
H
Hacker News: Front Page
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园_首页
D
Docker
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Y
Y Combinator Blog
W
WeLiveSecurity
N
News and Events Feed by Topic
F
Fortinet All Blogs
PCI Perspectives
PCI Perspectives
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Recent Announcements
Recent Announcements
Forbes - Security
Forbes - Security
T
Tailwind CSS Blog
Hacker News: Ask HN
Hacker News: Ask HN
爱范儿
爱范儿
腾讯CDC
Last Week in AI
Last Week in AI
月光博客
月光博客
C
Cybersecurity and Infrastructure Security Agency CISA
P
Proofpoint News Feed
Help Net Security
Help Net Security
V
V2EX
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
H
Heimdal Security Blog
L
LINUX DO - 最新话题
GbyAI
GbyAI
The Hacker News
The Hacker News
罗磊的独立博客
S
SegmentFault 最新的问题
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 【当耐特】
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V2EX - 技术
V2EX - 技术
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
O
OpenAI News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

浮生笔记

时机的重要性 回答dayu博客的几个问题 学会做选择 我理想的城市 如何选择一个适合的城市 马来西亚游记 回首2023,展望2024 从ChatGPT聊起 菲律宾旅游攻略笔记 深圳游记 香港游记 怎样赚钱----我理解的商业模式 用户界面与跨平台 使用telnet通过IMAP协议读取QQ邮箱 信息成本-----从ChatGPT到情报学 买断制到订阅制----兼谈消费频次 我眼中的CSDN 迁移博客内容到静态博客 Hugo使用Jane主题支持搜索实现 C语言和Lua的相互调用示例代码 从放逐之城看经济学 不同产业的分析 回首2021,展望2022 游戏中的经济学 Windows获取网络地址、子网掩码等 -fsanitize=address 参数作用 C++ 编译器支持标准判断 C++ 编译器支持标准判断 VS Code的golang开发配置 之 代码提示 二叉树遍历的非递归算法的实现 我的Chrome插件 golang 获取get参数 关于写代码的几个看法 golang编程之我见 Linux 网络编程之 Select 构建之法读书笔记 (1) 友情链接 Effective Morden C++ 读书笔记(3) 从重构到重写 asio制作使用ssl通信的证书 gdb 7.11 Linux 获取网卡信息 《构建之法》读后感 由买冰箱想到的 2014年年终总结 聊聊我对写好程序的认识 编程技巧之表格驱动编程 经验搜索排名---google已经做过类似的了(我想多了) 有关编程语言的认识
二进制协议 vs 文本协议
DennisThink · 2017-08-04 · via 浮生笔记

文章目录

在服务器程序开发过程中,各个服务直接需要进行交互。这样就需要定义消息的协议,一般来说协议主要包括二进制协议和文本协议,下面就我在工作中用到的两种协议说说自己的看法。


1 二进制协议

目前在公司做服务器后台开发的工作,需要多个服务程序进行交互。因为是TCP直连,所以直接采用二进制消息的方式。消息的定义统一采用消息头(消息ID+消息长度)+x消息体(消息内容)的方式,所以扩展是比较方便的。用代码表示如下

struct CommonMsg
{
    uint32_t  m_msgId;
    uint32_t  m_msgLen;
};

struct KeepAlive:public CommonMsg
{
    uint32_t m_timeStamp;
};

doRead()
{
    CommonMsg * msg=(CommonMsg*)buffer;
    if(msg->m_msgId==ID_KEEP_ALIVE)
    {
         handleKeepAlive(msg);
    }
}

1.1 优点

二进制协议有以下几个优点:

1. 节约内存,带宽。

二进制协议只保存了必须的信息,在需要传递大量信息的时候,对于带宽的节省是非常明显的。

2. 方便加密。

二进制协议很方便使用异或 或者压缩的方式进行加密,防止协议被破解,从而保护了传递的信息,增加协议破解的难度。

1.2 缺点

二进制协议的缺点也非常明显:

1. 难以解析。

对于每一条消息,因为无法自解释,所以对于每一条消息都必须要有对应的文档进行说明。文档和代码的一致性就显得很重要了。

2. 不跨处理器。

因为是严格的内存到对象的转换,所以要求发送方与接收方的的机器字节序保持一致,否则无法正确解析。 ####3. 不方便消息的修改。 对于消息的扩展是比较方便的,不过也只能在消息的后面添加字段,才能做到兼容。如果修改已有字段的顺序就会造成消息无法正确解析。


2 文本协议

在http请求中,一般会采用json或者xml形式的协议。特别是对于web端的前后台交互更多的会采用json。 用代码表示一般如下:

//http://www.chat.com/getuserinfo/
//Request:
{
"user":"1234@qq.com",
"token":"af89da025"
}

//Response
{
  "code":0,
  "msg":"succeed",
  "info":
  {
     "user":"1234@qq.com",
     "name":"test",
     "group":"test",
     "tel":"18888888"
  }
}

2.1

文本协议有以下优点:

1. 扩展方便。

如果需要增加一些条件,直接添加Key和Value就可以了,扩展方便。

2. 方便升级。

如果原有的消息需要升级,可以在回复里直接给出升级后请求的地址和消息格式。

3. 方便跨语言跨平台。

对于消息的发送方和接收方的采用的编程语言没有严格的限制,对于多语言编写提供了便利。

2.2

文本协议的有以下缺点。

1. 浪费带宽。

因为文本协议传递了太多的不会在处理中实际使用的内容,所以在如果处理的请求的量非常大的话,对于带宽的浪费很严重。

2. 不方便加密。

因为文本协议方便解读,所以如果不希望跟其他的程序共享通信协议,就最好不要采用文本协议。


3 应用场景

尺有所短,寸有所长。每种协议都有自己适用场景。

  1. 对于公司内部的服务程序之间进行通信,采用二进制协议好一些。
  2. 对于需要提供给外部的接口,提供文本格式的协议更好。

文章作者 DennisThink

上次更新 2017-08-04

许可协议 CC BY-NC-ND 4.0