> For the complete documentation index, see [llms.txt](https://lfool.gitbook.io/computer-network/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lfool.gitbook.io/computer-network/di-si-zhang-wang-luo-ceng/3.-wang-luo-ceng-xie-yi.md).

# 3. 网络层相关协议

## 1. ARP 协议

对于数据链路层，通过 MAC 地址找到对应的主机。A 和 B 通信有两种情况：

* 情况一：A 和 B 在同一局域网内
* 情况二：A 和 B 不在同一局域网内

**对于情况一：主机 1 和主机 3 通信**

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDyQfP39nCY8pSpUYAs%2F-MDypQthm-X5cVTBbDfz%2Fimage.png?alt=media\&token=465ef138-b83a-4f0f-b21d-7a889926b774)

* 应用层：递交给传输层
* 传输层：分组，递交给网络层
* 网络层：对于第一个分组，加上源 IP 地址和目标 IP 地址，递交给数据链路层
* 数据链路层：加上源 MAC 地址和目标 MAC 地址，还有 FCS

  对于目标 MAC 地址，有两种情况

  * ARP 高速缓存里中映射，就可以直接知道
  * 如果没有，则源主机就会发送一条广播ARP请求分组，格式如图所示；对于目标主机接收到该请求后，会发送一条单播ARP响应分组给源主机。这样源主机就可以知道其MAC地址。

**情况二：主机** $$H\_1$$ **和主机** $$H\_2$$ **通信**

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDyQfP39nCY8pSpUYAs%2F-MDyrhqxjhZTxodCRtgG%2Fimage.png?alt=media\&token=6ade9b16-db28-4ea0-90a5-1429d572edcd)

其他过程都一样，单独说明 $$H\_1$$ 如何获取 $$H\_2$$ 的 MAC 地址

* 主机 $$H\_1$$ 知道主机 $$H\_2$$ 不和自己同一网段，直接把数据报发给默认网关
* 路由器 $$R\_1$$ 通过解封装和再封装，把数据报发送给下一跳路由器 $$R\_2$$&#x20;
* 路由器 $$R\_2$$ 把报文发送给主机 $$H\_2$$ ，封装方法和局域网的一样

**ARP协议：**&#x5B8C;成主机或路由器 IP 地址到 MAC 地址的映射（解决下一跳走哪的问题）

**ARP协议使用过程：**

* 检查 **ARP 高速缓存**，有对应表项则写入 MAC 帧，没有则用目的 MAC 地址为  FF-FF-FF-FF-FF-FF 帧封装并广播 ARP 请求分组，同一局域网中所有主机都能收到该请求。目的主机收到请求后就会向源主机**单播一个 ARP 响应分组**，源主机收到后将此映射**写入ARP 缓存**（10 - 20 min 更新一次）

**ARP 协议 4 中典型情况：**

1. 主机 A 发给**本网络**上的主机 B：用 ARP 找到主机 B 的硬件地址
2. 主机 A 发给**另一网络**上的主机 B：用 ARP 找到本网络上一个路由器（网关）的硬件地址
3. 路由器发给**本网络**的主机 A：用 ARP 找到主机 A 的硬件地址
4. 路由器发给**另一网络**的主机 B：用 ARP 找到本网络上的一个路由器的硬件地址

## 2. DHCP 协议

**获取 IP 地址的方法有两种：**

* 静态配置（管理员手动分配 IP 地址）
* 动态配置（通过 DHCP 服务器自动分配 IP 地址）

动态主机配置协议 DHCP 是**应用层**协议，使用 **客户/服务器** 方式，客户端与服务端通过**广播**方式进行交互，基于 **UDP**。

DHCP 提供**即插即用**联网的机制，主机可以从服务器动态获取 **IP 地址**、**子网掩码**、**默认网关**、**DNS 服务器名称**，允许**地址重用**，支持**移动用户加入网络**，支持**在用地址续租**。

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDywNIaP_sNMOBDlTzq%2F-MDzPXR6zLqEN3nZ_vFS%2Fimage.png?alt=media\&token=30d84f45-6ad3-4365-bc4f-a3a8ddb5ad90)

**DHCP 协议过程：**

1. 主机广播**DHCP发现**报文

   “有没有DHCP服务器呀”        试图找到网络中的服务器，向服务器获得一个IP地址
2. DHCP服务器广播**DHCP提供**报文

   “有！有！有！”        服务器拟分配给主机一个IP地址及相关配置，先到先得
3. 主机广播**DHCP请求**报文

   “我用你给我的IP地址啦？”         主机向服务器请求提供IP地址
4. DHCP服务器广播**DHCP确认**报文

   “用吧！”        正式将IP地址分配给主机

## 3. ICMP 协议

为了更有效地转发 IP 数据报和提高交付成功的机会

### 3.1 功能

ICMP 协议支持主机或路由器：

* **差错（或异常）报告**（发送 ICMP差错报文）
* **网络探询**（发送 ICMP 询问报文）

### 3.2 ICMP 报文

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDzQe8uXdQZOSlzhFqu%2F-MDzUAxBn8VQKHDwnh80%2Fimage.png?alt=media\&token=f32eb44d-8206-4ad5-8faa-862e6a981909)

### 3.3 ICMP 差错报告报文（5种）

1. **终点不可达**：当路由器或主机不能交付数据报时就向源点发送终点不可达报文。（**无法交付**）
2. **源点抑制**：当路由器或主机由于拥塞而丢弃数据报时，就向源点发送源点抑制报文，使源点知道应当把数据报发送速率放慢。（**拥塞丢数据，目前已不使用**）
3. **时间超过**：当路由器你手动生存时间 TTL=0 的数据报时，除丢弃数据报外，还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时，就把已收到的数据报片都丢弃，并向源点发送时间超过报文。（**TTL = 0**）
4. **参数问题**：当路由器或目的主机收到数据报的首部中有的字段的值不正确时，就丢弃该数据报，并向源点发送参数问题报文。（**首部字段有问题**）
5. **改变路由（重定向）**：路由器把改变路由报文发送给主机，让主机知道下次应将数据发送给另外的路由器。（**值得更好的路由**）

### 3.4 ICMP 差错报告报文数据字段

![](https://2396550738-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8zvqNNVZctOHx6v8No%2F-MDzQe8uXdQZOSlzhFqu%2F-MDzWgTRtpLnp99dnmm5%2Fimage.png?alt=media\&token=95c50ada-d51f-4dcb-a0b7-b6e654911b3f)

### 3.5 不应发送 ICMP 差错报文的情况

1. 对 **IMCP 差错报告报文**不再发送 ICMP 差错报告报文
2. 对第一个分片数据报片的所有**后续数据报片**都不发送 ICMP 差错报告报文
3. 对具有**组播地址**的数据都不发送 ICMP 差错报告报文
4. 对具有**特殊地址**（0.0.0.0 或 127.0.0.0）的数据不发送 ICMP 差错报告报文

### 3.6 ICMP 询问报文

1. 发送请求和回报报文

   主机或路由器向特定目的主机发出的询问，收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。

   **测试目的站是否可达以及了解其相关状态（ping）**
2. 时间戳请求和回答报文

   请求某个主机或路由器问答当前的日期和时间

   **用来进行时钟同步和测量时间**
3. 掩码地址请求和回答报&#x6587;**（×，已不使用）**
4. 路由询问和通告报&#x6587;**（×，已不使用）**

### 3.7 ICMP 应用

#### 1. ping

测试两个主机之间的连通性，使用了 **ICMP 回送请求和回答报文**

#### 2. Traceroute

跟踪一个分组从源点到终点的路径，使用了 **ICMP 时间超过差错报告报文**
