前言
這里我們主要是?來看一下 dns?服務器這邊的相關業務處理?
通常來說?在我們日常生活中 還是經常會需要使用 dns?的情況,?主要是更加友好的去給一個主機命名一個別名?
比如?現在我的應用在服務器 192.168.220.133 但是我不想記這個生硬的?ip, 我可能更期望記錄一個域名,?比如?app.com, 這時候?就可以在 dns?服務器上面增加一個映射?app.com -> 192.168.220.133
比如?現在我的應用在服務器 192.168.220.133, 但是?之后服務可能會發生遷移更新到 10.60.50.16, 這種場景下面?我們僅僅需要在 dns?上面將?“app.com” -> 192.168.220.133 更新為?“app.com” -> 10.60.50.16 而客戶端這邊無需做任何改動?
我們這里調試的?dns?服務器主要是基于?dnsmasq?
?
在?/etc/hosts 中?映射配置如下,?存在一條?“master“ -> 10.60.50.16 的映射配置?
?
?
dns 的請求?和 響應
dns?請求這邊如下,?這里我們看基于?udp?的?dns?數據交互?
dns 這邊主要是包含了一個?txId, flags, questions, answterRRs, AuthorityRRs, AdditionalRRs, 以及具體的查詢請求
具體的查詢請求包含?待查詢域名,?type, class
?
dns 響應這邊情況如下?
可以看到?dns響應?是在 dns請求?的數據基礎上面擴展的,?增加了?Answer?的結構
Answer的結構?主要包含了 查詢的域名,?type, class, ttl, lengthOfIp, 目標ip
?
?
dns 的請求處理
這里就是查詢 dns容器 維護的 hash_table, 其中維護的映射類似于 Map<String, String> hostname2Ip;
這里的查詢也是類似于?java.util.HashMap 的查詢,?找到匹配的記錄之后,?返回該記錄?
?
然后之后寫出?dns?響應的數據是在這里?
header 即為一個?dns?的請求頭信息,?在上面?dns?的請求的基礎上面去掉了?請求體
這里傳入了?nameoffset 表示域名相對于?dns?請求的偏移,?ttl 等等相關信息?
傳入的待寫出的指針為 &ansp, 這個的處理在上面, 我們后面來看?
?
寫出響應中的 nameOffset, type, class, ttl, lengthOfIp
?
寫出 ip, 這個?for?之后,?會填充寫出的?ip?的長度?
?
ansp 初始化的地方
首先是跳過了?dns_header 的部分,?然后接著是遍歷每一個?dns請求體,?跳過該部分的?dns請求體?
這里處理完成之后,?ansp 的最終的位置是在?整個dns請求的末尾
?
?
dnsmasq 中的?dns_header 結構體
id 對應于數據包中的?trxId
hb3, hb4 對應于數據包中的?flags?
qdcount 對應于?questions
ancount對應于?answterRRs
nscount對應于?AuthorityRRs
arcount對應于?AdditionalRRs
?
?
dns 配置的加載
讀取?“/etc/hosts” 以及?“--addn-hosts” 的地方
如果是配置了?“--no-hosts” 則不會加載?“/etc/hosts” 文件?
?
注冊?“/etc/hosts” 中的條目到?hash_table 中的過程?
?
?
完
?
?
?