《全面掌握报文协议》由会员分享,可在线阅读,更多相关《全面掌握报文协议(7页珍藏版)》请在金锄头文库上搜索。
1、全面掌握报文协议全面掌握ISO8583报文协议我刚进入金融行业时,就知道了 IS08583报 文协议,我想可能我还没进入这个行业都已经听 过了,可知ISO8583的影响力有多大了。最初 刚接触它时,确实对其中的一些细节概念不是很 清晰,对有些地方比较迷惑。鉴于此,我想很多 同行也必然会经历同样得阶段,所以我写下本 文,以便大家能够少走一些弯路。同时,我在网 上写下我要写“全面掌握ISO8583报文”和“符合CEN/XFS (即WOSA/XFS)规范的SP编写”两 篇文章时,很多人都询问我什么时候能够写出 来,可知许多人是需要了解这方面的知识的,即 使我时间不是很多,也得尽量将这两篇文章写出 来
2、,给需要的人提供一些参考。如果单纯的讲IS08583那些字段的定义,我 觉得没有什么意思,标准中已经对每个字段解释 的非常详细了,如果你觉得理解英文版的ISO8583规范有些困难,网上也有同行为我们:译好的中文版ISO8583规范,所以我的目的是 达到阅读本文后能够对ISO8583知其然,亦知 其所以然,使以前基本没有接触它的人也能够达 到掌握ISO8583报文规范。好了,我们该转入正题了。liiJ:开始时,金融系统只有IBM这些大的公司 来提供设备,象各种主机与终端等。在各个计算 机设备之间,需要交换数据。我们知道数据是通 过网络来传送的,而在网络上传送的数据都是基 于0或1这样的二进制数据
3、,如果没有对数据进 行编码,则这些数据没有人能够理解,属于没有 用的数据。起初的X.25、SDLC以及现在流行的 TCP/IP网络协议都提供底层的通讯编码协议, 它们解决了最底层的通讯问题,能够将一串字符 从一个地方传送到另一个地方。但是,仅仅传送 字符串是没有太大意义的,怎样来解析字符串代 表什么内容是非常重要的,否则传送一些 “0123abcd的字符串也是无用的乱码。让我们随着时光回到几十年前的某个时刻,假设我们被推到历史的舞台上,由我们来设计个通用报文协议,来解决金融系统之间的报文交liiJ换,暂且称该协议叫做ISO8583协议。此时, 技术是在不断的前行,当初IBM 一支独秀的局 面好
4、像已经不妙了,各种大小不一的公司都进入 金融行业以求能有所斩获,呈一片百花齐放的局 面。我们怎样来设计一个报文协议,能够将这些 如雨后春笋般出现的所有公司都纳入进来,其实 也不是一件很简单的事。我们还是先一步步的来考虑吧。金融行业其 实涉及到的数据内容并不是成千上万,无法统 计恰恰相反,是比较少的。我们都可以在心底 数得过来,象交易类型、帐号、帐户类型、密码、 交易金额、交易手续费、日期时间、商户代码、 2磁3磁数据、交易序列号等,把所有能够总结 出来的都总结起来不过100个左右的数据。那我 们可以首先简单的设计ISO8583,定义128个字 段,将所有能够考虑到的类似上面提到的“帐号” 等金
5、融数据类型,按照一个顺序排起来,分别对 应128个字段中的一个字段。每个数据类型占固 定的长度,这个顺序和长度我们都事先定义好。这样就简单了,要发送一个报文时,就将128个 字段按照顺序接起来,然后将接起来的整串数据 包发送出去。任何金融软件收到ISO8583包后,直接按照 我们定义的规范解包即可,因为整个报文的128 个字段从哪一位到哪一位代表什么,大家都知 道,只要知道你的数据包是ISO8583包即可, 我们都已经定义好了。比如第1个字段是“交易 类型”,长度为4位,第2个字段位是“帐号”, 为19位等等。接收方就可以先取4位,再取接 着的19位,依次类推,直到整个数据包128个 字段都解
6、完为止。其实这种做法真是简单直接,基本上就可以 满足需要了。不过我们有几个问题要思考下:1、我怎么知道每个字段的数据类型呢,是数字 还是字符?2、每个传送的报文都把128个字段都传过去, 那网络带宽能够承受得了,有时候我可能只需要 其中5个字段,结果多收到了 123个无用的字段。3、如果我某些字段的长度不固定,属于变长怎么办,因为你现在解包是当作数据包每个字段都 是固定的,用C语言解包时直接依靠指针取固 定长度的一串字符做为一个字段。我们来一一解决这些问题。第一个问题简单,我在定义ISO8583时除了 定义每个字段表示什么,还规定其内容是数字或 是字符等即可。考虑可能出现的类型不过有以下 几种
7、:字母、数字、特殊字符、年月日等时间、 二进制数据。比如我对128个字段中的“商户类 型”字段定义其长度是15,同时定义其类型为字 母。再精细点,如果“商户类型”里面的数据同时 包括数字和字母呢?那我们就定义其类型为字 母也可,为数字也可,即一个字段可以同时属于 多个类型。第二个问题稍微复杂点。其本质就是如果我 只传128个字段的5个字段,接收方怎么知道我 传了哪几个字段给它了。要是我们把剩下的123 全部填成0或其他特殊标识,标明该字段不需要 使用?这种处理方法没有半点用处,没有解决网络带宽的本质问题,还是要传128个字段。2 4 16 2 8 256换个思路,我在报文前面加上个包头,包头
8、里面包含的信息能够让别人知道只传了 5个字 段。怎样设计这个包头,可以这样,我们用16 个字节,即128个bit (一个字节等于8bit)来 表示128个字段中的某个字段是否存在。每个 bit在计算机的二进制里面不是1就是0,如果是 1就表示对应的字段在本次报文中存在,如果是 0就是不存在。这样好了,如果别人接收到了ISO8583报文,可以先根据最前面的报文头,就 知道紧接着报文头后面的报文有哪些字段,没有哪些字段了。比如,我要发送5个字段,分别属 于128个字段中的第2、3、6、8、9字段,我就 可以将 128bit 的报文头填成 011001011000000000.,一共 128 个 bit, 后面就全是0 了。注意其中第2、3、6、8、9位 为1,其他都为0。有了这个128bit的报文头,我们就可以只发 送需要的5个字段了。怎样组织报文?先放上这