本文轉自:https://www.bbsmax.com/A/l1dyxrEA5e/ ,支持原創(chuàng),傳播知識,僅供學習自用。
之前說過的T=0協(xié)議,基本上相當于是透明的數(shù)據,也就是說從應用的角度看,通過T=0傳遞的TPDU數(shù)據信息大都可以直接轉換為對應的APD命令響應數(shù)據,“字節(jié)”是T=0協(xié)議最小的數(shù)據傳輸單元。
對于T=1協(xié)議而言,最小的數(shù)據傳輸單元是“數(shù)據塊”,這個數(shù)據塊由若干個字節(jié)組成,其中有些字節(jié)是必須的,有些字節(jié)是可選的。每個數(shù)據塊最多可以包含多少個字節(jié)(也就是數(shù)據塊的大?。┛梢酝ㄟ^三種途徑確定:
1)ATR中對應協(xié)議T=1的專有接口字節(jié)指出;
2)使用默認的值;
3)在數(shù)據傳輸過程中協(xié)商。
一個數(shù)據塊其實就是一個“數(shù)據包”,其中包頭的3個字節(jié)(NAD 1字節(jié) + PCB 1字節(jié) + LEN 1字節(jié))和包尾1個或者2個字節(jié)(如果采用LRC校驗就是 1字節(jié),采用CRC校驗就是 2字節(jié))是必須的,中間的信息數(shù)據域INF則是可選的。其中NAD代表節(jié)點地址,基本不用,可以設置為“00”;PCB代表協(xié)議控制字節(jié),用來指明數(shù)據塊的類型(分為:傳遞信息域數(shù)據的I-塊,應答響應的R-塊,負責通訊參數(shù)協(xié)商的S-塊)、序列號、是否存在后續(xù)的鏈接塊、是否有校驗錯誤、額外超時等待請求、信息數(shù)據域大小的協(xié)商等。
和T=0協(xié)議最明顯的不同是,T=1協(xié)議按照OSI的參考模型進行了分層,分別是:物理層、數(shù)據鏈路層和應用層。物理層主要是數(shù)據字符的傳輸,數(shù)據鏈路層主要是數(shù)據塊的傳輸,而應用層主要是APDU的交互傳輸。APDU的交互與數(shù)據字符的傳輸,這些和T=0協(xié)議里面描述的大體相同,關鍵的就是數(shù)據鏈路層定義的數(shù)據塊傳輸。因為這個數(shù)據鏈路層的定義,使得T=1協(xié)議基本具備了可以實現(xiàn)復雜網絡數(shù)據傳輸?shù)娜刻卣?,相比而言T=0協(xié)議簡直就等同于“裸傳”了。
數(shù)據鏈路層主要進行的是3類數(shù)據塊的交互傳輸,基本的原則是:第一個數(shù)據塊一定是從終端發(fā)給卡片的I-塊或者S-塊;I-塊可以用R-塊或者I-塊來應答,而S-塊的請求只能用S-塊的響應來應答;I塊和R-塊會包含有“0”和“1”的序列號,序列號的初始值為“0”,重新同步之后也是再次從“0”開始,之后在“0”和“1”之間交替切換;如果一條應用數(shù)據大于數(shù)據塊信息域的最大長度,則需要分割為若干個鏈接的數(shù)據塊來傳輸;和T=0協(xié)議卡片發(fā)送“0x60”類似,如果卡片需要較長時間進行命令處理,可以用延長等待時間的WTX請求S-塊讓終端繼續(xù)等待;一旦傳輸過程中出現(xiàn)錯誤,可以通過數(shù)據塊重發(fā)、重新同步、卡片復位等動作來進行糾錯。
對于各種正常和異常數(shù)據傳輸?shù)奶幚恚?816定義了若干的規(guī)則(rules)明確而詳細地說明了終端和卡片在數(shù)據塊傳輸過程中應該遵循的流程。
在實際應用中,接觸式卡片遵循7816 T=1協(xié)議的不是很多,但是非接觸的14443 T=CL協(xié)議,在數(shù)據傳輸方面和7816的T=1協(xié)議如出一轍,而且在檢測過程中,最容易出現(xiàn)軟件問題的地方也正是非接觸協(xié)議這部分。