响应时间:用户从发起请求到获取完整资源所消耗的时间间隔(约等于DNS域名解析 + TCP连接 + HTTP请求响应)
1 采用UDP的优点
- 响应速度快:UDP协议不需要进行建立连接的握手,因此响应速度更快,特别是对于小数据包和查询速度较快的情况。
- 占用带宽少:由于UDP协议不需要进行建立连接和断开连接的操作,也不需要对数据进行分包和组包操作,因此占用的带宽比TCP更少。
2 采用UDP的缺点
- 数据传输不可靠:UDP是一种不可靠的传输协议,数据包在传输过程中可能会丢失或顺序错乱,因此在传输需要可靠性的数据时不适合使用。
- 数据包大小受限:因为DNS只能标识报文ID,不能标识报文序号,故默认只有一个报文。UDP协议一般只支持512字节以下的数据包,因此在需要传输更大的数据时需要使用其他传输协议。
3 DNS协议从UDP切换到TCP的过程:
(1)客户端向DNS服务器发送查询请求,并使用UDP传输协议进行传输。
(2)DNS服务器接收到查询请求,并返回响应数据。如果响应数据的大小超过了512字节,则在响应数据中设置truncated标记位,表示响应数据被截断了。
(3)客户端收到带有truncated标记位的响应数据,并意识到需要切换到使用TCP协议进行传输。客户端向DNS服务器发送TCP连接请求,并在同一个TCP连接上重新发送查询请求;
(4)DNS服务器接收到TCP连接请求后,向客户端发送TCP连接响应,并在同一个TCP连接上接收到客户端的查询请求。
(5)DNS服务器使用TCP连接向客户端发送完整的响应数据,以保证数据传输的可靠性。
(6)客户端收到完整的响应数据后,关闭TCP连接,结束DNS查询过程。
4 采用TCP的缺点
- 响应速度相对较慢:TCP协议需要进行三次握手、连接建立和断开等操作,因此响应速度相对较慢,适合小数据包或者查询速度较慢的情况。
- 占用带宽相对较多:TCP协议需要进行建立连接、断开连接、分包、组包和流量控制等操作,因此占用的带宽相对较多。
注意:若缓存未命中,则TCP不仅只建立一次连接,localDNS会迭代查询(从根节点)至权威DNS,每次查询过程都需要建立一次连接。
5 如何采用UDP突破512限制——EDNS(参考RFC 6891)
为了实现UDP承载超过512字节的数据包,RFC 6891提出了扩展DNS,允许更多的标志和响应代码并且实现更长的消息响应,称为EDNS
EDNS使用场景:
- DNS协议头部的第二个16字节中都已经被用的差不多了,需要添加新的返回类型(RCODE)和标记(FLAGS)来支持其他需求;
- 兼容IPv6:IPv6的地址长度比IPv4的地址长度更长,因此对于IPv6的DNS查询,需要支持更大的DNS数据包传输。EDNS扩展允许DNS服务器和客户端使用UDP的最大数据包大小上限为65535字节,从而支持IPv6地址的查询和传输。
- 支持DNSSEC扩展:DNSSEC是基于公钥基础设施的Web安全扩展,主要用于防止DNS欺诈和缓存污染攻击。在DNSSEC中,每个DNS回答的签名数据都很大,EDNS扩展可以支持DNSSEC扩展,并且在DNS回答中可以添加签名数据。
- 改善DNS查询性能:DNS查询中,采用UDP传输数据包的优点是传输速度快,不需要连接和断开连接。但由于UDP协议传输数据包大小有限制,EDNS可以使用更大的数据包传输限制,提高DNS查询性能
EDNS扩展允许DNS服务器和客户端使用UDP的最大负载大小上限为65535字节,它在RFC 2671中定义了一种“OPT”资源记录类型。当客户端支持EDNS时,它会在DNS查询消息头的“Additional RRs”的最后一个部分中包含一条OPT记录,并且在DNS响应消息头的“Additional RRs”的最后一个部分中包含一条记录。
OPT RR字段的格式: