2024年4月13日 星期六

dn_expand()

擴展網域名稱 (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 繼續處理。
  • 其它為錯誤。

參考

  1. RFC 1035 4.1.4

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...