DNS 从域名字段解析看网络协议巧妙的设计

简介

DNS协议 大家都比较熟悉,平时访问的网站是容易记忆的域名地址 ,但是对于机器来说,通信最终路由得靠IP地址,而dns协议主要的目的也就是做一下域名和IP之间的转换。

dns协议属于cs模式,客户端发送dns请求报文到dns服务器,dns服务器收到后进行处理并返回dns响应报文;这里详细说明一下域名字段在报文中的编码格式,感受下网路协议设计有什么巧妙之处。

示例

STEP1、请求www.baidu.com

bash 复制代码
[xiaofeng@localhost ~]$ dig www.baidu.com

; <<>> DiG 9.11.26-RedHat-9.11.26-6.el8 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12912
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.baidu.com.                 IN      A

;; ANSWER SECTION:
www.baidu.com.          529     IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       25      IN      CNAME   www.wshifen.com.
www.wshifen.com.        158     IN      A       119.63.197.151
www.wshifen.com.        158     IN      A       119.63.197.139

;; Query time: 133 msec
;; SERVER: 208.91.112.52#53(208.91.112.52)
;; WHEN: Fri Mar 22 14:51:51 CST 2024
;; MSG SIZE  rcvd: 127

[xiaofeng@localhost ~]$

STEP2 抓包分析

tcpdump -i ens192 port 53 -envvv -w dns.pcap

DNS请求报文

DNS响应报文

STEP3 编码分析

www.baidu.com 域名在请求报文中和响应报文中第一次出现的十六进制如下:

03 77 77 77 05 62 61 69 64 75 03 63 6f 6d 00

  1. 第一个标签长度字节03,表示后续三个字节是域名的www
  2. 第二个标签长度字节05,表示后续五个字节是域名的baidu
  3. 第三个标签长度字节03,表示后续三个字节是域名的com
  4. 第四个标签长度字节00,标识结束
  5. 然后将每段标签用点进行连接即得到完整的域名www.baidu.com

www.baidu.com 域名在响应报文中第二次出现的十六进制如下:

c0 0c

  1. 第一个字节c0,表示域名出现过,使用指针方式(前两位为11作为标识
  2. 第二个字节0c,为域名第一次出现的偏移这里就是Queies中www.baidu.com 所在的偏移量,即dns头的长度12字节

总结

  1. 域名被编码为一些labels序列,每个labels包含一个字节表示后续字符串长度,以及这个字符串,以0长度和空字符串来表示域名结束。
  2. 如果一个域名在前面已经出现过,那么可以用指针来代替它。指针的格式为两个字节,第一个字节的前两位为 11,后面14位为指向之前出现过的域名的偏移量,偏移量是相对于DNS报文的起始位置计算的。
  3. 通过标签序列可以灵活的表示域名字段,同时利用指针偏移的方式来整体压缩减少报文长度。
相关推荐
superman超哥19 小时前
Rust 结构体中的生命周期参数:所有权设计的核心抉择
开发语言·后端·rust·rust结构体·rust生命周期·所有权设计
芒克芒克19 小时前
深入浅出JVM的运行时数据区
java·开发语言·jvm·面试
沉默-_-19 小时前
从小程序前端到Spring后端:新手上路必须理清的核心概念图
java·前端·后端·spring·微信小程序
superman超哥19 小时前
Rust 生命周期边界:约束系统的精确表达
开发语言·后端·rust·rust生命周期边界·约束系统
a程序小傲19 小时前
中国邮政Java面试被问:gRPC的HTTP/2流控制和消息分帧
java·开发语言·后端
forestsea19 小时前
Springboot 4.0十字路口:虚拟线程时代,WebFlux与WebMVC的终极选择
java·后端·spring
superman超哥20 小时前
Rust 生命周期省略规则:编译器的智能推导机制
开发语言·后端·rust·编译器·rust生命周期·省略规则·智能推导
踏浪无痕20 小时前
从需求到落地:我们是如何搭建企业知识库问答系统的
后端·ai编程
源代码•宸20 小时前
GoLang基础语法(go语言结构、go语言变量、go语言常量、go语言运算符)
开发语言·后端·golang