Zmodem协议由浅入深

2023-11-10

Zmodem协议由浅入深(废话不多说直接解释)

1. 最简单的 ZMODEM 文件传输显示如下

例如:
发送器要发送:”爸爸的爸爸到底叫什么呀丫鸭压?” ----->>>>>给接收器

逻辑如下	
	发送器:问---接收器可以接受什么类型的数据
	接受器:回---我可以接收“xxx”这几种类型的数据
	发送器:发---文件名称、大小、日期....
	接收器:回---准备好接收文件了,发过来吧!(重传暂时不讨论)
	发送器:发---数据内容如--->>> “爸爸的爸爸+ZCRCG(结束符合)”
	发送器:发---数据内容如--->>> “到底叫什么+ZCRCG(结束符合)”
	发送器:发---数据内容如--->>> “呀丫鸭压?+ZCRCE (数据最后一个结束符合)”
	发送器:发---数据已经发完+ZEOF(数据最后一个结束符合)”
	接收器:回---收到,是否发送新文件?(ZACK和CRC通过)
	发送器:发---要终止会话
	接收器:回---同意终止

实际程序是这样的逻辑:

ZMODEM 发送器 ZMODEM 接收器 帧类型
发送器请求接收器发送它的初始化参数 ZRQINIT=0
接收器以提供它的大多数能力的帧进行响应 ZRINIT=1
发送器提供要传输文件的名称,以及关于长度和日期等可选数据 ZFILE=4
接收器请求文件数据再某个位置开始。对于新文件这一般是位置 0 ZRPOS=9
发送包含所有文件内容的单个数据帧。所有数据子包以 ZCRCG 结束,最后一个例外,它以 ZCRCE 结束 ZDATA=10
发送所有数据,并指明了文件尾 ZEOF=10
接收器指明已经准备好开始接收新文件 ZRINIT=1
发送器指明它要终止会话。如果发送器有更多文件要发送,它将再发送一个 ZFILE帧 ZFIN=8
接收器同意而连接中断 ZFIN=8

2. ZMODEM数据包格式

ZMODEM的帧:ZMODEM发送器和接收器之间传递的所有信息都包含在数据包中(在ZMODEM 中称数据包为帧),即使是简单的协议协议信息(比如确认信号)也在数据包中。

十六进制报头:
ZPAD ZPAD ZDLE B FrameType ZF3 ZF2 ZF1 ZF0 CRC1 CRC2 CR LF XON

1. ZPAD ZPAD ZDLE表示帧的开始
2. 字符 B 用于表示十六进制报头
3. frame-type表示帧类型 
4. ZF3 ZF2 ZF1 ZF0:是4个字节的信息,当帧类型不同时,它的含义也不同
5. CRC-1 CRC-2为校验码

注意:在 B 字符------------CR/LF/XON 序列之间,所有字符都是
十六进制编码的,这意味着每一个字节使用两个字符的可打印值。

/ 附录说明 / /

附录1、ZMODEM 帧类型

ZRQINIT=0:
当 ZMODEM 发送器启动时,它发送这种帧。它是请求接收器发送它的 ZRINIT帧,该帧将开始文件传输。ZRQINIT 帧头可用于在接收程序中触发一个自动下载。ZRQINIT 帧不发送任何数据子包。如果发送器试图发送一个命令给接收器,头字节 ZF0 包含常量 ZCOMMAND;否则它包含一个 0。

