kermit 协议

控制字符

ASCII中有33个拥有特殊含义的ASCII字符:0~31 127,这些字符对传输可能是有害的,例如:

0x03 可能被远端系统解析为 Ctrl+C (^C),这样会结束掉远端的接收进程

0x13 可能被远端系统解析为 XOFF 导致软件流控被触发

为了可以在非严格RAW模式(系统没有取消控制字符特殊含义)的链路上使用,kermit会在包中将这些特殊字符编码为可见的ASCII编码。

7bit模式

kermit有7bit的链路通信的可选支持

优点:

  1. 可以工作在bit7无法正确传输的链路(波特率不匹配,线路嘈杂)
  2. 可以工作在只支持ASCII可打印字符的链路

缺点:

  1. 如果第八位被设置,则需要多一个字符用于标识

校验

校验用于保证包的正确,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

Last updated: 2024-08-29