4. 服务器回复源地址选择 (Server Reply Source Address Selection)
几乎全部(若非全部)DNS 客户端都期望接收响应的地址与发送引发该响应的查询的地址 相同. 无论客户端是作为递归查询解析目的的服务器,还是简单的解析器客户端,皆如此. 地址与响应中的标识符 (ID) 一起,用于消除响应的歧义并过滤伪造的响应. 这究竟是 DNS 设计时的本意与否不得而知,但如今已是事实.
某些运行 DNS 服务器的多宿主主机会使用与客户端请求数据包目的地址不同的源 地址生成回复. 此类回复会被客户端丢弃,因为回复的源地址与客户端发送原始请求的 主机的源地址不匹配,也就是说,它看起来像是一个未经请求的响应.
4.1. UDP 源地址选择 (UDP Source Address Selection)
为避免这些问题,对于 UDP,回复 IP 头部的 IP 地址必须是包含引发该回复的查询的 数据包的 IP 头部目的地址字段中的地址. 也就是说,当服务器生成对通过 UDP 到达 的查询的回复时,必须将回复 IP 头部的源地址设为包含该查询的数据包的 IP 头部 目的地址字段中的地址. 这是回复的源地址可能与查询(或请求)的源地址不同的唯一 情形. 注意,回复所用源地址与查询所用目的地址相同,因此不是 "伪造" 的地址.
对于 TCP,回复的源地址始终与查询的目的地址相同,回复的源端口始终与查询的目的 端口相同. 这是 TCP 协议固有的.
对于 UDP,回复的源地址必须是查询的目的地址,回复的源端口必须是查询的目的端口. 除服务器出于安全或其他原因使用不同端口的特殊情形外,回复必须从它所定向的端口 发出.
4.2. 端口号选择 (Port Number Selection)
对查询的所有回复必须定向到发送查询的端口. 若查询通过 TCP 接收,这是传输协议 固有的. 对于通过 UDP 接收的查询,服务器必须注意源端口,并将其用作回复的目的端口. 除服务器出于安全或其他原因使用不同端口的特殊情形外,回复应始终从它所定向的端口 发出. 这通常就是分配给 DNS 查询的知名端口 [RFC1700].