把 0800 按位拆开(MTI 速查工具可以代劳):版本 0(ISO 8583:1987)、消息类 8(网络管理)、功能 0(请求)、来源 0。0810 就是功能位翻成 1 的响应。谁来发起由接口规范定 —— 通常是主动建链的一方(收单机构或处理方)发 0800、主机回 0810,但不少主机也会反向发自己的 0800,一条链路上双向都可能有。
报文本体小得出奇:典型的 0800 只带传输时间戳(DE 7)、系统跟踪号(DE 11)、网络管理信息码(DE 70),按规范可能再加 DE 32/33 机构标识,或密钥交换用的安全域。0810 原样回传请求里的 DE 7 和 DE 11,再补一个 DE 39 响应码。没有卡号、没有金额、没有商户 —— 消息类 8 是整条链路上唯一不碰账务的一类报文。
新人最容易栽的坑在这里:MTI 几乎什么都没告诉你。签到、签退、心跳、换密钥、截账 —— 所有网络管理请求共用同一个 0800。真正区分操作的是 DE 70,三位数字的网络管理信息码(NMIC)。可以把 0800 当信封、DE 70 当动词:听到「对面发来一条 0800」,第一句追问永远是「DE 70 是多少?」。
| 操作 | 常见取值 | 作用 |
|---|---|---|
| 签到(sign-on) | 001 | 「我准备好收交易了。」TCP 通了之后打开逻辑会话;有的按机构签、有的按业务签。 |
| 签退(sign-off) | 002 | 计划性下线:「别再往我这儿路由了。」体面的告别,区别于直接掐断 socket。 |
| 密钥交换 | 101(1xx 段) | 轮换工作密钥(PIN 密钥、MAC 密钥)。新密钥装在哪个安全域各家不同 —— DE 48、DE 96、DE 120 都有。 |
| 截账(cutover) | 201(2xx 段) | 营业日切换:这条之后的交易记到下一个清算日。链路不断,只挪账务边界。 |
| 回声测试 / 心跳 | 301(3xx 段) | 「你还在吗?」不改任何状态,唯一使命是证明链路和对端应用都活着。 |
061/062 表示签到签退,有的把 1xx 段细分成好几步密钥流程,有的干脆把操作类型放到别的域里。类别是通用的,数字不是。具体码值一律以你对端的接口规范为准,在一条链路上背熟的码,换一条链路千万别默认还是那个意思。下面是一条格式完整的签到请求,按 ASCII 文本书写:
0800 8220000000000000 0400000000000000 0809083000 000001 001
| 分段 | 取值 | 含义 |
|---|---|---|
| MTI | 0800 | 网络管理请求 |
| 主位图 | 8220000000000000 | 置位 1、7、11 |
| 副位图 | 0400000000000000 | 置位 70 |
| DE 7 | 0809083000 | 传输日期时间:8 月 9 日 08:30:00 |
| DE 11 | 000001 | STAN —— 当天第一个跟踪号 |
| DE 70 | 001 | NMIC:签到(以本链路规范为准) |
两个细节值得停一下。第一,位图稀疏得可爱 —— 总共三个数据域,拿来练手工读位图再合适不过(可以去位图计算器反向拼一遍)。第二,DE 70 排在第 70 位,过了 64 —— 每条网络管理报文都要为这一个孤零零的域拖上一张副位图,这就是主位图第 1 位置位、位图长 32 个十六进制字符而非 16 个的原因。把整行贴进主解析器,解出来的正是这四个域。
对应的响应多一个 DE 39,主位图第 39 位随之置位(变成 8220000002000000):
0810 8220000002000000 0400000000000000 0809083000 000001 00 001
DE 39 = 00 表示签到被接受;其余值都是拒绝,具体原因查 DE39 响应码工具。
为什么非要心跳?因为闲置的 TCP 连接会撒谎。防火墙和 NAT 会悄悄回收空闲映射,半开的 socket 在没察觉断开的一侧看起来一切正常 —— 直到一笔真实授权发进虚空。回声测试的意义就是让链路早死早发现,而不是死在最要命的时刻。
大多数链路上的工程惯例:
图里最容易被忽略的一条边是截账的自环:营业日切换发生在就绪态内部,不断链、不重签,动的只是清算日的边界。
网络管理报文和交易报文用同一个 DE 11 号段,响应靠同一条连接上的 DE 11(加 DE 7)配回请求。这让 STAN 纪律成了联调第一天的问题:发心跳的和发交易的往往是两个组件 —— 共用号段又不加协调,或者各自都从 000001 起跳,配对窗口内就会撞号。症状极折磨人:「0810 回来了,但对不上任何在途请求」,更糟的是回声的响应被配给了一笔交易。解法无聊但绝对:每条连接只留一个发号器,计数器落盘、重启不清零,请求在途时绝不复用它的 STAN。完整讨论见《STAN 和 RRN 有什么区别?》。
0800 发出去,什么都不回。从下往上查。TCP 到底建没建上,是不是半开?长度头对不对 —— 2 字节二进制还是 4 位 ASCII、算不算自身?长度前缀报大了,主机就一直在等它以为还没到的字节。再查编码:对端要 EBCDIC 或 BCD 而你发了 ASCII,后面所有域边界全歪。多数主机对切不出帧的报文不吭声直接丢 —— 先抓原始字节,拿自己的长度前缀数一遍,再考虑怪对面。
0810 回了,但 DE 39 不是成功。这是好消息:分帧、编码、连通性都证明完毕,剩下的是内容问题。30(格式错误)指向某个主机不认的域;DE 32/33 机构号对不上是最经典的签到被拒;回声被答「尚未签到」说明你跳了步骤。码值去 DE39 查询工具查,但记住:网络管理响应常用规范自定义的子集。
心跳全绿,交易却超时。最有教学价值的一种。回声只能证明 socket 和对端前置活着,仅此而已。授权走得远得多:过路由、进授权主机、有时还要出去找发卡方。心跳绿灯加交易全灭,说明问题出在应答回声的组件之后:网关背后的主机宕了、路由表少了你的 BIN 段、签到范围没覆盖交易业务;也可能是 0200 有 0800 暴露不出的格式问题 —— 交易报文用到的域和编码多得多。无论哪种,别再盯着链路层:链路没病。