ZRINIT=1:
接收器发送这种帧以指明它准备好从发送器处接收文件。可以自发地发送它,或者应答 ZRQINIT 帧。这个帧具有 4 个字节地能力信息包装在报头中。ZF0 和 ZF1 的下列位可以进行设置和清除,这要取决于接收器的能力。
CANFDX=1:接收器具有确实的全双工操作,意味着它可以同时发送和接收数据。
CANOVIO=2:接收器在写磁盘时可以接收数据,要充分利用 ZMODEM 的流特性,就需要这种能力。
CANBRK=4: 接收器可以发送一个中断信号。
CANCRY=8: 接收器可以解码 RLE 帧。应用例中不支持这种能力(Omem Technology
可能把这种能力看做对 ZMODEM 的专有扩展)。
CANLZW=16: 接收器可以解压缩 UNIX 压缩式的数据。这种能力在应用例中不支持。
CANFC32=64: 接收器可以接受 CRC32,应用例不支持 CRC32。
ESCCTL=64: 接收器需要看到所有控制字符转换码,而不是仅 XON/XOFF 等少数几个。
ZF2 和 ZF3 包含接收器输入缓冲的尺寸。如果这个值是非零的就意味着接收器不能在完全的流模式中工作。相反,当它向磁盘写数据时,它将停止接收。

ZSINIT=2:
在处理 ZRINIT 帧后,这个帧可以被发送器有选择地发送给接收器。它提供给接收器一些信息而不管接收器的能力。两个位装入 ZF0。
TESCCTL=64: 此位用于指明发送器期望所有控制字符都进行转换
TESC8=128: 此位用于指明发送器期望转换 8 位。ZMODEM 没有完全实现这种能力,但包含在未来改进的规范中。仅有一个数据子包跟随在报头后面。这个子包包含不超过 32 个字符的字符串,以空字符终止。这个字符串用于在出错时唤醒发送器。

ZACK=3:
这种帧类型用于确认 ZSINT 和 ZCHALLENGE 帧,以及其后跟随 ZCRCQ 或ZCRCW 终止符的数据子包。如果应答是给 ZCHALLENGE 帧的,4 个报头标志字节由ZCHALLENGE 报头所发送的 4 个字节副本来填充。

ZFILE=4:
这种帧类型用于初始化实际的文件传输。它包含一个报头,后面跟随单个数据子包,子包包含文件信息。4 个报头字节中填入了与要传输文件有关的各种标志。ZF0 包含文件转换选项;ZF1 包含可选的管理选项;ZF2 具有传输选项;ZF3 包含扩充选项。这个帧考虑的选项最多,而且很少使用。对于我们的目的,在 ZFILE 帧中传送的重要项是文件名称、长度及可选的日期。在此详细说明选项的其余部分是为了完整性。

附录2、ZF0 转换选项

ZF0 可以设置为下列值之一,它们指明存储文件数据时使用的转换方法。

ZCBIN=1:
二进制传输,数据不需要转换。

ZCNL=2:
使用本地约定转换接收行的结尾。这个选项在 UNIX 和 MS-DOS 之间发送 ASCII文件是有用的。

ZCRESUM=3:
从中断的文件传输中恢复。接收器检查目标文件是否比发送的文件短。若是,文件传输可在异常终止的地方重新开始。

附录3、ZF1 管理选项

ZF1 可以设置为以下的数值。
¾ ZMNEW=1: 只有在源文件更新或更长时覆盖目标文件。
¾ ZMCRC=2: 对比源文件和目标文件的 CRC。如果数值相同,传输文件,否则跳过传输。
¾ ZMAPND=3: 把源文件追加到目标文件。
¾ ZMCLOB=4: 如果目标文件存在,则无条件的覆盖目标文件。
¾ ZMSPARS=5: 如果目标文件存在,只有文件比较新才覆盖目标文件。
¾ ZMDIFF=6: 如果目标文件存在,只有文件的长度或日期不同才覆盖目标文件。
¾ ZMPROT=7: 这个选项与 ZMCLOB 相对。它告诉接收器只有在目标文件不存在时才传输文

附录4、ZF2 传输选项

ZF2 可以设置为以下的数值。
ZTLZW=1: 要传输的数据经过 UNIX 压缩程序压缩的。在应用例中不支持这个选项。
ZTRLE=3: 数据是使用 Run Length Encoding 压缩的。通过创建专用的 RLE 帧,在 ZMODEM后来的版本中,这部分规范被取代。丢失的选项 2 属于 ZTCRYPT,是在最初的 ZMODEM 规范中定义,但从未实现的加密选项。

附录5、ZF3 扩展选项

ZF3 是位图,其中由条件的设置了扩充选项。在 ZMODEM 规范中定义的唯一选项是
ZTSPARS 选项,它考虑到对“稀疏文件”的特殊处理。这个选项在 ZMODEM 规范中定义,但它很少得到过支持

如果对你有帮助,请给予作者一丝丝奖励
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zmodem协议由浅入深 的相关文章

  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • cdc_acm:无法设置 dtr/rts - 无法与 USB cdc 设备通信

    我试图使用 pic24fj128gb206 枚举 usb cdc 设备 设备似乎已正确枚举 但是当我将设备连接到 Linux PC 时 我从内核收到以下警告消息 cdc acm 1 8 1 6 7 1 0 failed to set dtr
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser
  • Linux下显卡内存使用情况

    Linux下有哪些工具可以监控显卡内存使用情况 NVIDIA 性能套件 http developer nvidia com content nvidia perfkit有Linux版本 可以实时监控各种显卡属性 包括显卡内存使用情况 显然
  • 具有多处理功能的 Python 代码无法在 Windows 上运行

    以下简单的绝对初学者代码在 Ubuntu 14 04 Python 2 7 6 和 Cygwin Python 2 7 8 上运行 100 但在 Windows 64 位 Python 2 7 8 上挂起 我使用另一个片段观察到了同样的情况
  • 从另一个 python 脚本获取返回信息

    我在 Linux 上 我有一个 python 脚本 我想从另一个 python 脚本调用它 我不想将其作为模块导入 为了一层安全性 现在为了学术练习 因为我想弄清楚这一点 我实际上想让一个脚本使用 os system 或另一个类似的函数 并
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu

