3

表示與文本網絡協議相關的語法的常用方式是使用ABNF。不是常規語言的文本協議?

就像任何EBNF相關的元語法一樣,ABNF能夠描述上下文無關文法。

這些上下文無關的語法可以代表一種非常規的語言,對吧?

實現網絡堆棧的通常方法是開發一個狀態機。是否有任何不是常規語言的文本網絡協議?

回答

3

我想你是指「傳統的」基於行的文本協議。例如,使用XML的任何協議都不是常規的,因爲XML不是常規語言(實際上,如果您查看單個字符的級別,則XML甚至不是上下文無關的)。在那種情況下,我無法真正想到任何非常規協議。在語言語法中使用非常規的最常見方法是要求解析器能夠進行計數,並且在我看來,需要這種解析消息能力的協議將會很複雜(例如,匹配括號)或有限的(例如,通過明確的計數而不是允許任意長的列表)。

使用BNF可能是因爲它很容易理解爲語法描述,而不是因爲上下文自由給你任何必要的額外能力。我認爲,主要的好處是能夠使用變量來代表常見的語法片段。如果你看看通用互聯網協議規範中的BNF,你會注意到它們只是使用常規語言的特性:無限的重複,選擇,選擇性。

你的聲明指的是協議的狀態機實現,聽起來像是一些誤解。它不是作爲狀態機實現的分析器,而是協議引擎,並且狀態轉換不是由輸入中的單個字符或令牌觸發的,而是由完整的消息觸發的。通常,協議狀態機中的狀態比實際通信更關心通信的建立和拆除。例如,TCP狀態機有11個狀態,其中只有一個狀態足夠建立連接狀態,這是所有實際數據傳輸發生的地方,其餘都是關於打開和關閉連接。 (是的,我知道TCP不是文本的,但它是一個有着成熟狀態機的着名協議,所以它是一個很好的例子;在協議引擎層面,消息語法是文本還是無關緊要二進制)。