糟糕的应用层通信协议设计

去年和今年分别参与了两个公司的项目,这两个项目都涉及到了通信方面的程序设计,或者是以太网络通信,或者是串口通信。凡是通信就必须要有通信协议,个人认为协议的设计是个非常严肃的工作,需要理解业务需求和掌握基本的协议设计知识。但是从这两个项目来看,其协议的设计可以说是 糟糕到了极点。下面就其糟糕的设计之处予以批判。

1 糟糕设计之一:消息格式“包头+数据+包尾”

与UDP不同,TCP通信属于流式通信,没有消息边界,所以需要应用层自行对报文进行界定分离。实际项目1中,包头为{{两个字节,包尾为}}两个字节,例如{{t=123}}。其格式为:

开始边界+消息1+结束边界+开始边界+消息2+结束边界+开始边界+消息3+结束边界+....

由于TCP是安全的传输层协议,除非特别需要,应用层无需再做校验。消息边界只需要一个标识即可,基本格式为:

消息1+边界+消息2+边界+消息3+边界+...

无论从节约网络带宽,还是从简化报文解析代码,第一种设计都是非常的愚蠢!

无独有偶,项目2中基于串口的通信应用层协议也采用了这种设计格式。

当问其设计人员为何如此设计时,说一直就是这么设计的,自己也不知道这么设计的原因,还美滋滋地说一直没有什么问题,真想揍他一拳。

2 糟糕设计之二:用结构体代码而不是文本描述消息结构

项目2中,根本无协议的描述文本,只有一个包含结构体定义的头文件供协议的使用者参考。

通信就会涉及到多个机器,所以通信协议必须要能跨平台。而我们知道

struct A
{
char x;
int y;
};

在不同编译器,不同平台,不同编译选项下会有不同的二进制布局。况且协议使用者也可能看不懂C系语言代码。更搞笑的是,头文件中竟然没有强制结构体单字节对齐。

问到协议的设计者设计思路时,说我们公司一直这样啊,一直没问题啊。之所以没有问题,是因为使用这个协议的所有机器都是同一CPU型号,同一开发环境,同一操作系统。

3 糟糕设计之三:传送二进制浮点数

浮点数的二进制格式并不是只有一种,不同平台采用不同的方式存放。这要比大端小端的整数差别更加严重。所以跨平台传送二进制浮点数是非常不安全的。而在项目2中,消息中大量使用了二进制浮点数。

要传送浮点数,通常有两种解决方式:

文本化。也就是传送描述浮点数的字符串,我们知道字符串是完全跨平台的,尤其是在UTF-8这样全球统一字符编码的情况下。

转换为整数。例如1.2,可以用整数12代替,只是要规定单位为0.1即可。

4 糟糕设计之三:大量备用字段

项目二的消息结构体类似如下:

struct A
{
char name[16];
int age;
int spare1;
short spare2;
short spare3;
int spare4;
};

大量的备用字段充斥在结构体中。少量的备用字段可以理解,如此大量的后备力量,真是深远谋虑啊。真不知道协议使用者在看到spare时会不会吐。如果真的需要这么多备用字段,完全可以重新定义一个消息结构了。

5 糟糕设计之四:照猫画虎的握手和校验

握手和校验是保证安全完整通信的基本手段,但是其实现却非常不简单,看看TCP的实现代码就知道了,需要考虑各种异常情况。项目二中串口设备和主机之间照猫画虎地定义了一个握手协议。开机后 设备向主机一直发送AA,主机收到AA后向设备发送AA,设备收到AA后向主机发送55,主机收到55后向设备发送55。这个简单的握手存在很多问题,随便说几个:

完全没有必要握手。一般的串口设备无需知道主机的工作状态,主机如果想了解设备状态,发个询问报文即可。

如果主机发送AA后程序退出,那么串口设备永远也等不到来自主机的55。

如果主机中途关掉,在运行时可能收到来自串口设备的AA,而此时的AA其实只是消息报文的一个字节,而不是握手信号。

只要仔细想想,还有很多类似的情况需要处理。而且实际使用过程中,确实发生了上面的情况,致使必须重启串口设备或主机。

还是项目2中,基于UDP的应用层协议自行设计了校验。其实这也无可厚非,比如著名的tftp就是这样的协议。只是设计者考虑不周,各种问题频出,最终的结果是这些校验字段根本就没有实际使用,白白浪费了网络带宽。需要说明的是,这个协议的设计者还是国内很大的一家公司,当然是国企,你懂的

作者:smstong

来源:51CTO

时间: 2025-01-03 08:46:03

糟糕的应用层通信协议设计的相关文章

如何根据需求定义应用层通信协议。比如需求为:LED亮度控制,播放内容

问题描述 如何根据需求定义应用层通信协议.比如需求为:LED亮度控制,播放内容 LED显示中有亮度控制,播放内容,声音控制等需求,现在根据需求如何定义计算机和LED显示设备之间的应用层协议.麻烦能否详细说明一下.主要不理解如何根据需求定协议.谢谢了.

