【网络基础】DNS协议详解:从背景到解析过程及`dig`工具的使用

2024-08-26 18:44

本文主要是介绍【网络基础】DNS协议详解:从背景到解析过程及`dig`工具的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • DNS 协议
    • ① 前言 - 背景
    • ② 域名
    • ③ DNS解析过程
    • ④ Linux下用dig工具 分析DNS过程
    • ⑤ 浏览器中输入URL后,会有哪些过程

DNS 协议

DNS(域名系统,Domain Name System)是互联网的一个核心协议,用于将域名转换为 IP 地址,使得用户可以通过易记的域名访问网站,而不需要记住数字形式的 IP 地址。DNS 协议使得用户在浏览网页、发送电子邮件等网络活动时变得更加便利。

① 前言 - 背景

  • 我们知道:TCP/IP使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆。
  • 于是人们发明了名为主机名的东西,本身是字符串,使用hosts文件来描述主机名和IP地址的关系。
    在这里插入图片描述

起初是通过互连网信息中心(SRI-NIC)管理该hosts文件

  • 当一个新计算机要接入网络,或某个计算机IP发生变更,都需要到信息中心申请变更hosts文件。
  • 其他计算机也需要定期更新新版本的hosts文件才能正确上网。

显然这种方法并不便捷,于是就有了DNS(域名系统,Domain Name System)

  • 一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系.
  • 如果新计算机接入网络, 将这个信息注册到数据库中;
  • 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.

② 域名

主域名 是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。

域名是互联网上的一种地址命名系统,用于标识和定位网络上的资源,如网站、服务器等。

一个典型的域名由以下几部分组成:

www.example.com
  1. 顶级域名(Top-Level Domain, TLD):“com”:顶级域名位于最右侧,是域名层级结构的最高级别,用于指示域名的类别或国家/地区代码。

  2. 二级域名(Second-Level Domain):“example”:二级域名位于顶级域名之前,是主要的域名标识部分,通常用于表示组织、企业、品牌。

  3. 子域名(Subdomain):“www.”:子域名位于二级域名之前,用于进一步细分域名的层级结构。


③ DNS解析过程

这里简单用文字解释:

  1. 用户请求:用户在浏览器输入网址,发起 DNS 查询。
  2. 本地缓存检查:浏览器和操作系统检查本地缓存是否已有对应 IP 地址。
  3. 递归查询:如果缓存中没有,递归 DNS 服务器开始查询。它首先联系根 DNS 服务器,获取顶级域名服务器的地址。
  4. TLD 服务器查询:递归 DNS 服务器向顶级域名服务器询问,然后获得权威 DNS 服务器的地址。
  5. 权威服务器查询:递归 DNS 服务器向权威 DNS 服务器请求,最终获得域名对应的 IP 地址。
  6. 结果返回:IP 地址被返回给用户的计算机,并缓存以备后续使用。

④ Linux下用dig工具 分析DNS过程

首先通过下面的命令安装dig:

ubuntu:

sudo apt update
sudo apt install dnsutils

centos:

sudo yum install bind-utils

安装完毕就可以通过dig命令进行分析:

root@wqy-virtual-machine:/home# dig csdn.com; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> csdn.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37240
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;csdn.com.			IN	A;; ANSWER SECTION:
csdn.com.		5	IN	A	203.107.45.167;; Query time: 88 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Mon Aug 26 11:35:09 CST 2024
;; MSG SIZE  rcvd: 53

执行结果分析:

查询信息:

  • ; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> csdn.com
    • DiG 是 DNS 查询工具的名称及其版本。
    • 查询的域名是 csdn.com

响应头部

  • ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37240

    • opcode: QUERY:查询操作。
    • status: NOERROR:表示没有错误,查询成功。
    • id: 37240:查询的唯一标识符。
  • ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

    • qr:查询响应标志,表示这是一个响应。
    • rd:递归查询标志,表示客户端要求递归解析。
    • ra:递归可用标志,表示服务器支持递归查询。
    • QUERY: 1:查询的数量。
    • ANSWER: 1:响应的答案数量。
    • AUTHORITY: 0:权威回答的数量(即提供权威解析的 DNS 服务器)。
    • ADDITIONAL: 1:附加信息的数量(如附加的记录)。

OPT PSEUDOSECTION

  • ;; OPT PSEUDOSECTION:
    • EDNS: version: 0, flags:; udp: 65494
      • EDNS: version: 0:扩展 DNS 的版本。
      • flags::扩展 DNS 选项标志(此处为空)。
      • udp: 65494:服务器支持的最大 UDP 数据包大小(以字节为单位)。

查询部分

  • ;; QUESTION SECTION:
    • ;csdn.com. IN A
      • csdn.com.:查询的域名。
      • IN:互联网类。
      • A:查询的记录类型(A 记录,用于解析域名到 IPv4 地址)。

响应部分

  • ;; ANSWER SECTION:
    • csdn.com. 5 IN A 203.107.45.167
      • csdn.com.:查询的域名。
      • 5:记录的生存时间(TTL,单位是秒),表示此记录在 DNS 缓存中有效的时间。
      • IN:互联网类。
      • A:记录类型(A 记录)。
      • 203.107.45.167:域名 csdn.com 对应的 IPv4 地址。

其他信息

  • ;; Query time: 88 msec

    • 查询的响应时间,单位是毫秒。
  • ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)

    • 使用的 DNS 服务器地址和端口号(127.0.0.53 是本地 DNS 解析器,端口号为 53)。
  • ;; WHEN: Mon Aug 26 11:35:09 CST 2024

    • 查询的时间和日期。
  • ;; MSG SIZE rcvd: 53

    • 响应消息的大小,单位是字节。

⑤ 浏览器中输入URL后,会有哪些过程

  1. DNS 解析:浏览器通过 DNS 解析获取 URL 对应的 IP 地址。
  2. 建立连接:使用 IP 地址,浏览器与目标服务器建立 TCP 连接。
  3. 发送请求:浏览器发送 HTTP/HTTPS 请求到服务器。
  4. 服务器响应:服务器处理请求并返回 HTML 文档及其他资源。
  5. 页面渲染:浏览器解析 HTML,加载 CSS、JavaScript,并渲染页面。

过程执行下来,确保了用户输入的 URL 被正确地转换成可视的网页内容。

这篇关于【网络基础】DNS协议详解:从背景到解析过程及`dig`工具的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109375

相关文章

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4