用簡單協定傳送不重要的資料很容易想像,但要傳送更複雜、更重要的資料就需要一些說明。例如一個能傳送多種結構的協定,必須有辦法表示某個結構的邊界與型別。

其中一種做法是標籤-長度-值(tag-length-value, TLV)模式。

欄位角色
Tag(標籤)代表協定所傳送資料的型別,通常是數值(多半來自一組列舉值)。但 Tag 也可以是任何能為資料結構提供唯一樣式的東西。
Length(長度)值的長度,本身是變長值。
Value(值)實際資料,變長值。

圖表 3-14:TLV 可能的排列方式

這些值出現的順序並不重要,Tag 甚至可能是 Value 的一部分。辨識 TLV 時要看的是「型別+邊界」這組語意,而不是固定的欄位排列。

為什麼 TLV 有用#

送出的 Tag 值可以用來決定接下來如何處理資料。例如協定有兩種 Tag,一種表示要送給應用程式的驗證憑證,另一種表示要傳給解析器的訊息,我們必須有辦法區分這兩類資料——Tag 就承擔這個工作。

反過來看,「跳過不認識的東西」也意味著解析器必須信任 Length。長度欄位與實際資料不符時它怎麼處理,往往就是切入點。