DNS(Domain Name System)快速了解
DNS 是一整套从域名映射到 IP 的系统
DNS 背景
TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序. 但是 IP 地址不方便记忆
于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用 hosts 文件来描述主机 名和 IP 地址的关系。
最初, 通过互连网信息中心(SRI-NIC)来管理这个 hosts 文件的。
- 如果一个新计算机要接入网络, 或者某个计算机 IP 变更, 都需要到信息中心申 请变更 hosts 文件。
- 其他计算机也需要定期下载更新新版本的 hosts 文件才能正确上网。
这样就太麻烦了, 于是产生了 DNS 系统。
- 一个组织的系统管理机构, 维护系统内的每个主机的 IP 和主机名的对应关系.
- 如果新计算机接入网络, 将这个信息注册到数据库中;
- 用户输入域名的时候, 会自动查询 DNS 服务器, 由 DNS 服务器检索数据库, 得到对应的 IP 地址。
至今, 计算机上仍然保留了 hosts 文件. 在域名解析的过程中仍然会优先查找 hosts 文件的内容.
cpp
cat /etc/hosts
域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。
cpp
C
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
yum install bind-utils
之后就可以使用 dig 指令查看域名解析过程了。
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
结果解释:
- 开头位置是 dig 指令的版本号
- 第二部分是服务器返回的详情, 重要的是 status 参数, NOERROR 表示查询成功3
- QUESTION SECTION 表示要查询的域名是什么
- ANSWER SECTION 表示查询结果是什么. 这个结果先将 www.baidu.com 查询 成了 www.a.shifen.com, 再将 www.a.shifen.com 查询成了两个 ip 地址
- 最下面是一些结果统计, 包含查询时间和 DNS 服务器的地址等
更多 dig 的使用方法, 参见:
https://www.imooc.com/article/26971?block_id=tuijian_wz
浏览器中输入 url 后, 发生的事情
这是一个经典的面试题. 没有固定答案, 越详细越好. 可以参考:
ICMP 协议快速了解
ICMP 协议是一个 网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是 IP 协议并不提供可靠传输. 如果丢包了, IP 协议并不能通知传输层是否丢包以及丢包的原因.
ICMP 功能
ICMP 正是提供这种功能的协议; ICMP 主要功能包括:
- 确认 IP 包是否成功到达目标地址
- 通知在发送过程中 IP 包被丢弃的原因
- ICMP 也是基于 IP 协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它 归结为网络层协议
- ICMP 只能搭配 IPv4 使用. 如果是 IPv6 的情况下, 需要使用 ICMPv6
ICMP 的报文格式
关于报文格式, 并不打算重点关注,有个了解即可
ICMP 大概分为两类报文:
- 一类是通知出错原因
- 一类是用于诊断查询
类型(十进制数) | 内容 |
---|---|
0 | 回送应答(Echo Reply) |
3 | 目标不可达(Destination Unreachable) |
4 | 原点抑制(Source Quench) |
5 | 重定向或改变路由(Redirect) |
8 | 回送请求(Echo Request) |
9 | 路由器公告(Router Advertisement) |
10 | 路由器请求(Router Solicitation) |
11 | 超时(Time Exceeded) |
17 | 地址子网(Address Mask Request) |
18 | 地址子网应答(Address Mask Reply) |
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 协议实现, 能够打印出可执行程序主机, 一直到目标主机之前经历多少 路由器.
附录:
- 关于域名,我提问 AI 的问题列表,非技术问题,但是有助于理解域名解析: https://yiyan.baidu.com/share/YAWkPiO7ER