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. 通过标签序列可以灵活的表示域名字段,同时利用指针偏移的方式来整体压缩减少报文长度。
相关推荐
逐米时代15 小时前
AR加知识库提升一次修复率
后端·restful
王码码203515 小时前
Go语言CGO:Go与C交互
后端·golang·go·接口
PC2005-cloud16 小时前
DSH 白嫖指南:接入 Command Code Go、WorkBuddy 与 Trae 的免费额度
开发语言·后端·golang
vx-程序开发16 小时前
【计算机毕设】基于Spring Boot的古城景区管理系统88564
java·数据库·spring boot·后端·spring·elasticsearch·课程设计
80s77717 小时前
动态ip地址分配通常是由_动态IP与静态IP之间的区别
网络·网络协议·tcp/ip
妙码生花17 小时前
两个月 59 篇 AI 开发日志 + Golang 商业级实战项目收工后,得来的 AI 使用心法-上
前端·后端·gin
vx-Biye_Design17 小时前
springboot中国传统节日宣传平台49078-计算机课程设计、毕业设计
java·前端·vue.js·spring boot·后端·课程设计·idea
妙码生花17 小时前
两个月 59 篇 AI 开发日志 + Golang 商业级实战项目收工后,得来的 AI 使用心法-下
前端·后端·go
qq_4523962317 小时前
第三篇:《变量、类型与函数:Rust 的“基本盘”》
开发语言·后端·rust
江华森17 小时前
02 Ubuntu 24.04 手把手部署 K8s 集群(K3s 选型 + 真实踩坑记录)
后端