目录
一、DNS协议
二、ICMP协议
1.ICMP协议
2.ping命令
在讲完了OSI模型每层协议的讲解后,还有一些协议我们需要再讲解一下。
一、DNS协议
DNS是一整套从域名映射到IP地址的系统,也叫做域名解析服务,端口号为53。
我们生活中访问网站都会使用url,或者说是网址。
比如,我打开百度,该网站的url为https://www.baidu.com,其中www.baidu.com就叫做域名,表示我访问的是百度的服务器。
在编写网络通信代码的时候,我们都在使用IP地址,甚至在整个网络通信的协议栈中我们也看不到和域名有关的任何东西。
所以,网络通信就是通过IP地址实现的,而不是域名。域名需要转换成IP地址,然后才能进行通信,这也就是DNS协议的工作。
对于网络的使用者而言,IP地址是一长串数字,它的记忆是十分反人类的。而使用域名就会好很多,不管是拼音还是英语单词,都会更好记忆。
所以DNS协议负责建立域名和IP地址的映射关系,在用户需要访问某网站时,域名字符串会根据映射转换为IP地址,从而实现网络通信。
最初,在每个人的主机上都有一个hosts文件,该文件专门用于存放域名和IP地址的映射关系,现在这个文件也依旧存在在我们的主机上。
最初,互联网中的主机还很少,互联网信息中心(SRI-NIC)会管理这个hosts文件的内容。如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件。其他计算机也需要定期下载最新版本的hosts文件才能正确上网。
随着网络的快速发展,hosts文件的更新越来越快,内容也越来越多,不断下载新版本文件的弊端越来越明显。
所以DNS系统就诞生了。
DNS是一个组织的系统管理机构,维护系统内的每个主机的IP和域名的对应关系,该机构就像CA机构一样,具有权威性。
如果新计算机接入网络,需要将这个信息注册到数据库中。
用户输入域名的时候,会自动将URL的信息通过UDP发送到DNS的服务器,由DNS服务器检索数据库,得到对应的IP地址,返回给用户。
其实在我国曾经也有过中文的域名解析协议,曾经以插件的形式伴随着早期网民,它的名字叫3721.大家有兴趣可以看看有关的故事,了解我们现在使用的搜索引擎和一些互联网企业的发展历史。
有了一个权威机构提供域名解析服务,域名命名规则也出现了,以www.baidu.com为例。
- com: 一级域名,表示这是一个企业域名,同级的还有net(网络提供商),org(非盈利组织) 等。
- baidu:二级域名,一般是公司名或者组织的名称。
- www:只是一种习惯用法,写不写都可以。直接输入baidu.com也可以访问百度的服务器。
二、ICMP协议
1.ICMP协议
ICMP协议是一个网络层协议,它能确认IP数据包是否成功到达目标地址。如果数据没有发送成功,会通知发送端IP数据包被丢弃的原因。
ICMP协议基于IP协议工作,所以它属于网络层协议。
ICMP只能搭配IPv4使用,如果使用IPv6,需要使用对应的ICMPv6协议。
如图所示,主机A向主机B发送数据,数据经过多次局域网转发后到了路由器2,路由器2为了获取主机B的MAC地址,发送ARP请求,但是主机B电源关闭,路由器2发送多次请求都收不到主机B的ARP应答。
此时路由器2就会返回一个Destination Unreachable数据包给主机A,主机A收到以后就知道了数据传送错误的原因了。
这种功能在我们之前的协议中是没有的,虽然TCP能触发超时重传,但传输错误的原因是找不到的。虽然对于网络使用者来说,不知道传输失败的原因也不影响使用,但是对于网络管理员来说,他们需要知道错误的原因,才能修复网络,此时ICMP协议就派上用场了。
ICMP也有自己的协议格式(了解即可)
ICMP报文大致分为两类,一类是通知出错原因,一类是用于诊断查询。
下图便是ICMP常见代码和代码所代表的内容。
2.ping命令
我们在验证一个机器的网络是否连接成功时,通常都会使用ping。
下图就是我在Windows的cmd上对www.baidu.com使用ping命令的结果,当然这个命令也可以在Linux上执行。
要注意,ping命令的对象是域名,而不是url,只有域名可以通过DNS解析成IP地址。
ping命令有以下特点:
- ping命令不仅能验证网络的连通性,而且也会统计响应的时间和TTL(IP协议中的生存时间,也就是跳数)。
- ping命令会先发送一个IMCP的Echo Request给对端,对端接收到之后会返回一个IMCP的Echo Reply。
- ping命令是通过ICMP协议实现的,是网络层的协议,而端口号属于传输层的概念,平命令根本没有向上达到传输层,所以它没有端口号。
如图所示,traceroute+域名的指令,可以查询当前主机到目标主机之前经历了多少路由器,这也是基于ICMP协议实现的。
这个命令只能在Linux中使用,可以看到我的数据发到百度服务器的每一跳节点的信息。