地址解析协议(ARP)
当主机通过数据链路发送数据的时候, IP数据包会先被封装为一个 数据帧,而 MAC地址会被添加到数据帧的 帧头。在这个过程中,ARP通过目标主机的IP地址,查询目标主机的MAC地址。
每台主机都设有一个 ARP 高速缓存,用来存放本局域网上各主机和路由器的 IP 地址到 MAC 地址的映射表,称 ARP 表。使用 ARP 来动态维护此 ARP 表。
ARP 工作在网络层,其工作原理如下:
- 主机 A 欲向本局域网上的某台主机 B 发送 IP 数据报时,先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址;
- 如果有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址;
- 如果没有,那么就通过使用目的 MAC 地址为 FF-FF-FF-FF-FF-FF 的帧来封装并广播 ARP 请求分组,使同一个局域网里的所有主机收到 ARP 请求;
- 本网段内所有收到ARP请求的主机查询自己的IP地址。如果发现自己符合条件(主机 B),就单播回复一个ARP响应数据包,其中包含自己的 IP 与 MAC 地址的映射关系;如果自己不符合条件,则忽略该数据包;
- 主机 A 在收到后将此映射写入 ARP 缓存,然后按查询到的硬件地址发送 MAC 帧。如果主机 A 一直没有收到ARP响应数据包,表示ARP查询失败。
ARP 用于解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。
动态主机配置协议(DHCP)
动态主机配置协议(DHCP)用于给主机动态地分配 IP 地址,它提供了即插即用联网的机制,这种机制允许一台计算机加入新的网络和获取 IP 地址而不用手工参与。
DHCP 服务器聚合 DHCP 客户端的交换过程如下:
- DHCP 客户机广播“DHCP 发现”消息,试图找到网络中的 DHCP 服务器,服务器获得一个 IP 地址。
- DHCP 服务器收到“DHCP 发现”消息后,向网络中广播“DHCP 提供”消息,其中包括提供 DHCP 客户机的 IP 地址和相关配置信息。
- DHCP 客户机收到“DHCP 提供”消息,如果接收 DHCP 服务器所提供的相关参数,那么通过广播“DHCP 请求”消息向 DHCP 服务器请求提供 IP 地址。
- DHCP 服务器广播“DHCP 确认”消息,将 IP 地址分配给 DHCP 客户机。
DHCP 允许网络上配置多台 DHCP 服务器,当 DHCP 客户机发出 DHCP 请求时,有可能收到多个应答消息。这时,DHCP 客户机只会挑选其中的一个,通常挑选最先到达的。
DHCP 服务器分配给 DHCP 客户的 IP 地址是临时的,因此 DHCP 客户机只能在一段有限的时间内使用这个分配到的 IP 地址。DHCP 称这段时间为租用期。
DHCP 是应用层协议,基于UDP,通过客户/服务器方式工作。DHCP 的客户端和服务器端需要通过广播方式来进行交互,原因是在 DHCP 执行期间,客户端和服务器都没有标识自己身份的 IP 地址,因此不可能通过单播的形式进行交互。采用 UDP 而不采用 TCP 的原因也很明显:TCP 需要建立连接,如果连对方的 IP 地址都不知道,那么更不可能通过双方的套接字建立连接。
网际控制报文协议(ICMP)
ICMP 是 IP 层协议,让主机或路由器报告差错和异常情况。ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。
ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文。
ICMP 差错报告报文用于目标主机或到目标主机上的路由器向源主机报告差错和异常情况。共有以下5种类型:
- 终点不可达。 无法交付
- 源点抑制。 拥塞丢数据
- 时间超过。 TTL = 0
- 参数问题。 首部字段有问题
- 改变路由(重定向)。 可通过更好的路由
不应发送 ICMP 差错报告报文的几种情况如下:
- 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
- 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
- 对具有组播地址的数据报都不发送 ICMP 差错报告报文。
- 对具有特殊地址(如 127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文。
ICMP 询问报文有 4 种类型: 回送请求和回答报文、时间戳请求和回答报文、掩码地址请求和回答报文、路由器询问和通告报文。
PING 和 Traceroute
PING 用来测试两台主机之间的连通性,Traceroute 用来跟踪分组经过的路由。
PING 使用了 ICMP 回送请求和回答报文, Traceroute 使用了 ICMP 时间超过报文。
PING 工作在应用层,它直接使用网络层的 ICMP,而未使用传输层的 TCP 或 UDP。
PING 完整工作过程:
本地主机处理流程:
- 在本地,ping 命令会构建一个 ICMP 数据包(构造回送请求报文)
- 将该 ICMP 数据包和目标 IP 地址给 IP 协议,IP 协议将本地地址作为源地址,与目的地址等构造 IP 数据包
- 根据本地 ARP 缓存查找目的地址 IP 对应的 MAC 地址,如果缓存中没有则通过 ARP 协议找到对应 IP的 MAC 地址。将 MAC 地址交给数据链路层以构造数据帧
- 经物理层发送给目的主机
目的主机处理流程:
- 目的主机接收到数据包
- 物理层接收到二进制数据流经数据链路层,按照以太网协议解析出数据帧,如果数据帧中的目标 MAC地址与本机 MAC 地址相同,则接收该数据包,否则丢弃该数据包。
- 接收到该数据包之后,经网络层解析出 IP 数据包,通过 IP 包头中的协议字段判断出是 ICMP 数据包。之后解析出 ICMP 数据包,发现是回送请求报文(ping request)后马上构建一个 ICMP 回送应答报文(ping reply)
- 将封装好的 ICMP 数据包经网络层、数据链路层、物理层发送回源主机
常见问题:
1. 为什么 ping 第一次一般会产生更多耗时?
因为 ping 第一次的时候,需要首先进行 ARP 解析,获取 IP 地址对应的 MAC 地址(同时将映射关系缓存), 而下次 ping 的时候会直接从 ARP 高速缓存读取,少了一个步骤,自然时间就缩短了!
Traceroute 完整工作过程:
- 通过封装一份 UDP 数据报(指定一个不可能使用的端口,30000以上),依次将数据报的 TTL 值置为 1、2、3…,并发送给目的主机。
- 当路径上第一个路由器收到 TTL 值为 1 的数据报时,首先将该数据报的 TTL 值减 1,发现 TTL 值为 0,而自己并非该数据报的目的主机,就会向源主机发送一个 ICMP 超时报文,traceroute 收到该超时报文,就得到了路径上第一台路由器的地址;
- 然后照此原理,traceroute 发送 TTL 为 2 的数据报时,会收到路径上第二台路由器返回的 ICMP 超时报文,记录第二台路由器的地址;
- 直到报文到达目的主机,目的主机不会返回 ICMP 超时,但由于端口无法使用,就会返回一份端口不可达报文给源主机,源主机收到端口不可达报文,证明数据报已经到达了目的地,停止后续的 UDP 数据报发送,将记录的路径依次打印出来,使命完成,结束任务。
[
](https://blog.csdn.net/shida_csdn/article/details/83751645)