脑洞大开的程序员们:最糟糕的音量控制设计大赛

如果程序员来做设计,世界会变成什么样子? 著名社交新闻网站 Reddit 最近举办了一个"最糟糕音量键设计大赛",起因是一个程序员在 Reddit 晒出了自己设计的一款"不同寻常"的音量控制键,并号召大家加入到设计当中来. 程序员们分别按照自己的想法,重新设计了电脑的音量大小按键,比如这样的: 我也不知道音量大小是多少,全都是凭运气来调整的,想要改音量的时候就 roll 一下 https://static.oschina.net/uploads/space/2017

谈谈应用层切面设计

AOP概要理解纠偏 说到AOP,这个东东现在已经不是一个新词汇了,我们拿一下百度词条来看看是下面的样子的: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开

用户体验:当当网的糟糕的信息反馈页面设计

很久没有在当当网买书了.因为感觉卓越的服务不错,一直用得很顺手,最重要的是速度很快.但是不得不承认,当当上有许多书,卓越是没有的.卓越只做谈得下来有钱赚的畅销书. 很久没上,差点无法登陆,我注册当当的邮箱已经消失很久了(@163.net),我试了好几次才想起来.当我登陆之后,仍然无法找到可以修改登陆Email的地方.也许不可以修改?略过. ============================================ 下单顺利,没有什么阻碍,到了最后成功页,心情不错,看见下方有个反馈,

ppt设计10个超级技巧

据说现在流行以PPT取人,据说现在PPT制造出来的劣质品比历史上任何数字工具制造出来的都要多.如果觉得自己的PPT拿不出手,不妨参考一下本文的一些提示,图文并茂.说教结合.资料丰富,葵花宝典在手,再做演示不愁. 在本文我们将用10个超级技巧来解决糟糕的ppt演示设计肆虐横行的问题,让你可以设计出更好看.更专业的演示. 如何培养出色的演示设计技巧?如果你还没得到建议的话,学学下面的十项技巧看看.等着瞧,如果你的同事注意到你的幻灯片开始变好,他们很可能会开始请你帮帮他们改进一下自己的片子! ppt设

《解读NoSQL》——2.2 将应用分层以简化设计

在架构中采用应用分层的思想可以构建弹性的.可重用的应用.采用应用分层的思想,当必须做出一些改动时,可以选择新增或者修改某一个特定的层次,而不是重写它.在接下来的例子中,通过比较关系型数据库系统和NoSQL系统,可以发现NoSQL应用的功能分布是不同的. 当应用设计者开始考虑存储持久化数据的软件系统时,他们有很多选择.其中一个就是决定是否需要将整个应用的功能通过应用层进行划分.确定每一个应用层将应用分拆为架构独立的组件,有助于软件设计者决定每一个组件需要承担的功能.这种分离的特性有助于设计者向其他

百万用户级电商云上Oracle架构设计与数据库优化

客户介绍: 某电子商务平台自2015年9月份对外提供服务,已在阿里云上稳定运行1年多,近期业务量突增. 据了解,此平台是一个会员制的在线交易平台,业务正在不断上升中,发展形势一片大好的同时,前端应用和后端数据库的压力却越来越大. 目前,该平台国内注册会员用户数已达数百万级别,有上百万的商品数量,在业务高峰期间一小时内可能会达到数万笔交易. 问题分析: 然而,由于应用设计和数据库没有充分优化的问题,导致数据库不堪重赋,CPU一直满负荷运行,整个平台运行缓慢,长此下去,会严重缩减客户数量,故需立即对

[译] 针对失败者的体验设计

本文讲的是[译] 针对失败者的体验设计, 原文地址:On Loser Experience Design 原文作者:Matt LeMay 译文出自:掘金翻译计划 译者:ylq167 校对者:LisaPeng dongpeiguo 设计平台或产品不仅是针对赢家,大V和意见领袖. Turntable.fm,就是一个针对失败者的用户体验设计的教训. 你还记得 turntable.fm 吗?这个产品背后的理念是简单明确的:你和你的朋友或陌生人一起加入了一个虚拟的「房间」,轮流为对方进行打碟.像许多经历过

谈网站导航设计:不是所有的网站都需要导航

中介交易 SEO诊断 淘宝客 云主机 技术大厅 网站策划中百分之七十的工作是围绕网站导航开展的"--这句话是错的.许多优秀的网站成功在导航设计,许多糟糕失败在导航设计,这个现象的确存在,但这并不意味着导航设计占有网站策划工作的绝对重心. 不是所有的网站都需要导航 策划这类思维活动,一旦形成了惯性也就失去了创造力.很多从事网站策划的朋友,总是把着眼点放在了网站的导航,殊不知很多网站压根不需要导航,因此,正确的网站策划思维应该是首先明确"我们是否需要导航",然后才是"我