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. 通过标签序列可以灵活的表示域名字段,同时利用指针偏移的方式来整体压缩减少报文长度。
相关推荐
刘大辉在路上3 小时前
突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除
git·后端·gitlab·版本管理·源代码管理
Aileen_0v04 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
测试老哥4 小时前
外包干了两年,技术退步明显。。。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
花鱼白羊5 小时前
TCP Vegas拥塞控制算法——baseRtt 和 minRtt的区别
服务器·网络协议·tcp/ip
追逐时光者5 小时前
免费、简单、直观的数据库设计工具和 SQL 生成器
后端·mysql
初晴~5 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581366 小时前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳6 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾6 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala