编写DNS客户端时RDLENGTH返回0,RDATA内容异常问题求助
资源记录结构解析偏移错误
DNS响应的资源记录格式为:NAME(可能含压缩) + TYPE + CLASS + TTL + RDLENGTH + RDATA。若解析NAME字段时未正确处理数据压缩,会导致后续所有字段的读取偏移错位。比如NAME因压缩实际长度变短,但你按非压缩逻辑计算长度,就会把TYPE/CLASS字段的部分数据误读为RDLENGTH(得到0),后续RDATA的读取位置完全错误,出现前两段正确后两段错误的情况——本质是你读取的"RDATA"是其他字段的拼接内容。字节序处理错误
DNS协议中所有多字节字段(TYPE、CLASS、TTL、RDLENGTH等)均为网络字节序(大端),若代码读取时未转换为主机字节序,会导致数值解析错误。比如RDLENGTH是16位字段,直接按主机字节序读取可能把0x0004(对应IPv4地址长度4)读成0x0400,或误读其他字段内容为RDLENGTH的0值。而RDATA的IPv4是4字节网络字节序,若仅部分处理字节序转换,也会出现前两段正确后两段错误的情况。响应包边界处理错误
若采用TCP传输却未正确处理分包,或按固定长度读取响应,可能只接收到响应包的部分内容,导致RDLENGTH和RDATA的位置被截断,读取到错误数值。比如响应包未接收完整时就开始解析,RDLENGTH所在位置被填充0,后续RDATA读取的是不完整字节。资源记录类型判断错误
即便预期是A记录(IPv4),若响应中TYPE字段不是1(A记录类型),RDATA格式就不是4字节IPv4。比如误将AAAA记录(TYPE=28,RDATA为16字节)当成A记录处理,强行按4字节读取就会出现内容错位;或解析TYPE时出错,也会导致RDATA解析异常。
内容的提问来源于stack exchange,提问作者kaneda

