请讲普通话——一场关于异构平台通信的风波(粘包·大小端方式·网络字节序)

一.引子

前段时间用StriveEngine做一个信息采集系统,服务器是Windows的,客户端是各种单片机,以及Unix等等平台。这些异构的平台,被我召集起来“加强对话, 扩大共识, 深化合作”。都说有人的地方就有江湖,讲真,机器世界也一样!这些异构的平台,平日里各自为政,井水不犯河水,倒也相安无事。如今群雄会盟,共商大计,如我所料,势必会上演一波真正的血雨腥风!

就像新闻联播里常说的,“加强对话, 扩大共识, 深化合作”,首先得“加强对话”吧。

看着各位爷陆续到场,我稍稍清了清嗓子,不揣冒昧,说道:

“各路英雄好汉,这次把大家召集前来,是想让大家强强联手,搞一个大新闻!”

场下变得安静,各个聚精会神。于是我继续说道:

“到底是搞个什么呢?就是搞一个【信息采集系统】!”

场下开始窃窃私语。我接着说:

“大家有什么好的建议,有什么需要彼此沟通了解的,都请各抒己见,畅所欲言!”

掌声响起。

掌声落定。

代表们开始争相发言。

于是问题来了——他们都不讲普通话的好吗!——某型号单片机操一口湖南话,Windows服务器则操一口纽约腔——场面瞬时凌乱!更有一不可名状某终端,恕我孤陋寡闻,您讲的是......是爪哇话吗?怎么还一股孜然味儿?更有两位爷看上去是一言不合,准备动手!我还在纳闷,这两位语言都不通,是怎么一言不合的?!······场面逐渐失控,已容不得我多想!我大喝一声!30名侍卫持枪从侧门进场列阵台前,全场寂静!接着我一个响指,殿外快马加鞭,送上一红绸遮盖的大匾,全场注视。我手气绸落,鎏金大匾上赫然写着金闪闪明晃晃的几个大字:

二.面向字节流的TCP通信

这一切还得从TCP通信说起。

TCP大家都不陌生,是网络协议栈中最重要的协议之一。StriveEngine通信引擎既支持TCP也支持UDP,我们根据业务场景的需要选择的是TCP。TCP是面向字节流的。

      

三.面向字节流通信所引发的问题

正是因为TCP通信面向字节流,同时也引发也一系列相关问题需要我们去着手解决。

1.粘包

其中首当其冲的,也是大家最熟悉的就是粘包问题。

字节流就跟水流一样,当两个消息一起读取时,你无法分别出二者的边界。

2.字节序·大小端方式

TCP是面向字节流的,这个字节流本质上来说就是内存片段。那么问题来了,发送主机与接收主机的存储方式可能不一样,也就是主机字节序不一致。

打个简单的比方吧,以前中国的书都是从右往左读写的,而现在都是从左往右读写的。假使现代人按照现在的习惯去读过去的书,就会因为【主机字节序】不一致而出现问题。

就如同读写可以从左往右,也可以从右往左,马路可以规定靠左侧行驶也可以规定靠右侧行驶——存储方式也有两种——【大端方式】和【小端方式】。

《格列佛游记》中记载小人国中形成了两派政治势力,一派主张吃鸡蛋时要从大端开始剥,另一方则主张要从小端开始剥,一言不合就兵连祸结,烽火频年。

计算机科学借用了这个典故来命名两种存储方式:

遗憾的是大小端方式的分歧在计算机世界里也未能达成一致,因此就造成了异构平台通信过程中主机字节序列不一致的问题。

四.如何解决?

首先要明确一点,这些问题都是【应用层】的问题!因为传输层,或者整个底层通信所肩负的职责就是【通信】,其他的事情不该管也管不了!特别是TCP通信,我们知道TCP是可靠传输——发送方发的啥我保证原封不动的给你送到,至于你收到一看,哎呀,包粘在一起了我怎么分得清楚?哎呀,这发过来的数据我解析出来怎么是乱码?——这都不关TCP通信的事!这是你程序员要做的消息处理的工作,消息传输TCP帮你干了,而且TCP是出了名的"铁齿金不换,诚实可靠小郎君",已经仁至义尽,处理消息、解析消息的工作就要靠身为程序员的你来大显身手了!

时间: 2024-10-12 22:16:21

请讲普通话——一场关于异构平台通信的风波(粘包·大小端方式·网络字节序)的相关文章

一场关于异构平台通信的风波(粘包·大小端方式·网络字节序)

一.引子 前段时间用StriveEngine做一个信息采集系统,服务器是Windows的,客户端是各种单片机,以及Unix等等平台.这些异构的平台,被我召集起来“加强对话, 扩大共识, 深化合作”.都说有人的地方就有江湖,讲真,机器世界也一样!这些异构的平台,平日里各自为政,井水不犯河水,倒也相安无事.如今群雄会盟,共商大计,如我所料,势必会上演一波真正的血雨腥风! 就像新闻联播里常说的,“加强对话, 扩大共识, 深化合作”,首先得“加强对话”吧. 看着各位爷陆续到场,我稍稍清了清嗓子,不揣冒昧

