DNS 协议、ICMP 协议
一. DNS 协议
DNS(Domain Name System,域名系统)协议,是一个用来将域名转化为IP地址的应用层协议。
1. DNS 背景
TCP/IP中通过IP地址和端口号的方式,来确定网络中一个主机上的一个程序。但IP地址是一长串数字,并不便于人们记忆,于是人们发明了一种叫做主机名的东西,并用hosts文件夹来描述主机名和IP地址之间的对应关系。
最初,通过互连网信息中心(SRI-NIC)来管理这个 hosts 文件的。
- 如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件。
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网。
- 当用户通过域名访问互联网服务时,会先通过域名在本地的hosts文件中找到其对应的IP地址,然后再用这个IP地址去访问对应的服务。
但这样太麻烦了,于是产生了DNS系统。
- 由一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系。
- 如果新计算机要接入网络,或者某个计算机IP变更,就需要将对应信息注册到数据库中。
- 当用户通过域名访问互联网服务时,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。
至今,我们的计算机上仍然保留了hosts文件,这个hosts文件当中一般存储的是主机名与IP地址之间的映射,用户也可以在hosts文件中自主添加域名和IP映射关系,在域名解析的过程中会优先查找hosts文件的内容。
通过 cat /etc/hosts 可以查看hosts文件当中的内容。
2. 域名简介
域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,例如www.baidu.com。
- com:一级域名,表示这是一个工商企业域名。同级的还有.net(网络提供商)和.org(开源组织或非盈利组织)等。
- baidu:二级域名,一般对应的就是公司名。
- www:只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议。
3. 域名解析过程
在浏览器中输入url 后,如果 url 当中包含域名,则需要进行域名解析。
- 首先会在浏览器的DNS缓存中去查询是否有对应的记录,如果查询到记录就可以直接得到对应的IP地址,完成解析。
- 如果在浏览器的DNS缓存中没有找到,就会去查询操作系统中的DNS缓存,如果查询到对应的IP地址则完成解析。
- 如果在操作系统的DNS缓存中没有找到,就会去查找本地的hosts文件,如果查询到对应的IP地址则完成解析。
- 如果在本地的hosts文件中也没有找到,就会去本地DNS服务器中查找。如果在本地DNS服务器中有对应域名的缓存,则直接返回对应的IP地址,完成解析。
- 如果本地DNS服务器中仍然没有找到,那么本地DNS服务器就会拿着域名去根DNS服务器中询问,根DNS服务器会告诉本地DNS顶级域名服务器的IP地址。
- 本地DNS拿到顶级域名服务器的IP地址后,就会拿着域名去找顶级DNS服务器,顶级域名服务器会告诉本地DNS权威域名服务器的IP地址。
- 本地DNS服务器拿着域名去权威域名服务器中,查询域名对应的IP地址,最终将该域名对应的IP地址返回给浏览器,此时整个域名解析过程就完成了。
4. 使用 dig 工具分析 DNS 过程
我们可以使用dig工具来查看域名解析的过程,例如查看百度域名www.baidu.com的解析过程。
dig工具的分析结果如下:
结果解释:
- 开头位置是dig工具的版本号。
- 第二部分是服务器返回的详情,其中status参数为NOERROR表示查询成功。
- QUESTION SECTION表示待查询的域名。
- ANSWER SECTION表示查询的结果,首先www.baidu.com被查询成了www.a.shifen.com,而最终www.a.shifen.com被查询成了两个具体的IP地址。
- 最下面是一些结果统计,包含查询时间和DNS服务器的地址等。
5. 经典面试题:浏览器中输入 url 后,发生的事情
没有固定答案,越详细越好
二. ICMP 协议
ICMP(Internet Control Message Protocol,互联网控制消息协议)是TCP/IP协议族中的一个网络层协议,用于在IP网络中传递控制消息和错误报告。它与IP协议紧密协作,帮助网络设备传递关于网络状态的反馈、错误通知或请求信息。
ICMP协议的定位
在TCP/IP四层模型中,网络协议栈自顶向下分为应用层、传输层、网络层和数据链路层。
其中应用层最典型的协议有HTTP、HTTPS和DNS等,传输层最典型的协议有TCP和UDP,网络层最典型的协议就是IP,数据链路层最典型的协议就是MAC帧协议,但实际网络层还有两种协议叫做ICMP和IGMP。
ICMP、IGMP和IP协议虽然都属于网络层的协议,但ICMP协议和IGMP协议属于IP的上层协议。
- 也就是说,IP的上层协议不一定就直接是传输层的协议,IP的上层协议有可能也属于网络层的协议,但就是位于IP的上层。
- 与之类似的,数据链路层当中的ARP协议和RARP协议,这两个协议虽然与MAC帧协议都属于数据链路层,但这两个协议属于MAC帧的上层协议。
1. ICMP 功能
- 确认 IP 包是否成功到达目标地址。
- 通知在发送过程中 IP 包被丢弃的原因。
- ICMP 也是基于 IP 协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。
- ICMP 只能搭配 IPv4 使用,如果是 IPv6 的情况下,需要使用 ICMPv6。
举个例子
2. ICMP 协议格式
ICMP大概分为两类报文。
- 一类是通知出错原因的。
- 一类是用于诊断查询的。
3. ping 命令
ping命令是基于ICMP协议实现的,通常用于测试本地主机与另一台主机之间的通信信道是否正常。
例如,使用ping www.baidu.com命令,测试本地主机与百度服务器之间的通信信道是否正常。
- 注意,此处ping的是百度的域名,该域名会由DNS解析成IP地址。
- ping命令不仅能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live,生存时间)
- ping命令会先发送一个ICMP Echo Request给对端。
- 对端接收到之后,会返回一个ICMP Echo Reply。
4. 面试题:ping 是什么端口?
telnet对应的端口号是23,ssh对应的端口号是22,那ping对应的端口号是多少?
这是问问题的人设的一个圈套,ping命令是基于网络层的ICMP协议,而端口号是属于传输层的内容,因此ICMP协议根本就不关心端口号这样的信息。
因此,ping命令实际是绕过了传输层的,在Linux当中实际也有绕过传输层的一套网络编程接口,叫做原生套接字。
5. traceroute 命令
traceroute命令也是基于ICMP协议实现的,traceroute命令可以遍历数据包传送到目标主机所经过的所有路由器。
例如,使用traceroute www.baidu.com命令,遍历数据包传送到百度服务器所经过的所有路由器。