[資訊] 為什麼 DNS 使用 UDP 協定

為什麼 DNS 使用 UDP 協定 · Why's THE Design?
https://draveness.me/whys-the-design-dns-udp-tcp?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

很多人認為 DNS 使用了 UDP 協議來獲取功能變數名稱對應的 IP 位址,這個觀點雖然沒錯,但是還是有一些片面,更加準確的說法其實是 DNS 查詢在剛設計時主要使用 UDP 協議進行通信,而 TCP 協議也是在 DNS 的演進和發展中被加入到規範的:
1. DNS 在設計之初就在區域傳輸中引入了 TCP 協定,在查詢中使用 UDP 協定;
2. 當 DNS 超過了 512 位元組的限制,我們第一次在 DNS 協議中明確了『當 DNS 查詢被截斷時,應該使用 TCP 協議進行重試』這一規範;
3. 隨後引入的 EDNS 機制允許我們使用 UDP 最多傳輸 4096 位元組的資料,但是由於 MTU 的限制導致的資料分片以及丟失,使得這一特性不夠可靠;
4. 在最近的幾年,我們重新規定了 DNS 應該同時支援 UDP 和 TCP 協定,TCP 協定也不再只是重試時的選擇;

這篇文章已經詳細介紹了 DNS 的歷史以及選擇不同協議時考慮的關鍵點,在這裡我們重新回顧一下 DNS 查詢選擇 UDP 或者 TCP 兩種不同協議時的主要原因:
1. UDP 協議:DNS 查詢的資料包較小、機制簡單;UDP 協定的額外開銷小、有著更好的性能表現;
2. TCP 協議:DNS 查詢由於 DNSSEC 和 IPv6 的引入迅速膨脹,導致 DNS 回應經常超過 MTU 造成資料的分片和丟失,我們需要依靠更加可靠的 TCP 協定完成資料的傳輸;隨著 DNS 查詢中包含的資料不斷增加,TCP 協定頭以及三次握手帶來的額外開銷比例逐漸降低,不再是佔據總傳輸資料大小的主要部分;

無論是選擇 UDP 還是 TCP,最核心的矛盾就在於需要傳輸的資料包大小,如果資料包小到一定程度,UDP 協議絕對最佳的選擇,但是當資料包逐漸增大直到突破 512 位元組以及 MTU 1500 位元組的限制時,我們也只能選擇使用更可靠的 TCP 協議來傳輸 DNS 查詢和相應。


#DNS,  TCP, UDP, 協定, 機制, 資料, 可靠, 查詢

留言