随机推荐

  • java Web实现用户登录功能

    文章目录 一 纯JSP方式实现用户登录功能 一 实现思路 1 创建Web项目 2 创建登录页面 3 创建登录处理页面 4 创建登录成功页面 5 创建登录失败页面 6 编辑项目首页 三 测试结果 二 JSP Servlet方式实现用户登录功能
  • mysql清空表数据后如何让自增ID仍从1开始

    mysql清空表数据后如何让自增ID仍从1开始 也就是说如何重排auto increment 重排auto increment有2种方法 1 清空表时使用truncate命令 而不用delete命令 mysql gt truncate te
  • staruml怎么设置为中文_Ubuntu 系统设置为中文

    1 首先点击系统右上方倒三角 展开详细功能菜单 gt 点击 Settings gt 打开设置界面 2 设置界面左侧点击 Region Language 显示区域与语言设置面板 gt 点击 Manage Installed Languages
  • jenkins+allure,生成的allure报告打开空白

    问题 jenkins allure 生成的allure报告打开空白 分析过程 第一步 判断配置中的执行命令是否正确 命令行分析 cd auto INC MTISP CORE mtisp auto lqx 切换到我实际需要执行的包的路径下 D
  • K8S搭建以及使用

    组件 1 主机 Master 用于控制整个Kubernetes集群 2 节点 node 负责执行请求和分配所有任务的节点 3 容器集 Pod 部署在 node 节点上 且包至少含一个或多个容器 同一个容器集中的所有容器共享同一个IP地址 主
  • axes don‘t match array

    axis don t match array的问题 写一个神经网络进行图像分类 在读取数据的部分报错如下 1 numpy core exceptions UFuncTypeError Cannot cast ufunc subtract o
  • Linux(ubuntu)内容整理(常用命令)

    1 基础快捷键 命令 含义 ctrl c 强制停止 ctrl d 退出登出 histroy 查看历史命令 命令前缀 自动匹配上一个命令 ctrl r 搜索历史命令 ctrl a e 光标移动到命令开始或结束 ctrl 箭头 左右跳单词 ct
  • vue的学习与使用

    目录 基础语法 判断与循环v if v else for if for 事件 v on Vue双向绑定 Vue组件 计算属性 插槽 slot 自定义事件内容分发 创建一个vue程序 Webpack 什么是webpack 安装Webpack
  • 【VISIO安装问题】无法安装64位版本的office,因为在您的PC上找到以下32位程序

    无法安装64位版本的office 因为在您的PC上找到以下32位程序 当我们想要安装visio 64位程序的时候 我们的电脑提示这种错误 可能是我们电脑上32位 visio程序并未删除干净 直接卸载电脑上的32位visio程序有时候可能卸载
  • 严重: testWhileIdle is true, validationQuery not set ;使用连接池错误(无Spring框架,使用的JDK9,MYSQL8版本)

    在properties配置文件下添加一些配置 driverClassName com mysql cj jdbc Driver url jdbc mysql localhost 3306 javaweb userSSL true serve
  • C++ decltype用法详解

    1 什么是decltype decltype是C 11新增的一个关键字 和auto的功能一样 用来在编译时期进行自动类型推导 引入decltype是因为auto并不适用于所有的自动类型推导场景 在某些特殊情况下auto用起来很不方便 甚至压
  • Linux中grep函数的一些常见问题

    linux中grep 的详细用法已经有许多人介绍过了 本文是作者在学习过程中的总结和对原文中一些没有被提及或者含糊不清的概念的理解 一 grep概述 grep的全称是global regular expression print 即全局正则
  • 门子1200plc485 modbus rtu通讯,55条通讯,几百个数据,1s内完成

    门子1200plc485 modbus rtu通讯 55条通讯 几百个数据 1s内完成 最主要的是 别人的485要上升沿 还要写后面的完成和错误变量 又臭又长 我的 每条程序不用写上升沿 也不用管后面通讯的引脚 又快又省心 直接填写通讯地址
  • 云原生Kubernetes:pod基础与配置

    目录 一 理论 1 pod 2 pod容器分类 3 镜像拉取策略 4 pod 的重启策略 二 实验 1 Pod容器的分类 2 镜像拉取策略 三 问题 1 apiVersion 报错 2 pod v1版本资源未注册 3 格式错误 4 取行显示
  • Linux下安装Tomcat正常启动但是端口没有监听

    Linux下安装JDK1 7 然后安装Tomcat9 0 启动Tomcat端口没有监听 报错如下 Exception in thread main java lang UnsupportedClassVersionError org apa
  • 【火线解码】001.避免在finally语句块中使用return语句

    火线团队推出 火线解码 系列文章 每一篇解释一种不规范的代码写法 用较短的篇幅让大家快速的了解代码规范问题 001 避免在finally语句块中使用return语句 错误的代码示例 public class Bar public Strin
  •  Kaggle基本知识

    目录 Kaggle介绍 1 基本情况 2 含金量 部分Kaggle题目 kaggle的比赛类型选择 1 面向初学者 2 面向竞赛者 3 面向求职者 4 其他比较冷门的比赛类型 建议 申请Kaggle项目 1 项目导师背景 2 项目进阶分级
  • Task4 基于深度学习的文本分类

    fastText模型的输入是一个词的序列 一段文本或者一句话 输出是这个词序列属于不同类别的概率 在序列中的词和词组构成特征向量 特征向量通过线性变换映射到中间层 再由中间层映射到标签 fastText在预测标签时使用了非线性激活函数 但在
  • HTML <tbody> 标签

    实例 带有 thead tbody 以及 tfoot 元素的 HTML 表格 table border 1 thead tr th Month th th Savings th tr thead tfoot tr td Sum td td
  • Zmodem协议由浅入深

    Zmodem协议由浅入深 废话不多说直接解释 1 最简单的 ZMODEM 文件传输显示如下 例如 发送器要发送 爸爸的爸爸到底叫什么呀丫鸭压 gt gt gt gt gt 给接收器 逻辑如下 发送器 问 接收器可以接受什么类型的数据 接受器