kermit 协议
控制字符
ASCII中有33个拥有特殊含义的ASCII字符:0~31 127,这些字符对传输可能是有害的,例如:
0x03 可能被远端系统解析为 Ctrl+C (^C),这样会结束掉远端的接收进程
0x13 可能被远端系统解析为 XOFF 导致软件流控被触发
为了可以在非严格RAW模式(系统没有取消控制字符特殊含义)的链路上使用,kermit会在包中将这些特殊字符编码为可见的ASCII编码。
7bit模式
kermit有7bit的链路通信的可选支持
优点:
- 可以工作在bit7无法正确传输的链路(波特率不匹配,线路嘈杂)
- 可以工作在只支持ASCII可打印字符的链路
缺点:
- 如果第八位被设置,则需要多一个字符用于标识
校验
校验用于保证包的正确,kermit basic packet包含一个字节的累加校验,接收的时需要将接收到的字节累加。
起始符
kermit一般会在报文开始的时候发送一个SOH作为起始符,远端系统在遇到起始符的情况下开始接收报文。
如果链路中SOH有特殊含义,可以更换别的起始符。
如果链路有明显的消息分割机制,则可以省去起始符,例如使用USB进行通信。
流控
没有硬件或软件流控的情况下,kermit也可以正常工作
如果有软件流控,可能需要在开始传输和结束传输的时候发送XON/XOFF
长度
kermit中有一个字节用于标识包的长度,接收的时候可以将长度放在寄存器中,然后根据接收内容进行累减,直到0为止。
ACK NACK
ACK和NACK用于远端回复,如果包被远端接受,则回复ACK,否则回复NACK,如果收到NACK,则需要重传,或更改参数
另一种情况是传输超时,远端会回复一个NACK,然后本地进行报文重新发送。
类型
kermit有一个字节用于标识包类型:
’S’: 初始化传输参数,会在DATA中包含传输参数,例如最大包size ’Y’: ACK ’N’: NACK ’D’: 代表DATA中包含的是文件数据
顺序
为了解决重传检测问题,kermit包中有一个字节的顺序标识,可以用于检测重复的包。
协商
kermit支持协议协商,以下是几个场景:
通信链路不支持8bit传输,需要协商为7bit模式
计算机内存太小,需要协商最大包长度
通信链路嘈杂,需要协商包长度(更小的包),和超时设置(更激进的重传策略)
TODO TODO
TODO