DNS报文主要使用53/UDP,什么时候会用到53/TCP?


    根据RFC1035,对于DNS服务器,递归解析时用53/UDP,区传输因需要可靠传输,必须使用53/TCP。DNS服务器的标准实现必须同时支持53/TCP和53/UDP。RFC 1035中还指出,53/UDP上的UDP数据区(不包括UDP首部)不得超过512字节,发送时如果超过512字节,将被截断成512字节,同时DNS协议Flags字段Truncated位置位。53/TCP上的数据区最前面是big-endian序的2字节长度域,不包括自身这2字节,指明了后续数据长度。

当DNS响应数据大于512字节的时候,数据只返回512字节,剩余的数据将被丢弃.这个时候名字解析器(DNS客户端或递归解析中的DNS服务器)通常使用TCP重发原来的查询请求,它将允许返回的响应超过512个字节.所以何时使用TCP是由名字解析器决定的,也就是说,名字解析器用TCP发送请求,名字服务器才会用TCP发送响应,正常情况下决不会出现请求抱文是UDP而响应报文是TCP的情况.

即"当DNS服务器产生的响应数据大于512字节(指UDP数据区)时会自动改用53/TCP"这种说法是错误的.

 

使用 DNS 的扩展名机制 (EDNS0)

DNS 的扩展机制允许 DNS 请求者公布其 UDP 数据包的大小,并且更便于传输大于 512 字节(对于 UDP 数据包大小的原始 DNS 限制,RFC 1035)的数据包。DNS 服务器通过 UDP 传输层接收请求时,它对来自 OPT 资源记录 (RR) 的请求者的 UDP 数据包大小进行标识,测量其响应,以包含请求者指定的最大 UDP 数据包大小中允许的多个资源记录。