全面掌握ISO8583报文协议

最开始时,金融系统只有IBM 这些大的公司来提供设备,象各类主机与终端等。在各个计算机设备之间,须要交换数据。咱们知道数据是经过网络来传送的,而在网络上传送的数据都是基于0或 1这样的二进制数据,若是没有对数据进行编码,则这些数据没有人可以理解,属于没有用的数据。起初的X.2五、SDLC以及如今流行的TCP/IP网络协 议都提供底层的通信编码协议,它们解决了最底层的通信问题,可以将一串字符从一个地方传送到另外一个地方。可是,仅仅传送字符串是没有太大意义的,怎样来解 析字符串表明什么内容是很是重要的,不然传送一些“0123abcd”的字符串也是无用的乱码。     让咱们随着时光回到几十年前的某 个时刻,假设咱们被推到历史的舞台上,由咱们来设计一个通用报文协议,来解决金融系统之间的报文交换,暂且称该协议叫作ISO8583协议。此时,技术是 在不断的前行,当初IBM一支独秀的局面好像已经不妙了,各类大小不一的公司都进入金融行业以求能有所斩获,呈一片百花齐放的局面。咱们怎样来设计一个报 文协议,可以将这些如雨后春笋般出现的全部公司都归入进来,其实也不是一件很简单的事。     咱们仍是先一步步的来考虑吧。金融行业其 实涉及到的数据内容并非成千上万,没法统计,偏偏相反,是比较少的。咱们均可以在心底数得过来,象交易类型、账号、账户类型、密码、交易金额、交易手续 费、日期时间、商户代码、2磁3磁数据、交易序列号等,把全部可以总结出来的都总结起来不过100个左右的数据。那咱们能够首先简单的设计 ISO8583,定义128个字段,将全部可以考虑到的相似上面提到的“账号”等金融数据类型,按照一个顺序排起来,分别对应128个字段中的一个字段。 每一个数据类型占固定的长度,这个顺序和长度咱们都事先定义好。这样就简单了,要发送一个报文时,就将128个字段按照顺序接起来,而后将接起来的整串数据 包发送出去。     任何金融软件收到ISO8583包后,直接按照咱们定义的规范解包便可,由于整个报文的128个字段从哪一位到哪一 位表明什么,你们都知道,只要知道你的数据包是ISO8583包便可,咱们都已经定义好了。好比第1个字段是“交易类型”,长度为4位,第2个字段位是 “账号”,为19位等等。接收方就能够先取4位,再取接着的19位,依次类推,直到整个数据包128个字段都解完为止。     其实这种作法真是简单直接,基本上就能够知足须要了。不过咱们有几个问题要思考下: 一、 我怎么知道每一个字段的数据类型呢,是数字仍是字符? 二、 每一个传送的报文都把128个字段都传过去,那网络带宽可以承受得了,有时候我可能只须要其中5个字段,结果多收到了123个无用的字段。 三、 若是我某些字段的长度不固定,属于变长怎么办,由于你如今解包是看成数据包每一个字段都是固定的,用C语言解包时直接依靠指针取固定长度的一串字符作为一个字段。     咱们来一一解决这些问题。     第 一个问题简单,我在定义ISO8583时除了定义每一个字段表示什么,还规定其内容是数字或是字符等便可。考虑可能出现的类型不过有如下几种:字母、数字、 特殊字符、年月日等时间、二进制数据。好比我对128个字段中的“商户类型”字段定义其长度是15,同时定义其类型为字母。再精细点,若是“商户类型”里 面的数据同时包括数字和字母呢?那咱们就定义其类型为字母也可,为数字也可,即一个字段能够同时属于多个类型。     第二个问题稍微复 杂点。其本质就是若是我只传128个字段的5个字段,接收方怎么知道我传了哪几个字段给它了。要是咱们把剩下的123所有填成0或其余特殊标识,标明该字 段不须要使用?这种处理方法没有半点用处,没有解决网络带宽的本质问题,仍是要传128个字段。     换个思路,我在报文前面加上个包 头,包头里面包含的信息可以让别人知道只传了5个字段。怎样设计这个包头,能够这样,咱们用16个字节,即128个bit(一个字节等于8bit)来表示 128个字段中的某个字段是否存在。每一个bit在计算机的二进制里面不是1就是0,若是是1就表示对应的字段在本次报文中存在,若是是0就是不存在。这样 好了,若是别人接收到了ISO8583报文,能够先根据最前面的报文头,就知道紧接着报文头后面的报文有哪些字段,没有哪些字段了。好比,我要发送5个字 段,分别属于128个字段中的第二、三、六、八、9字段,我就能够将128bit的报文头填成011001011000000000………..,一共 128个bit,后面就全是0了。注意其中第二、三、六、八、9位为1,其余都为0。     有了这个128bit的报文头,咱们就能够 只发送须要的5个字段了。怎样组织报文?先放上这128bit,即16个字节的头,而后在头后面放二、三、六、八、9字段,这些字段紧挨在一块儿,3和6之 间也不须要填上四、5这两个字段了。接收方收到这个报文,它会根据128bit的报文头来解包,它天然知道把第3个字段取出后,就直接在第3字段的后面取 第6个字段,每一个字段的长度在ISO8583里面都定义好了,很轻松就把数据包解出来了。     这下好了,为了解决上面的第二问题,我 们只是在报文中增长了16个字节的数据,就轻松搞定了,咱们把这16个字节称为bit map,即位图,用来表示某个位是否存在。不过咱们再稍微优化一下,考虑到不少时候报文不须要128个字段这么多,其一半64个字段都不必定可以用完。那 我能够将报文头由128bit减到64bit,只有在须要的时候才把剩下的64bit放到报文里面,这样报文长度不又少了8个字节吗?     是 个好主意。咱们把ISO8583的128个字段中最多见的都放到前64个字段中,那咱们能够将处理缩小一倍。这样我通常发送报文时只需发送64bit,即 一个字节的报文头,再加上须要的几个字段就能够了。若是有些报文用到64到128之间的字段呢?这个也好办,我把64bit报文头的第一位bit用来表明 特殊含义,若是该bit为1,则表示64bit后面跟了剩下的64bit报文头;若是第一位bit为0,则表示64bit后面没有跟剩下的64bit报文 头,直接是128个字段中的报文了。那们,接收方会判断一下报头的第一个bit是1仍是0,从而知道报文头是64bit仍是128bit了,就能够作相应 处理。由于报文头第二个64bit属于有时候有,因此咱们叫它Extended bit map扩展位图,相应的报文头最开始的64bit咱们叫它Primary bit map主位图。咱们直接把扩展位图固定放到128个字段的第一个字段,而主位图每一个数据包都有,就强制性放在全部128个字段的前面,并不纳入128个字 段中去。     第三个问题能够考虑这样解决。好比第2个字段是“账号”,是不定长的,可能有的银行账号是19位,有的是17位等。咱们 定ISO8583规范时能够规定第2个字段是25位,这下足够将19和17的状况都包含进来,可是若是之后出现了30位的怎么办?那咱们如今将字段定为 100位。之后超过100位怎么办,何况若是你只有19位的账号,咱们定义了100位,那81位的数据不是浪费了网络的带宽。看来预先定义一个咱们认为比 较大的位数是不太好的。        咱们这样,对于第2个字段“账号”,在字段的开头加上“账号”的长度。好比账号是 0123456789,一共10位,咱们变成100123456789,注意前面多了个10,表示后面的10位为账号。若是你接触过COM里面的 BSTR,应该对这种处理比较熟悉了。接收方收到该字段后,它知道ISO8583规定第2个字段“账号”是变长的,因此会先取前面的2位出来,获取其值, 此时为长度,而后根据该长度值知道应该拷贝该字段后面哪几位数据,才是真正的账号。若是你以为长度若是只有两位最多只能表示99位长,不太够,咱们也定义 能够容许前面3位都为长度的变长字段,这样就有999位长,应该够了吧。在规范里面若是我定义某个字段的属性是“LLVAR”,你注意了,其中的LL表示 长度,VAR表示后面的数据,两个LL表示两位长,最大是99,若是是三位就是“LLLVAR”,最大是999。这样看咱们定义的ISO8583规范文档 时直接根据这几个字母就理解某个变长字段的意思了。     该解决的几个问题到这里都解决了,咱们来回顾下本身设计的ISO8583规 范。其实没有什么,无非是把金融行业可能出现的数据分门别类,排好顺序,接着把它们链接起来,组成一个报文发送出去而已。其中针对该报文的设计进行了一些 优化,引入了bit map位图的概念,也算是一个不错的想法。     剩下的工做就简单了,咱们就直接收集金融行业可能出现的数据字段类型,分红128个字段类型,若是没有到128个这么多就先保留一些下来,另外考虑到有些人有特殊的要求,咱们规定能够将128个字段中的几个字段你本身来定义其内容,也算是一种扩展了。     这样,最后咱们就获得了ISO8583规范的那张字段描述表了。想要详细的知道每一个字段的含义直接对着表看就能够,比较简单。
相关文章
相关标签/搜索