异构平台同步(Mysql到Oracle)

Oracle GoldenGate学习之--异构平台同步(MySQL到Oracle) 如图所示:源端采用Mysql库,目标端采用Oracle库 一.OGG安装配置(源端) 1.OGG下载 https://edelivery.oracle.com/EPD/Download/get_form?egroup_aru_number=14841438 https://edelivery.oracle.com/EPD/Download/get_form?egroup_aru_number=14841440

Oracle Study之案例--异构平台传输表空间(Linux至AIX)

Oracle Study之案例--异构平台传输表空间(Linux至AIX) 系统架构: 可                   源    库               目标库 操作系统 Linux RH6    AIX 5.3-09 主机名 rh6(192.168.8.245) aix211(192.168.8.211) 数据版本 Oracle 11gR2 Oracle 11gR2 数据库名 prod orcl 表空间 test1 test1    可传输表空间概述 Oracle 的可传输表空

异构平台之间的配置DataGuard的情况说明

在部署DataGuard时,最简单的情况是主/备节点配置完全相同的.但是,有时会碰巧会有在异构操作系统上进行部署的情况,以便于从异构平台之间进行数据迁移能有最小的停机时间或风险.为用户通过配置异构的处理能力或硬件成本较低的备用系统,以减少在灾备上的投资,这也是全理的方案.使用提供这种配置的说明信息,以确定哪些平台组合能进行Data Guard的配置,以及任何额外的要求或限制是否在可能适用的范围. 如果考虑使用一个异构的主/备DataGuard配置,Oracle建议用户进行充分的测试,并确保Dat

动手打造自己的跨语言异构模块通信解决方案

目前主流的跨语言异构模块通信方案有很多种,比如: 1.跨语言的RPC调用(Apache Thrift):它是Facebook贡献给Apache基金会的开源项目,旨在构建跨语言平台的通信方案.目前它支持非常多种语言,其中当然包括C/C++和Java.Thrift内置一个语言编译器,可以根据Thrift的语法规范,编译生成指定语言的RPC调用模块,功能也是非常的强大.Thrift的语法规范里面定义了数据类型.数据模块结构,有点类似WebService里面的WSDL文件.通过Thrift,我们就可以实

我给女朋友讲编程CSS系列(3) CSS如何设置字体的类型、大小、颜色,如何使用火狐浏览器的Firebug插件查看网页的字体

一.CSS如何设置字体的类型.大小.颜色 设计网页时,一般设置body的字体,让其他标签继承body的字体,这样设置特别方便,但是标题标签h1到h6和表单标签(input类型)是没有继承body的字体属性的,它们的字体需要单独设置. 1,  新建一个网页a.html,把下面的代码复制进去. <html> <head> <style type="text/css"> body { font-family : 微软雅黑,宋体; font-size : 1

请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句(转载)

笔试的时候经常问这些: 方法一: #define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b):(a)) 若a>b,则a-b的二进制最高位为0,与上任何数还是0,所以大数为a: 否则,a-b为负数,最高位为1,与上0x80000000(最高位为1其他为0)之后为1,所以此时最大数为b. 方法二: #define max(a,b) ((((a)-(b))&(1<<31))?(b):(a)) 方法三:      1.#define 

Rest 实战读书笔记 第一章 :讲web作为建造分布式系统的平台

web取得了非凡的成就,考虑将web架构的基础原理应用到其他的同类分布式系统当中. web如何能够成为这样成功的应用平台?他的指导原理是什么?建造分布式系统的时候,我们应该如何应用这些原理?我们能够使用哪些技术?为何感到web的设计模型很熟悉,到那时任然与以前的平台有很大的不同?企业开发者面对的挑战,web总是适当的解决方案吗? 全书的目标就是描述如何基于web的架构来建造分布式系统.而HTTP协议则利用了REST的架构原则. 1.WEB的架构 web现在是一个混合了商业,研究,政府,社会以及个

CSS找到 (div+css请讲)

CSS 定位和浮动 CSS 定位和浮动提供了一些特性,使用这些属性,你可以建立栏布局,的重叠布局的一部分,并有一些.也可多年来完成通常需要使用的多个表格能力完成的任务. 定位的基本思路是非常easy.对于其正常位置应该出现的位置,或者相对于父元素.还有一个元素甚至浏览器窗体本身的位置.显然.这个功能非常强大,也非常让人惊讶.要知道,用户代理对 CSS2 中定位的支持远胜于对其他方面的支持,对此不应感到奇怪. 一切皆为框 div.h1 或 p 元素经常被称为块级元素.这意味着这些元素显示为一块内容