擴展網域名稱 (dn, doamin name)。DNS 詢問或回覆訊息中的網域名稱,並沒有「.」,每個「.」隔開的 label 改為前面加 1-byte 欄位放 label 的長度。另外,先前出現的最長字尾,可以用訊息 offset 表示,來減少封包長度。dn_expand() 將其還原為原本完整的樣子。
int dn_expand( // 回傳處理的壓縮 dn 長度,錯誤回 -1
const unsigned char *msg, // 訊息開始
const unsigned char *eomorig, // 訊息結束
const unsigned char *comp_dn, // 壓縮的 dn
char *exp_dn, // buffer 放擴展後的 dn
int length); // buffer 大小
壓縮的 dn 每個 label 第 1 byte 的 MSB 2-bit 是
- 00 表示沒有壓縮,剩下 6-bit 是後續資料的長度,依照常長度將後續資料複製到 buffer,特殊字元前加 '\'、不可印的字元轉成 \ddd。
- 11 表示有壓縮,剩下 6-bit 和下個 byte 合起來是訊息的 offset,檢查是否在範圍內,跳到 offset 繼續處理。
- 其它為錯誤。
參考
- RFC 1035 4.1.4
沒有留言:
張貼留言