当前位置:项目开发->项目经验 ->云平台开发架构分析系列5:数据包的处理逻辑分析2(数据包拆包实现思路)

原创版权标志云平台开发架构分析系列5:数据包的处理逻辑分析2(数据包拆包实现思路)

作者:codexia  发表时间:2017/6/21 8:56:15  阅读:
[摘要] 本篇继续深入数据包的处理逻辑分析,主要分析了几种常见的数据包拆包方式,满足粘包数据包拆包、截断数据包的处理,最大化降低数据包的丢弃处理。
   在文章《云平台开发架构分析系列4:数据包的处理逻辑分析1》中,我已经将数据包处理的整体思路分析了。现在开始对数据包处理的关键细节实现思路进行分析。
    对于数据包处理最复杂的地方就是对数据包的拆包处理。我们要将粘包的多个包(连续完整的多个或者有被截断的包)正确的拆分出来,是一项稍微麻烦的事情。我们要准确拆分出来,还要将截断的数据包前后拼成完整的包。否则处理不好,就会出现数据包丢失的问题。
    至于验证数据包的合法性,也就是针对数据包对应的业务协议格式进行各个字段的检测而已。所以这里就没有什么好说的,每一个协议不一样,检验方法也不相同。不过有一点需要说的是,协议数据是一段字节流,解析协议也就是将一段字节流按照协议定义的格式,挨个的划分出各字段,然后再确定各字段的值和所代表的意义是否是有效的。比如一个字段的标志固定为0xFF,如果此字段的值不是这个,那么这个数据包就无效。如果一个字段表示数据包整个长度为100字节,而数据包却只有50字节或者120字节,那么这就需要进行额外的处理,缓存或丢弃。
    而我们的数据包的拆包,也是要基于协议的标志进行的。具体如何拆,不同的协议有所不同,我们也没有办法用实例的说明。我就说个思路,仅供参考。
    如果说要正确拆包,那么我们就需要正确识别包的开始和结束。所以我们至少要知道数据包的开始标志。这也是各种协议需要的开始标志字节序列的原因。如果不是这样,那么就是其他各种手段确保能够识别包头的。因为我们使用的是TCP协议传输字节流。我们很难字节包装每次接受的都是我们自己定义的一个完整的业务协议数据包,所以我们不能用某种办法控制数据包的发送,或者很难控制。而我们用起始字节序列作为开始,显然也就方便多了。
    那么我们识别包头,也就是从这个开始标志字节序列开始的。我们假设这个开头是0xAA0xFF,那么我们在接受到客户端发送过来的一段原始数据的时候,从头开始搜索开头字节序列,如果搜索到了,自然也就找到了开头,定位到了一个数据包的开始。
    那么向后我们如何确定数据包的结尾呢?这里我们要说到协议的第二个非常重要的字段,那就是数据包的长度...【登录后阅读更多内容】
文章来源:C++技术网原创文章版权为网站和作者共同所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。

返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)