代码之家  ›  专栏  ›  技术社区  ›  LB40

不是常规语言的文本协议?

  •  3
  • LB40  · 技术社区  · 15 年前

    表示与文本网络协议相关联的语法的常用方法是使用abnf。

    就像任何与ebnf相关的元语法一样,abnf能够描述上下文无关的语法。

    这些上下文无关文法可以表示非正则语言,对吧?

    实现网络堆栈的通常方法是开发状态机。有没有不是正规语言的文本网络协议?

    1 回复  |  直到 15 年前
        1
  •  3
  •   JaakkoK    15 年前

    我想你指的是“传统的”基于行的文本协议。例如,任何使用xml的协议都不是正则的,因为xml不是正则语言(事实上,如果从单个字符的级别来看,xml甚至不是上下文无关的)。在这种情况下,我真的想不出任何非常规的协议。在语言语法中,最常见的非常规方法是要求解析器能够计数,而在我看来,一个需要这种能力来解析消息的协议将是复杂的(例如,匹配括号)或有限的(例如,通过显式计数而不是允许任意长的列表)。

    使用bnf可能是因为它作为语法描述很容易理解,而不是因为上下文自由给了您任何必要的额外能力。我认为,它的主要优点在于能够使用变量来表示常见的语法片段。如果您看看常见的Internet协议规范中的BNF,您会注意到它们实际上只使用常规语言的特性:无限重复、选择、可选性。

    在我看来,你提到协议的状态机实现听起来有些误解。它不是作为状态机实现的解析器,而是协议引擎,状态转换不是由输入中的单个字符或令牌触发的,而是由完整的消息触发的。通常,协议状态机中的状态与实际通信相比,更关心通信的建立和中断。例如,tcp状态机有11个状态,其中只有一个状态足以满足连接建立状态,这是所有实际数据传输发生的地方,其余的都是关于打开和关闭连接的。(是的,我知道TCP不是文本的,但是它是一个众所周知的协议,有一个已经建立的状态机,所以它是一个很好的例子;在协议引擎的层次上,消息语法是文本还是二进制并不重要。)