Ping 某个域名的详细过程
# ICMP 协议
ICMP(Internet Control Message Protocol | 网络控制消息协议)是 TCP/IP 协议族的一个子协议,工作在网络互联层(网络层)。ICMP 协议是一种面向无连接的协议,用于在 IP 主机、路由器之间传递出错报告控制信息。控制消息是指网络是否连通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
# 常见报文类型
ICMP 消息类型 | 用途说明 |
---|---|
回显请求 | Ping 工具通过发送 ICMP 回显消息检查特定节点的 IPv4 连接以排查网络问题。类型值为 0 |
回显应答 | 节点发送回显答复消息响应 ICMP 回显消息。类型值为 8 |
重定向 | 路由器发送“重定向”消息,告诉发送主机到目标 IPv4 地址更好的路由。类型值为 5 |
源抑制 | 路由器发送“源结束”消息,告诉发送主机它们的 IPv4 数据报将被丢弃——因为路由器上发生了拥塞。于是,发送主机将以较低的频度发送数据报。类型值为 4 |
超时 | 这个消息有两种用途。第一,当超过 IP 生存期时向发送系统发出错误信息。第二,如果分段的 IP 数据报没有在某种期限内重新组合,这个消息将通知发送系统。类型值为 11 |
无法到达目标 | 路由器和目标主机发送“无法到达目标”消息,通知发送主机它们的数据无法传送。类型值为 3 |
其中无法到达目标消息中可以细分为一下几项:
无法到达目标消息 | 说明 |
---|---|
不能访问主机 | 路由器找不到目标的 IPv4 地址的路由时发送“不能访问主机”消息 |
无法访问协议 | 目标 IPv4 节点无法将 IPv4 报头中的“协议”字段与当前使用的 IPv4 客户端协议相匹配时会发送“无法访问协议”消息 |
无法访问端口 | IPv4 节点在 UDP 报头中的“目标端口”字段与使用该 UDP 端口的应用程序相匹配时发送“无法访问端口”消息 |
需要分段但设置了 DF | 当必须分段但发送节点在 IPv4 报头中设置了“不分段(DF)”标志时,IPv4 路由器会发送“需要分段但设置了 DF”消息 |
# 地址解析协议 ARP
我们经常会遇到这样的问题:已经知道了一个主机的 IP 地址,需要找到其对应的物理地址(MAC <Media Access Control,介质访问控制> )。因为将 IP 数据报封装到 MAC 帧里面的时候需要知道目的地址的 MAC 地址。地址解析协议 ARP 的作用就是根据主机的 IP 地址来获得物理地址。
为什么需要做这件事呢?
这是因为 TCP/IP 网络协议栈是分层的,每层负责不同的功能。IP 层(layer 3)负责路由寻路,换句话说,如果目的机器和客户端不在同一个网络,IP 层会穿过错综复杂的中间网络(互联网)找到目的机器所在的网络。
当报文在某一个网络中传播时(可能源机器和目的机器本来就在同一个网络,也可能报文在路由过程中执行下一跳步骤),IP 层的功能就没有用了,这时候起作用的是 2 层网络(链路层),大多数情况下就是以太网。以太网负责把多个机器连到一起,组成一个最小单位的局域网。在以太网中,不同机器的标识是 MAC 地址,MAC 地址是机器在生产的时候厂商为机器设定的。可以使用 ip link 命令查看网卡的 MAC 地址,比如我的机器上这个命令的输出是:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 50:7b:9d:ca:08:f0 brd ff:ff:ff:ff:ff:ff
2
3
4
我机器的网卡对应的 MAC 地址就是 50:7b:9d:ca:08:f0,这是一个 6 字节的数字,表示的时候每个字节用 : 分隔开,长度是 48 比特。
有了 MAC 地址,同一个以太网络上的两台机器才能够通信。机器 A 需要知道机器 B 的 MAC 地址,才能发送以太网帧;交换机收到报文之后,根据目的 MAC 地址决定应该从哪个端口发送出去;目的机器读取报文的 MAC 地址才能知道报文是不是要发给自己的。
每个主机都设有一个 ARP 高速缓存(ARP cache),这里面放着的是主机已经知道的 IP 地址和 MAC 地址的映射表,并且这个映射表还是经常动态更新的。
# Address Resolution Protocol —— ARP 的工作原理
当主机 A 想要同本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如果有,就在 ARP 高速缓存中查找其对应的硬件地址,再把这个硬件地址写入 MAC 帧里,然后通过局域网把 MAC 帧发往此硬件地址。也有可能在 ARP 高速缓存中查不到主机 B 的 IP 地址(主机 A 缓存为空,或主机 B 刚加入局域网),这样也就无法知道主机 B 的 MAC 地址,这时候就需要使用到 ARP 了。
按以下步骤来获得主机 B 的硬件地址。
主机 A 的 ARP 进程在本局域网上以广播的形式发送一个 ARP 请求分组,格式如图 a 所示。
以太网目的MAC以太网源MAC帧类型硬件类型46OP发送端以太网MAC发送端IP地址目的MAC目的IPFF-FF-FF-FF-FF-FF00-50-56-C0-00-0108060800100-50-56-C0-00-011.1.1.100-00-00-00-00-001.1.1.3其中 OP 含义可选为:1:表示 ARP 请求 2:表示 ARP 应答 3:表示 RARP 请求 4:表示 RARP 应答。 更多关于 ARP 报文参考该文ARP 协议报文格式及 ARP 表_changsoon-CSDN 博客_arp 报文格式 (opens new window)
在本局域网上的所有主机上运行的 ARP 进程都收到了这个 ARP 请求分组。
主机 B 在 ARP 请求分组中发现了自己的 IP 地址,就向 A 主机发送 ARP 响应分组,以单播的形式直接发给 A,以如图 b 所示。同时主机 B 知道了 A 的 IP 地址和 MAC 地址,就将主机 A 的 IP 地址和 MAC 地址写入 ARP 高速缓存中,并按同样的 ARP 报文格式返回给主机 A。其他主机在对比 IP 地址之后,发现与自己的 IP 地址不同,就丢掉分组。
目的地址源地址…源IP目的IP…ICMP报文00-50-56-C0-00-0300-50-56-C0-00-011.1.1.11.1.1.3Echo request主机 A 收到主机 B 的 ARP 响应分组之后,这样就知道了主机 B 的 MAC 地址,同时把主机 B 的 IP 地址和 MAC 地址写入 ARP 高速缓存,然后就把这个 MAC 封装到 ICMP 协议的二层报文中向主机 B 发送。
目的地址源地址…源IP目的IP…ICMP报文00-50-56-C0-00-0300-50-56-C0-00-011.1.1.11.1.1.3Echo request当主机 B 收到了这个报文后,发现是主机 A 的 ICPM 回显请求,就按同样的格式,返回一个值给主机 A,这样就完成了同一网段内的 ping 过程。
目的地址源地址…源IP目的IP…ICMP报文00-50-56-C0-00-0100-50-56-C0-00-031.1.1.31.1.1.1Echo answer
上面所描述的情况是在同一局域网下的情景,如果主机 A 要和不在同一局域网下的主机 B 进行通信,发送 IP 数据报。首先主机 A 将主机 B 的 IP 地址同自己的子网掩码进行比对,发现不在同一局域网内,则利用 ARP 请求分组,跟本局域网上的路由器的 IP 地址来获取路由器的 MAC 地址,然后将剩下的工作交给路由器去做即可。
# ARP 的四种典型情况
发送方是主机,要把 IP 数据报发送到本网络上的另一个主机。这时利用 ARP 找到目的主机的硬件地址。
发送方是主机,要把 IP 数据报发送到另一个网络上的一个主机。这时利用 ARP 找到本网络上的一个路由器的硬件地址,然后把剩下的工作交给路由器去完成。
发送方是路由器,要把 IP 数据报发送到另一个网络上的一个主机。这时利用 ARP 找到本网络上的另一个路由器的硬件地址,然后把剩下的工作交给这个路由器去完成。
发送方是路由器,要把 IP 数据报发送到本网络上的一个主机。这时利用 ARP 找到目的主机的硬件地址。
# ping 某个域名的整个过程
PING 是应用层直接使用网络层 ICMP 的一个例子,没有经过传输层的 TCP 或 UDP。
主机查找本地系统 hosts 文件的 DNS 缓存,如果存在该域名对应的 IP,则获取 IP,跳转到第 8 步;如果不存在,则继续。
主机向本网络路由器发起请求,查找路由 DNS 缓存,如果存在该域名对于的 IP,则获取 IP,跳转到第 8 步;如果不存在,则继续。
路由器向本地 ISP(互联网提供商)的 DNS 服务器发起请求,查找 DNS 服务器的缓存,如果存在该域名对应的 IP,则跳转到第 7 步;如果不存在,则继续。
本地 DNS 服务器向根域名服务器发起请求,根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器 dns.com 的 IP 地址。
本地域名服务器向顶级域名服务器 dns.com 进行查询,顶级域名服务器 dns.com 告诉本地域名服务器,下一步应查询的权限服务器 dns.abc.com 的 IP 地址。
本地域名服务器向权限域名服务器 dns.abc.com 进行查询,权限域名服务器 dns.abc.com 告诉本地域名服务器,所查询的主机的 IP 地址。
本地域名服务器最后把查询结果——该域名对应的 IP 地址告诉给主机。
至此,主机知道了该域名的 IP 地址。
以上部分主要是根据域名获取对应的 IP 地址,涉及 DNS 解析
主机通过子网掩码判断该 IP 地址是本网段还是跨网段,由于本网段比较简单,我们以跨网段进行讲解。
主机先查看本地 ARP 高速缓存,查看表中是否有本网络路由器(网关)的 MAC 地址,如果有,则获取 MAC 地址,跳转到第 12 步;如果没有,则继续。
主机使用 ARP 解析协议获取到本网段路由的 MAC 地址。
至此,主机知道本网络一个路由的 MAC 地址。
以上部分主要是获取本网络一个路由的 MAC 地址,涉及 ARP
主机将 ICMP 报文封装成 IP 数据报,IP 数据报的源地址为主机的 IP 地址,目的地址是域名对应的 IP 地址;
主机将 IP 数据报封装成 MAC 帧,MAC 帧的源地址为主机的 MAC 地址,目的地址是路由器的 MAC 地址;
路由器接收到 ICMP 报文之后,发现 MAC 帧的目的地址是自己,IP 地址是主机想要访问的 IP 地址,则将 MAC 帧的源地址改为自己的 MAC 地址,目的地址改为本网段另一个路由的 MAC 地址(也要通过 ARP 协议获取),转发下去。
直到最后一个路由根据 ARP 协议,找到了主机想要访问的 IP 地址对应的主机的 MAC 地址,然后将 ICMP 报文封装成 MAC 帧发送给该域名主机。
由于 ARP 协议具有相互学习性,域名主机接收到主机发送的 ICMP 回送请求报文之后,将向本网络路由发送 ICMP 回送回答报文,该路由又会转发下去。
当主机收到域名主机发送的 ICMP 回送回答报文之后,这样就表明该主机到域名主机是连通可达的。