Telnet 请求“DO”和“WILL”有何不同?

网络工程 协议理论 射频卡
2021-07-24 04:34:25

我正在使用RFC 854实现 Telnet 客户端
我看了一下negotation语法(DOWILLWON'T等)和我通过这一段困惑:

总之,WILL XXX由任何一方发送,以表明该
方希望(要约)开始执行选项XXXDO XXX
DON'T XXX作为其肯定和否定的确认;类似地, DO XXX发送表示希望(请求)另一方
(即 的接收者DO)开始执行选项XXXWILL XXXWON'T XXX作为肯定和否定确认。由于 NVT 是未启用任何选项时剩下的内容,因此DON'T
WON'T响应保证使连接处于
两端都可以处理的状态
因此,所有主机都可以实现他们的
TELNET 进程以完全不知道那些不知道的选项。
支持,简单地向(即拒绝)任何
无法理解的选项请求返回拒绝

(添加了重点和代码格式化程序。)

我有两个问题,每个强调的句子一个:

  1. WILLDO请求有什么区别它们显然可以被任何一方使用(“[...]WILL XXX由任何一方发送的,由任何一方[...]”),它们的区别仅在于他们的“欲望 [s]”是对前者和梯子的“请求”。但有什么区别呢?我在 RFC 中搜索了“要约”以获取更多信息,但它只出现了一次。

  2. 我不明白第二句中的推理(“因为当没有启用任何选项时,剩下的就是 NVT [...]”)。我以为NVT(Network Virtual Terminal)是对具体终端的抽象,那么Telnet协议就不用担心两边具体终端的怪癖了吧?那怎么可能“离开”呢?这意味着它可以通过 Telnet 选项进行扩充,但我根本不明白这意味着什么。

2个回答

WILLDO请求有什么区别

这里涉及一个非常重要的概念,您在实现 Telnet 服务器或客户端时需要了解它,否则您的实现可能会以相当奇怪的方式出现错误行为:

可以协商的每个编号选项实际上都有两组独立的状态与之关联 - 一组状态与从(您正在实施的应用程序,无论是客户端还是服务器)到对等方(通信伙伴的通信相关联位于线路的另一端,无论是服务器还是客户端),另一组状态与从对等方的相反通信方向相关联

如果您想防止协商循环和用户的不良行为,必须独立地保持和处理这两组状态。

所涉及的两组状态之间可能存在一些互操作,具体取决于选项的作用(您应该阅读您打算支持的每个选项的特定 RFC),但您最好在更高的抽象级别上实现它。两个方向的基本选项协商需要是独立的。

我们以选项 0TRANSMIT-BINARY为例。一组状态是关于是否将使用所有 8 位(二进制)向对等方发送字节,另一组是关于对等方是否将向发送二进制文件所有 4 种组合都是可能的(7 位和对等7 位,二进制和对等7 位,7 位和对等二进制,二进制和对等二进制)并且改变一个方向的选项不会(直接) 为另一个方向更改相同的选项。

  • 如果发送一个IAC WILL TRANSMIT-BINARY,则您在谈论从到对等方的方向,并且您实际上是在要求对方允许您发送二进制文件。同行可以回答任何DODONT

  • 如果发送一个IAC DO TRANSMIT-BINARY,您实际上是在谈论从对等方的方向,并且您实际上是在要求对方开始传输二进制文件(如果它能够并愿意)。同行可以回答任何WILLWONT

  • 但是,如果对等方发送一个IAC WILL TRANSMIT-BINARY(而不是您发送它),它正在谈论从对等方的方向,并且实际上是在要求允许它发送二进制文件。可以回答DODONT

  • 类似地,如果对等方发送IAC DO TRANSMIT-BINARY,它在谈论从到对等方的方向,并且如果您能够并且愿意,它实际上是在要求开始传输二进制文件。可以回答WILLWONT

对于用WONT发起的请求也可以说类似的事情DONT,重要的区别是对这些请求的唯一允许的回复分别DONTWONT这意味着选项可以随时关闭(而打开它们需要双方同意)。

您可能需要阅读RFC 1143,它提出了一种实现协商和相关状态集的方法。

关于的意思 NVT

他们在那里谈论的NVT是一组基本回退属性和行为的规范。即,如果所有可协商的选项都关闭(它们需要在连接开始时关闭,如果某些在会话期间打开,您可以再次关闭它们,如果您愿意的话),您所拥有的是最小的一组定义的行为,你剩下的功能指定为NVT

打开选项与指定的基本不同NVT

这一切意味着,任一端都可以拒绝打开任何选项,然后按照相关 RFC 中网络虚拟终端指定的相同方式行事,并且可以充分确定另一端支持该操作模式以某种方式(因为标准中要求关闭任何和所有选项的操作)。

你送WILL,如果你想开始执行的东西,你送DO,如果你想在另一端开始执行的东西。把它想象成I WillYou DO

NVT 是两侧端子的共同点。如果一侧可以做132的线长,而另一侧只能做80的线长,那么双方就可以达成一致,做80的线长,因为双方都可以做到。可以做 132 的一方会向只能做 80 的一方发送 aWILL或 a DO,但它随后会收到否定的响应。能做 80的一方可以向能做 132 的一方发送WILLDO,并且它应该收到肯定的响应,因为能做 132 的一方也可以做 80。

在实施此更新时不要忘记支持更新 ( RFC 5198 )。