一、DNS
1.1 从hosts文件到DNS
TCP/IP网络中,使用IP地址和端口号确定一台主机上的某个程序。但IP地址不便于记忆,于是人们发明了主机名------一个字符串,并通过 hosts 文件 描述主机名与IP的对应关系。

最初,由互联网络信息中心统一管理hosts文件:新计算机入网或IP变更都需要到信息中心申请变更,其他计算机也要定期下载新版本的hosts文件才能正确联网。这种方式维护成本极高,于是DNS系统应运而生。
DNS是一整套从域名映射到IP的分布式系统:
-
各组织的系统管理机构维护本组织内主机的IP与主机名对应关系
-
新计算机入网时,将信息注册到数据库中
-
用户输入域名时,系统自动查询DNS服务器,由服务器检索数据库返回对应IP
至今,计算机上仍保留着hosts文件,且域名解析时会优先查找hosts文件的内容:
bash
cat /etc/hosts
1.2 域名结构
域名使用 . 连接,采用分层结构。以 www.baidu.com 为例:
| 层级 | 名称 | 说明 |
|---|---|---|
| 顶级域 | com | 表示企业域名,同级还有net、org等 |
| 二级域 | baidu | 公司名,由企业自行注册和管理 |
| 三级域 | www | 习惯用法,早期用于标识主机支持的协议 |
域名整体呈树状结构:

树的最顶端是根服务器,根的下一层是 .com、.net、.cn 等通用域和国家域,再往下是企业注册的二级域,以及三级、四级域名。
1.3 域名解析
以查询 www.baidu.com 为例,DNS递归解析的流程如下:

-
客户端向本地DNS服务器发起查询:"www.baidu.com的IP地址是多少?"
-
本地DNS服务器向根服务器查询
-
根服务器返回:"这个域名归.com服务器管理,这是它的地址"
-
本地DNS服务器向.com顶级域服务器查询
-
.com服务器返回:"这个域名归baidu.com服务器管理,这是它的地址"
-
本地DNS服务器向baidu.com权威服务器查询
-
权威服务器返回百度一下,你就知道的IP地址,本地DNS服务器将结果返回给客户端
整个过程中,本地DNS服务器扮演了"代查"的角色,客户端只需等待最终结果。
1.4 使用dig工具分析DNS
dig是Linux下常用的DNS查询工具,安装:
bash
yum install bind-utils
查询域名:
bash
dig www.baidu.com
输出示例:
bash
; <<>> 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
解读:
-
status: NOERROR:查询成功
-
QUESTION SECTION:要查询的域名
-
ANSWER SECTION:查询结果
-
Query time:查询耗时
-
SERVER:使用的DNS服务器地址
缓存:
-
Windows系统可使用 ipconfig /displaydns 查看系统级DNS缓存
-
浏览器也有独立的DNS缓存,可在浏览器开发者工具中查看
二、ICMP
2.1 协议功能
ICMP是一个网络层协议,基于IP协议工作。
新搭建好的网络,往往需要先进行测试来验证连通性。但IP协议本身不提供可靠传输------丢包了,IP层不会通知传输层,也不会说明丢包原因。
功能:
-
确认IP包是否成功到达目标地址
-
通知发送过程中IP包被丢弃的原因
注意:ICMP虽然基于IP协议,但不属于传输层功能,仍归类为网络层协议。IPv4使用ICMP,IPv6则使用ICMPv6。
当目标主机不可达时,路由器会通过ICMP通知源主机:

主机B电源关闭,路由器2多次发送ARP请求均无响应,最终向主机A返回一个 ICMP Destination Unreachable 报文。
2.2 格式与类型
ICMP报文格式:

前4字节为固定头部:类型、代码、校验和,后续内容根据类型和代码的不同而变化。
ICMP报文大致分为两类:通知出错原因 和 用于诊断查询。
常见类型:

| 类型(十进制) | 内容 |
|---|---|
| 0 | 回送应答 |
| 3 | 目标不可达 |
| 4 | 原点抑制 |
| 5 | 重定向或改变路由 |
| 8 | 回送请求 |
| 9 | 路由器公告 |
| 10 | 路由器请求 |
| 11 | 超时 |
| 17 | 地址子网请求 |
| 18 | 地址子网应答 |
2.3 ping命令
ping是最常用的网络连通性测试工具,基于ICMP协议实现。
工作原理:
源主机发送一个 ICMP Echo Request(类型8)给目标
目标接收到后,返回一个 ICMP Echo Reply(类型0)

ping不仅能验证连通性,还会统计响应时间和TTL。
示例:

分析输出:
-
目标域名www.baidu.com先被解析为www.a.shifen.com,再解析到 61.135.169.121
-
发送4个数据包,全部收到回复,丢失率0%
-
往返时间最短28ms,最长66ms,平均49ms
-
TTL为52
注意:ping的是域名,不是URL。一个域名可以通过DNS解析成IP地址,而URL包含协议、路径等更多信息。
2.4 traceroute命令
traceroute同样基于ICMP协议实现,能够打印出从当前主机到目标主机之间经过的每一跳路由器。

工作原理: traceroute依次发送TTL从1开始递增的IP包,每经过一个路由器TTL减1;当TTL变为0时,路由器返回 ICMP Time Exceeded(类型11)报文,从而获知该跳路由器的IP。
输出中 * * * 表示该跳路由器未返回ICMP超时报文。