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协议由浅入深 的相关文章

  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • CoAP数据包的大小是多少?

    我是这项技术的新手 有人可以帮助我了解一些疑问吗 Q 1 CoAP数据包的大小是多少 我知道有 4 字节固定标头 但是包括标头 选项和负载在内的最大大小限制是多少 Q 2 有像MQTT那样的Keep Alive的概念吗 它在UDP上工作 它
  • “make install”将库安装在 /usr/lib 而不是 /usr/lib64

    我正在尝试在 64 位 CentOS 7 2 上构建并安装一个库 为了这个目的我正在跑步 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX usr DCMAKE C COMPILER
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 如果在等待“read -s”时中断,在子进程中运行 bash 会破坏 tty 的标准输出吗?

    正如 Bakuriu 在评论中指出的那样 这基本上与BASH 输入期间按 Ctrl C 会中断当前终端 https stackoverflow com questions 31808863 bash ctrlc during input b
  • 确定我可以向文件句柄写入多少内容;将数据从一个 FH 复制到另一个 FH

    如何确定是否可以将给定数量的字节写入文件句柄 实际上是套接字 或者 如何 取消读取 我从其他文件句柄读取的数据 我想要类似的东西 n how much can I write w handle n read r handle buf n a
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • 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 给接收器 逻辑如下 发送器 问 接收器可以接受什么类型的数据 接受器