当前位置: 首页 > news >正文

《Linux高性能服务器编程》——1.6 DNS工作原理

1.6 DNS工作原理

我们通常使用机器的域名来访问这台机器,而不直接使用其IP地址,比如访问因特网上的各种网站。那么如何将机器的域名转换成IP地址呢?这就需要使用域名查询服务。域名查询服务有很多种实现方式,比如NIS(Network Information Service,网络信息服务)、DNS和本地静态文件等。本节主要讨论DNS。

1.6.1 DNS查询和应答报文详解

DNS是一套分布式的域名服务系统。每个DNS服务器上都存放着大量的机器名和IP地址的映射,并且是动态更新的。众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址。DNS查询和应答报文的格式如图1-11所示。

image

16位标识字段用于标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应。

16位标志字段用于协商具体的通信方式和反馈通信状态。DNS报文头部的16位标志字段的细节如图1-12所示。

image

图1-12中各标志的含义分别是:

image

接下来的4个字段则分别指出DNS报文的最后4个字段的资源记录数目。对查询报文而言,它一般包含1个查询问题,而应答资源记录数、授权资源记录数和额外资源记录数则为0。应答报文的应答资源记录数则至少为1,而授权资源记录数和额外资源记录数可为0或非0。

查询问题的格式如图1-13所示。

image

图1-13中,查询名以一定的格式封装了要查询的主机域名。16位查询类型表示如何执行查询操作,常见的类型有如下几种:

image
image

16位查询类通常为1,表示获取因特网地址(IP地址)。

应答字段、授权字段和额外信息字段都使用资源记录(Resource Record,RR)格式。资源记录格式如图1-14所示。

image

图1-14中,32位域名是该记录中与资源对应的名字,其格式和查询问题中的查询名字段相同。16位类型和16位类字段的含义也与DNS查询问题的对应字段相同。

32位生存时间表示该查询记录结果可被本地客户端程序缓存多长时间,单位是秒。

16位资源数据长度字段和资源数据字段的内容取决于类型字段。对类型A而言,资源数据是32位的IPv4地址,而资源数据长度则为4(以字节为单位)。

至此,我们简要地介绍了DNS协议。我们将在后面给出一个DNS通信的具体例子。DNS协议的更多细节请参考其RFC文档(DNS协议存在诸多RFC文档,每个RFC文档介绍其一个侧面,比如RFC 1035介绍的是域名的实现和规范,RFC 1886则描述DNS协议对IPv6的扩展支持)。

1.6.2 Linux下访问DNS服务

我们要访问DNS服务,就必须先知道DNS服务器的IP地址。Linux使用/etc/resolv.conf文件来存放DNS服务器的IP地址。机器ernest-laptop上,该文件的内容如下:

# Generated by Network Manager
nameserver 219.239.26.42
nameserver 124.207.160.106

其中的两个IP地址分别是首选DNS服务器地址和备选DNS服务器地址。文件中的注释语句“Generated by Network Manager”告诉我们,这两个DNS服务器地址是由网络管理程序写入的。

Linux下一个常用的访问DNS服务器的客户端程序是host,比如下面的命令是向首选DNS服务器219.239.26.42查询机器www.baidu.com的IP地址:

$ host –t A www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 119.75.217.56
www.a.shifen.com has address 119.75.218.77

host命令的输出告诉我们,机器名www.baidu.com是www.a.shifen.com.的别名,并且该机器名对应两个IP地址。host命令使用DNS协议和DNS服务器通信,其-t选项告诉DNS协议使用哪种查询类型。我们这里使用的是A类型,即通过机器的域名获得其IP地址(但实际上返回的资源记录中还包含机器的别名)。关于host命令的详细使用方法,请参考其man手册。

1.6.3 使用tcpdump观察DNS通信过程

为了看清楚DNS通信的过程,下面我们将从ernest-laptop上运行host命令以查询主机www.baidu.com对应的IP地址,并使用tcpdump抓取这一过程中LAN上传输的以太网帧。具体的操作过程如下:

