之前说过的T=0协议,基本上相当于是透明的数据,也就是说从应用的角度看,通过T=0传递的TPDU数据信息大都可以直接转换为对应的APD命令响应数据,“字节”是T=0协议最小的数据传输单元。
对于T=1协议而言,最小的数据传输单元是“数据块”,这个数据块由若干个字节组成,其中有些字节是必须的,有些字节是可选的。每个数据块最多可以包含多少个字节(也就是数据块的大小)可以通过三种途径确定:
1)ATR中对应协议T=1的专有接口字节指出;
2)使用默认的值;
3)在数据传输过程中协商。
一个数据块其实就是一个“数据包”,其中包头的3个字节(NAD 1字节 + PCB 1字节 + LEN 1字节)和包尾1个或者2个字节(如果采用LRC校验就是 1字节,采用CRC校验就是 2字节)是必须的,中间的信息数据域INF则是可选的。其中NAD代表节点地址,基本不用,可以设置为“00”;PCB代表协议控制字节,用来指明数据块的类型(分为:传递信息域数据的I-块,应答响应的R-块,负责通讯参数协商的S-块)、序列号、是否存在后续的链接块、是否有校验错误、额外超时等待请求、信息数据域大小的协商等。
和T=0协议最明显的不同是,T=1协议按照OSI的参考模型进行了分层,分别是:物理层、数据链路层和应用层。物理层主要是数据字符的传输,数据链路层主要是数据块的传输,而应用层主要是APDU的交互传输。APDU的交互与数据字符的传输,这些和T=0协议里面描述的大体相同,关键的就是数据链路层定义的数据块传输。因为这个数据链路层的定义,使得T=1协议基本具备了可以实现复杂网络数据传输的全部特征,相比而言T=0协议简直就等同于“裸传”了。
数据链路层主要进行的是3类数据块的交互传输,基本的原则是:第一个数据块一定是从终端发给卡片的I-块或者S-块;I-块可以用R-块或者I-块来应答,而S-块的请求只能用S-块的响应来应答;I块和R-块会包含有“0”和“1”的序列号,序列号的初始值为“0”,重新同步之后也是再次从“0”开始,之后在“0”和“1”之间交替切换;如果一条应用数据大于数据块信息域的最大长度,则需要分割为若干个链接的数据块来传输;和T=0协议卡片发送“0x60”类似,如果卡片需要较长时间进行命令处理,可以用延长等待时间的WTX请求S-块让终端继续等待;一旦传输过程中出现错误,可以通过数据块重发、重新同步、卡片复位等动作来进行纠错。
对于各种正常和异常数据传输的处理,7816定义了若干的规则(rules)明确而详细地说明了终端和卡片在数据块传输过程中应该遵循的流程。
在实际应用中,接触式卡片遵循7816 T=1协议的不是很多,但是非接触的14443 T=CL协议,在数据传输方面和7816的T=1协议如出一辙,而且在检测过程中,最容易出现软件问题的地方也正是非接触协议这部分。