一直對(duì)這個(gè)數(shù)據(jù)格式?jīng)]有好感,因?yàn)樗龑?dǎo)人們把名稱簡化為無意義的編號(hào),增加記憶和理解的成本。
周星馳的《唐伯虎點(diǎn)秋香》中,唐伯虎進(jìn)入華府做家丁,被編號(hào)為9527,一個(gè)家丁沒有資格被呼作姓名,就算是唐伯虎。
曾幾何時(shí),高速公路的路牌是各種的名字:機(jī)場高速,京珠高速。。。。后來被取締為s21,g20,讓人十分無語。
最近,我聽得最多的就是49域上送的不對(duì),32域校驗(yàn)不對(duì)之類的。當(dāng)時(shí)我的心真的有點(diǎn)捉狂,使得我一度很惡趣味的猜測,這玩意除了給初學(xué)者增加學(xué)習(xí)的成本,形成一種就業(yè)壁壘外,還能有啥好處?畢竟這是ibm年代的產(chǎn)物,大型機(jī)的技術(shù)封閉使得技術(shù)人員非常稀罕。
用最簡單的話語介紹一下iso8583格式的協(xié)議:
iso是一個(gè)國際規(guī)范組織,這個(gè)8583規(guī)范是定義關(guān)于銀行卡的數(shù)據(jù)傳輸格式,我們?nèi)粘J褂玫腶tm,pos在進(jìn)行數(shù)據(jù)傳輸?shù)臅r(shí)候,就使用iso8583協(xié)議。
從技術(shù)層面看,iso8583格式報(bào)文(下稱8583包)如下組成:
mti(4b)+位圖(1-3B)+數(shù)據(jù)
既然這個(gè)格式是銀行卡的數(shù)據(jù)傳輸格式,我們來看看從atm取錢的流程
1.插卡,輸入密碼
2.點(diǎn)擊取錢,輸入金額
3.吐錢,退卡
這里每個(gè)步驟,其實(shí)都由atm機(jī)器和銀行系統(tǒng)進(jìn)行了多次的數(shù)據(jù)傳輸。同時(shí),傳輸?shù)臄?shù)據(jù)有以下的要求:
1.要以二進(jìn)制的形式通過廣域網(wǎng)傳輸
2.數(shù)據(jù)要安全
3.數(shù)據(jù)的高效率
由于第1點(diǎn),我們需要使用一個(gè)約定的格式來實(shí)現(xiàn)銀行卡的數(shù)據(jù)與二進(jìn)制數(shù)據(jù)的轉(zhuǎn)換,這個(gè)過程叫序列化和反序列化。
而目前國際上,包括國內(nèi),都適用了iso8583協(xié)議作為傳輸?shù)耐ㄓ酶袷健?/p>
8583安全嗎?
我曾經(jīng)以為使用8583是為了安全,然而并不是這樣,我們可以隨意的下載到這個(gè)8583規(guī)范,拿到數(shù)據(jù)包即可根據(jù)規(guī)范文檔對(duì)其中的數(shù)據(jù)進(jìn)行查看。當(dāng)然,銀行卡數(shù)據(jù)的安全是由其他手段保證,這里不展開。
iso8583包的數(shù)據(jù)處理效率高?
這個(gè)問題我思考了一段時(shí)間了,但如果8583包的處理效率高,為何現(xiàn)在沒有在其他領(lǐng)域推廣?
沒有看到哪個(gè)序列化是參考了8583的思想所以很快的啊?
決定序列化處理的效率,一般是由下面兩個(gè)重要因素決定:
1.轉(zhuǎn)換后二進(jìn)制數(shù)據(jù)的大小,越小越好
2.轉(zhuǎn)換的速度,越快越好
一次數(shù)據(jù)的轉(zhuǎn)換,一般需要如下的元素:
1.轉(zhuǎn)換的schema:包含了每個(gè)數(shù)據(jù)的含義,長度和類型,有了schema才可以解開數(shù)據(jù)包。而schema應(yīng)該是雙方約定好的,在各自的本地保存,不需要在傳輸?shù)臄?shù)據(jù)包中帶上,以減少傳輸數(shù)據(jù)的大小。
2.數(shù)據(jù)位的對(duì)照:代表這次攜帶了多少數(shù)據(jù)。假設(shè)schema定義了128個(gè)字段,但是一次傳輸不一定會(huì)帶上128個(gè)字段,因此需要指定這次攜帶了多少個(gè)字段,以及這些字段如何和schema對(duì)應(yīng)起來。
3.數(shù)據(jù)有哪些:就是數(shù)據(jù)本身,可以是任何的數(shù)據(jù)
iso8583和業(yè)界常用序列化的對(duì)比
1.schema是否在數(shù)據(jù)包中帶入:
8583、fastjson、protobuf和java原生序列化,都不在數(shù)據(jù)中帶入schema,此項(xiàng)打平
2.8583包采用位圖(bitmap)的形式來實(shí)現(xiàn)數(shù)據(jù)位的對(duì)照,一個(gè)字節(jié)可以表示64個(gè)字段是否存在。一般用2-3個(gè)字節(jié)就可以表示數(shù)據(jù)位的對(duì)照。
fastjson屬于json格式,使用[]{}:進(jìn)行數(shù)據(jù)位的匹配,再由字段名進(jìn)行數(shù)據(jù)位的對(duì)照,例如name這個(gè)字段,必須占用4個(gè)字符。
xml序列化,使用<>進(jìn)行數(shù)據(jù)位的匹配,再由字段名進(jìn)行數(shù)據(jù)位的對(duì)照,和json格式差不多,但是對(duì)照的字段名一般長度是json的兩倍(因?yàn)?lt;name></name>,name一般出現(xiàn)2次)。
其他序列化也需要用字段名來實(shí)現(xiàn)對(duì)照。
因此這里8583以2-3個(gè)字節(jié)實(shí)現(xiàn)所有字段與schema的對(duì)照,在大小方面有強(qiáng)大的優(yōu)勢。
3.數(shù)據(jù)存在可以壓縮的可能,壓縮雖然可以減少數(shù)據(jù)的大小,但是會(huì)增加轉(zhuǎn)換過程的時(shí)間。此處沒有強(qiáng)制要求,打平。
可以承認(rèn),8583使用的位圖對(duì)照策略是一個(gè)優(yōu)秀的設(shè)計(jì),但是它沒有被大量使用,莫非因?yàn)樗芯窒扌裕看鸢负糁觯?br>
是的,就是因?yàn)榫窒扌浴?/p>
銀行卡數(shù)據(jù)基本都是一層的結(jié)構(gòu),1-128個(gè)字段,字段里面很少再有嵌套。
而真實(shí)世界里面,很多數(shù)據(jù)結(jié)構(gòu)就是多層嵌套的,一個(gè)列表中某個(gè)元素是哈希表,哈希表中某個(gè)元素又可能是列表,這樣的情況,用一個(gè)簡單的位圖,是無法實(shí)現(xiàn)數(shù)據(jù)的對(duì)照的。
結(jié)論
在種種歷史原因,或規(guī)范的約束下,銀行卡用了iso8583作為傳輸?shù)臄?shù)據(jù)格式。
而從技術(shù)來看,由于銀行卡數(shù)據(jù)只有一層結(jié)構(gòu),使其可以使用位圖來實(shí)現(xiàn)數(shù)據(jù)的對(duì)照,從而減少數(shù)據(jù)的傳輸量。
但偏偏正是位圖的引入,使得銀行屆普遍喜愛所用xx域,yy域來表示一個(gè)字段的含義。
9527沒有資格讓人們記住他的名字,特工也喜歡用007代替自己的真名。
作為一個(gè)oo(面向?qū)ο螅┑闹С终撸娴南M?1域作為流水號(hào)能重見天日,然而這是一個(gè)習(xí)慣問題,而非技術(shù)問題,本人深感無力。