$ sudo tcpdump -i eth0 -nt -s 500 port domain
$ host –t A www.baidu.com

这一次执行tcpdump抓包时,我们使用“port domain”来过滤数据包,表示只抓取使用domain(域名)服务的数据包,即DNS查询和应答报文。tcpdump的输出如下:

1. IP 192.168.1.108.34319 > 219.239.26.42.53: 57428+ A? www.baidu.com. (31)
2. IP 219.239.26.42.53 > 192.168.1.108.34319: 57428 3/4/4 CNAME www.a.shifen.com., A 119.75.218.77, A 119.75.217.56 (226)

这两个数据包开始的“IP”指出,它们后面的内容描述的是IP数据报。tcpdump以“IP地址.端口号”的形式来描述通信的某一端;以“>”表示数据传输的方向,“>”前面是源端,后面是目的端。可见,第一个数据包是测试机器ernest-laptop(IP地址是192.168.1.108)向其首选DNS服务器(IP地址是219.239.26.42)发送的DNS查询报文(目标端口53是DNS服务使用的端口,这一点我们在前面介绍过),第二个数据包是服务器反馈的DNS应答报文。

第一个数据包中,数值57428是DNS查询报文的标识值,因此该值也出现在DNS应答报文中。“+”表示启用递归查询标志。“A?”表示使用A类型的查询方式。“www.baidu.com”则是DNS查询问题中的查询名。括号中的数值31是DNS查询报文的长度(以字节为单位)。

第二个数据包中,“3/4/4”表示该报文中包含3个应答资源记录、4个授权资源记录和4个额外信息记录。“CNAME www.a.shifen.com.,A 119.75.218.77,A 119.75.217.56”则表示3个应答资源记录的内容。其中CNAME表示紧随其后的记录是机器的别名,A表示紧随其后的记录是IP地址。该应答报文的长度为226字节。

image

相关文章:

  • 科技大牛专业详解 苹果iOS 史上最大漏洞
  • 《Java 7程序设计入门经典》一2.3 字面量
  • 三年试点牌照尚未发放 2017年虚商前路仍艰辛
  • 2015 湖南省赛 阶乘除法
  • PaperWeekly 第38期 | SQuAD综述
  • Oracle成长点点滴滴(2)— 权限管理
  • Python零基础学习系列之一--初识计算机!
  • Android 开发推荐
  • 数据库原理及应用(SQL Server 2016数据处理)【上海精品视频课程】
  • 五步教你轻松搞定数据中心容量规划问题
  • 多态与接口
  • PhpExcel使用方法
  • Java Web工程目录结构
  • Dom4j向XML中增加节点与属性——(四)
  • hbase常识及habse适合什么场景
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • HTML中设置input等文本框为不可操作
  • Promise面试题,控制异步流程
  • React组件设计模式(一)
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring-boot 启动时碰到的错误
  • SQL 难点解决:记录的引用
  • SQLServer之索引简介
  • Twitter赢在开放,三年创造奇迹
  • 你不可错过的前端面试题(一)
  • 前端工程化(Gulp、Webpack)-webpack
  • 区块链分支循环
  • 让你的分享飞起来——极光推出社会化分享组件
  • 我与Jetbrains的这些年
  • 想使用 MongoDB ,你应该了解这8个方面!
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #QT(串口助手-界面)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (42)STM32——LCD显示屏实验笔记
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)ssm码农论坛 毕业设计 231126
  • (算法二)滑动窗口
  • (未解决)macOS matplotlib 中文是方框
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)ORM
  • . NET自动找可写目录
  • .Family_物联网
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .Net6使用WebSocket与前端进行通信
  • .NET开发者必备的11款免费工具
  • .net中应用SQL缓存(实例使用)
  • /etc/fstab和/etc/mtab的区别
  • @EnableWebMvc介绍和使用详细demo
  • @font-face 用字体画图标
  • @Transient注解