跳转至

DNS与ICMP

约 2621 个字 15 行代码 5 张图片 预计阅读时间 9 分钟

在现代互联网世界中,DNS(Domain Name System)和ICMP(Internet Control Message Protocol)是两个不可或缺的组成部分。它们各自承担着不同的角色,但共同保障了网络通信的顺畅进行。本文将深入探讨DNS和ICMP的工作原理及其在网络中的重要性,并结合实际应用场景帮助读者更好地理解这两个概念

DNS(Domain Name System)快速了解

DNS背景

在TCP/IP协议中,使用IP地址和端口号来确定网络上的一台主机的一个程序。然而,IP地址不方便记忆,于是人们发明了一种叫主机名的东西,是一个字符串,并使用hosts文件来描述主机名和IP地址的关系。最初,通过互连网信息中心(SRI-NIC)来管理这个hosts文件。如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件。其他计算机也需要定期下载更新新版本的hosts文件才能正确上网。这样就太麻烦了,于是产生了DNS系统

  • DNS系统

  • 一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系。

  • 如果新计算机接入网络,将这个信息注册到数据库中。
  • 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。

至今,我们的计算机上仍然保留了hosts文件。在域名解析的过程中仍然会优先查找hosts文件的内容。

域名简介

主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。例如,www.baidu.com

  • com: 一级域名,表示这是一个企业域名。同级的还有"net"(网络提供商),"org"(非盈利组织)等。
  • baidu: 二级域名,公司名。
  • www: 只是一种习惯用法。之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议。

域名解析过程(选学)

域名结构是树状结构,树的最顶端代表根服务器,根的下一层就是我们所熟知的.com.net.cn等通用域和.cn.uk等国家域组成的顶级域。网上注册的域名基本都是二级域名,比如http://baidu.com、http://taobao.com 等等二级域名,它们基本上归企业和运维人员管理。接下来是三级或者四级域名,这里不多赘述。

使用dig工具分析DNS过程

安装dig工具:

Bash
1
sudo apt install bind-utils

之后就可以使用dig指令查看域名解析过程了:

Bash
1
dig www.baidu.com

结果形如:

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
;<<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1<<>> www.baidu.com
;; global options:+cmd ;; Got answer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41628
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION: ;www.baidu.com.
IN A
;; ANSWER SECTION:
www.baidu.com. 1057 IN CNAME www.a.shifen.com.
www.a.shifen.com. 40 IN A 115.239.210.27
www.a.shifen.com. 40 IN A 115.239.211.112
;; Query time: 0 msec
;; SERVER: 100.100.2.136#53(100.100.2.136)
;; WHEN: Wed Sep 26 00:05:25 CST 2018 ;; MSG SIZE rcvd: 90

结果解释

  1. 开头位置是dig指令的版本号。
  2. 第二部分是服务器返回的详情,重要的是status参数,NOERROR表示查询成功
  3. QUESTION SECTION表示要查询的域名是什么
  4. ANSWER SECTION表示查询结果是什么。这个结果先将www.baidu.com查询成了www.a.shifen.com,再将www.a.shifen.com查询成了两个IP地址
  5. 最下面是一些结果统计,包含查询时间和DNS服务器的地址等

更多dig的使用方法,请参考这篇文章

关于DNS缓存

  • 在Windows系统中,可以使用ipconfig/displaydns命令来查看系统级别的DNS缓存

输入URL后发生的事情

在浏览器中输入 URL 后,从用户按下回车键到最终页面渲染完成,整个过程涉及多个阶段和组件的协作。以下是从前端、后端以及底层网络通信的详细分析:

1. 用户输入URL并按下回车

  • 用户行为:用户在浏览器地址栏输入一个URL(如 https://www.example.com),然后按下回车键
  • 浏览器解析:浏览器首先会检查输入是否是合法的 URL。如果输入不符合标准(比如缺少协议部分),浏览器可能会尝试补全或提示错误;如果是一个合法的 URL,浏览器会开始后续的加载流程

2. DNS解析

  • 目标:将域名(如www.example.com)解析为对应的IP地址
  • 过程
    1. 浏览器缓存:浏览器首先检查本地缓存中是否有该域名的解析记录。如果有,则直接使用缓存的IP地址
    2. 操作系统缓存:如果浏览器缓存中没有,浏览器会请求操作系统的 DNS 缓存
    3. 本地 DNS 服务器:如果本地缓存也未命中,浏览器会向配置的本地DNS服务器(通常是ISP提供的)发送查询请求
    4. 递归查询:如果本地DNS服务器也没有记录,它会递归地向上级DNS服务器(根服务器、顶级域名服务器等)查询,直到找到对应的IP地址
    5. 结果返回:最终,DNS服务器返回域名对应的IP地址,浏览器将其存储在缓存中以备后续使用

3. 建立TCP连接

  • 目标:通过TCP协议与目标服务器建立连接
  • 过程
    1. 三次握手
      • 客户端向服务器发送SYN(同步)包,请求建立连接
      • 服务器收到SYN包后,回复SYN-ACK(同步确认)包
      • 客户端收到SYN-ACK包后,再发送ACK(确认)包,完成三次握手
    2. HTTPS的TLS握手(如果使用 HTTPS):在TCP连接建立后,客户端和服务器会进行TLS握手,协商加密算法并交换密钥。完成握手后,后续通信会被加密

4. 发送HTTP请求

  • 目标:向服务器发送HTTP请求以获取资源
  • 过程
    1. 构建请求:浏览器根据用户输入的URL构建HTTP请求报文,包括请求方法(如GET)、路径(如 /index.html)、协议版本(如HTTP/1.1或HTTP/2)以及必要的头部信息(如HostUser-Agent等)
    2. 发送请求:浏览器通过已建立的TCP连接,将HTTP请求发送到服务器

5. 服务器处理请求

  • 目标:服务器接收请求并返回响应
  • 过程

    1. 接收请求:服务器监听指定端口(如80或443),接收来自客户端的HTTP请求
    2. 解析请求:服务器解析请求头和请求体,提取出请求方法、路径、参数等信息
    3. 路由处理:根据请求路径,服务器将请求分发到相应的处理逻辑(如Web应用框架中的路由规则)
    4. 业务逻辑处理:服务器执行业务逻辑,可能涉及数据库查询、文件读取、调用外部 API 等操作
    5. 生成响应:服务器根据处理结果生成HTTP响应,包括状态码(如 200 OK)、响应头(如Content-Type)和响应体(如HTML页面内容)
    6. 发送响应:服务器通过已建立的TCP连接,将响应发送回客户端

6. 浏览器接收响应

  • 目标:浏览器接收服务器返回的响应并处理
  • 过程

    1. 解析响应:浏览器首先解析响应头,确定内容类型(如 HTML、CSS、JavaScript 等)
    2. 处理 HTML 文档:如果响应是HTML文档,浏览器会开始解析HTML,构建DOM树
    3. 加载外部资源:浏览器会根据HTML中的<link><script><img>等标签,发起额外的HTTP请求以加载CSS文件、JavaScript文件、图片等资源
    4. 解析 CSS:浏览器解析CSS文件,构建CSSOM树
    5. 合并 DOM 和 CSSOM:浏览器将DOM树和CSSOM树合并,生成渲染树
    6. 布局与绘制:浏览器计算每个元素的布局(位置和大小),然后将渲染树绘制到屏幕上

7. 渲染页面

  • 目标:将页面内容呈现给用户
  • 过程

    1. 首屏渲染:浏览器优先渲染首屏内容,使用户能够尽快看到页面
    2. 异步加载:对于非阻塞资源(如异步加载的JavaScript文件),浏览器会在后台继续加载,不会阻塞页面渲染
    3. 事件绑定:浏览器解析并执行JavaScript,绑定事件监听器,使页面具有交互能力
    4. 持续优化:浏览器可能会根据用户的操作动态更新页面内容(如通过AJAX请求加载更多数据)

8. 关闭连接

  • 目标:释放资源,关闭TCP连接
  • 过程

    1. HTTP Keep-Alive:如果服务器支持HTTP Keep-Alive,连接可能会保持一段时间,以便复用于后续请求
    2. 四次挥手:当连接不再需要时,客户端和服务器通过四次挥手断开TCP连接

ICMP协议快速了解

ICMP协议是一个网络层协议

一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。

ICMP功能

ICMP正是提供这种功能的协议;ICMP主要功能包括:

  • 确认IP包是否成功到达目标地址。
  • 通知在发送过程中IP包被丢弃的原因。
  • ICMP也是基于IP协议工作的。但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。
  • ICMP只能搭配IPv4使用。如果是IPv6的情况下,需要使用ICMPv6

ICMP大概分为两类报文:

  • 一类是通知出错原因
  • 一类是用于诊断查询

常见的类型如下:

ping命令

  • 注意,此处ping的是域名,而不是url!一个域名可以通过DNS解析成IP地址。
  • ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live,生存周期)。
  • ping命令会先发送一个ICMP Echo Request给对端。
  • 对端接收到之后,会返回一个ICMP Echo Reply。

一个值得注意的坑

有些面试官可能会问:telnet是23端口,ssh是22端口,那么ping是什么端口?

千万注意!!!这是面试官的圈套。ping命令基于ICMP,是在网络层。而端口号,是传输层的内容。在ICMP中根本就不关注端口号这样的信息

traceroute命令

也是基于ICMP协议实现,能够打印出可执行程序主机,一直到目标主机之前经历多少路由器。