gpt4 book ai didi

protocols - 理解ZMODEM协议(protocol)

转载 作者:行者123 更新时间:2023-12-02 19:35:37 26 4
gpt4 key购买 nike

我需要在我的程序中包含基本的文件发送和文件接收例程,并且需要通过 ZMODEM 协议(protocol)。问题是我无法理解规范。

供引用,here is the specification .

规范没有定义各种常量,所以这里是 a header file from Google .

在我看来,该文档中有很多重要的事情没有定义:

  • 它经常提到 ZDLE 编码,但它是什么?我到底什么时候使用它,什么时候不使用它?
  • 在 ZFILE 数据帧之后,将传输文件的元数据(文件名、修改日期、大小等)。这之后是一个 ZCRCW 块,然后是一个根据规范未定义类型的块。 ZCRCW 块据称包含一个 16 位的 CRC,但规范没有定义 CRC 的计算数据。
  • 它没有定义它使用的 CRC 多项式。我偶然发现 CRC32 poly 是标准的 CRC32,但我对 CRC16 poly 没有这样的运气。没关系,我是通过反复试验找到的。 CRC16 poly 是 0x1021。

  • 我环顾四周寻找引用代码,但我能找到的只是 90 年代初的不可读、未记录的 C 文件。我还从 MSDN 中找到了这组文档,但它与我运行的测试非常模糊和矛盾: http://msdn.microsoft.com/en-us/library/ms817878.aspx (您可能需要通过 Google's cache 查看)

    为了说明我的困难,这里有一个简单的例子。我在服务器上创建了一个包含“Hello world!”的纯文本文件,它被称为 helloworld.txt。

    我使用以下命令从服务器启动传输:
    sx --zmodem helloworld.txt

    这会提示服务器发送以下 ZRQINIT 帧:
    2A 2A 18 42 30 30 30 30 30 30 30 30 30 30 30 30   **.B000000000000
    30 30 0D 8A 11 00.Š.

    与此有关的三个问题:
  • 填充字节 (0x2A) 是任意的吗?为什么这里有两个,但在其他情况下只有一个,有时没有?
  • 规范最后没有提到 [CR] [LF] [XON],但 MSDN 文章中提到了。为什么会在那里?
  • 为什么 [LF] 设置了位 0x80?

  • 在此之后,客户端需要发送一个 ZRINIT 帧。我从 MSDN 文章中得到了这个:
    2A 2A 18 42 30 31 30 30 30 30 30 30 32 33 62 65   **.B0100000023be
    35 30 0D 8A 50.Š

    除了 [LF] 0x80 标志问题,我还有两个问题:
  • 为什么这次没有包含 [XON]?
  • CRC 是根据二进制数据还是 ASCII 十六进制数据计算的?如果它在二进制数据上,我得到 0x197C,如果它在 ASCII 十六进制数据上,我得到 0xF775;这些都不是框架中的实际内容(0xBE50)。 (已解决;它遵循您使用的任何模式。如果您处于 BIN 或 BIN32 模式,则它是二进制数据的 CRC。如果您处于 ASCII 十六进制模式,则它是由 ASCII 十六进制字符表示的内容的 CRC .)

  • 服务器以 ZFILE 帧响应:
    2A 18 43 04 00 00 00 00 DD 51 A2 33               *.C.....ÝQ¢3

    好的。这个有道理。如果我计算 [04 00 00 00 00] 的 CRC32,我确实得到 0x33A251DD。但是现在我们最后没有任何 [CR] [LF] [XON]。为什么是这样?

    在此帧之后,服务器还会立即发送文件的元数据:
    68 65 6C 6C 6F 77 6F 72 6C 64 2E 74 78 74 00 31   helloworld.txt.1
    33 20 32 34 30 20 31 30 30 36 34 34 20 30 20 31 3 240 100644 0 1
    20 31 33 00 18 6B 18 50 D3 0F F1 11 13..k.PÓ.ñ.

    这甚至没有标题,它只是直接跳转到数据。好吧,我可以忍受。然而:
  • 我们有了第一个神秘的 ZCRCW 帧:[18 6B]。这个框架有多长? CRC数据在哪里,是CRC16还是CRC32?它没有在规范中的任何地方定义。
  • MSDN 文章指定 [18 6B] 后面应该跟 [00],但事实并非如此。
  • 然后我们有一个未定义类型的框架:[18 50 D3 0F F1 11]。这是一个单独的框架还是 ZCRCW 的一部分?

  • 客户端需要使用 ZRPOS 帧进行响应,再次取自 MSDN 文章:
    2A 2A 18 42 30 39 30 30 30 30 30 30 30 30 61 38   **.B0900000000a8
    37 63 0D 8A 7c.Š

    与 ZRINIT 帧相同的问题:CRC 错误,[LF] 设置了位 0x80,并且没有 [XON]。

    服务器以 ZDATA 帧响应:
    2A 18 43 0A 00 00 00 00 BC EF 92 8C               *.C.....¼ï’Œ

    与 ZFILE 相同的问题:CRC 一切正常,但 [CR] [LF] [XON] 在哪里?

    在此之后,服务器发送文件的有效负载。由于这是一个简短的示例,因此它适合一个块(最大大小为 1024):
    48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0A            Hello world!.

    从文章似乎提到的内容来看,payload 是用 [ZDLE] 转义的。那么我如何传输一个恰好与 [ZDLE] 的值匹配的负载字节呢?还有其他类似的值吗?

    服务器以这些帧结束:
    18 68 05 DE 02 18 D0                              .h.Þ..Ð
    2A 18 43 0B 0D 00 00 00 D1 1E 98 43 *.C.....Ñ.˜C

    我完全迷失在第一个。第二个与 ZRINIT 和 ZDATA 帧一样有意义。

    最佳答案

    我的 friend 想知道你是否正在实现时间
    机器。

    我不知道我能回答你所有的问题——我从来没有
    实际上必须自己实现 zmodem - 但这里有几个答案:

    From what the article seems to mention, payloads are escaped with [ZDLE]. So how do I transmit a payload byte that happens to match the value of [ZDLE]? Are there any other values like this?



    这在您链接到的文档中明确说明
    你的问题的开头,上面写着:
    The ZDLE character is special.  ZDLE represents a control sequence
    of some sort. If a ZDLE character appears in binary data, it is
    prefixed with ZDLE, then sent as ZDLEE.

    It constantly refers to ZDLE-encoding, but what is it? When exactly do I use it, and when don't I use it?



    在过去,某些“控制字符”被用来控制
    沟通 channel (因此得名)。例如,发送 XON/XOFF
    字符可能会暂停传输。 ZDLE用于逃逸
    可能有问题的字符。根据规范,这些是
    默认转义的字符:
    ZMODEM software escapes ZDLE, 020, 0220, 021, 0221, 023, and 0223.
    If preceded by 0100 or 0300 (@), 015 and 0215 are also escaped to
    protect the Telenet command escape CR-@-CR. The receiver ignores
    021, 0221, 023, and 0223 characters in the data stream.

    I've looked around for reference code, but all I can find are unreadable, undocumented C files from the early 90s.



    这是否包括 lrzsz 的代码?包裹?这还是
    在大多数 Linux 发行版上广泛可用(而且非常方便
    用于通过已建立的 ssh 连接传输文件)。

    还有许多其他实现,包括
    几个在 freecode 上列出的软件中,包括 qodem ,
    syncterm , MBSE , 和别的。相信 synctermimplementation被写成可能合理容易的库
    从您自己的代码中使用(但我不确定)。

    如果您浏览较旧的集合,您可能会找到其他代码
    MS-DOS 软件。

    关于protocols - 理解ZMODEM协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9611000/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com