%%
# 纲要
> 主干纲要、Hint/线索/路标
# Q&A
#### 已明确
#### 待明确
> 当下仍存有的疑惑
**❓<font color="#c0504d"> 有什么问题?</font>**
# Buffer
## 闪念
> sudden idea
## 候选资料
> Read it later
%%
# 二层、三层通信
> [!NOTE] 二层、三层通信过程
>
> 下图参见 [^1](P132)
>
> ![[_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-1E45E29429256F42F0C7C37C321173A2.png|666]]
>
> **==局域网==内通信**(**二层通信**):
>
> - **同一 "链路层广播域" 下的设备之间基于 "==MAC 地址==" 以及 "==以太网、Wi-Fi 等链路层协议==" 进行寻址通信**。
> - 交换机是二层设备,根据 "MAC 地址" 在 "**==局域网内==(同一链路层广播域内)**" 进行转发。
>
> **==不同网段间==通信**(**三层通信**):
>
> - **不同网段间的设备**基于 "**==IP 地址==**" 以及 "**==IP 协议==**" 进行寻址通信。
> - 路由器是三层设备,根据 "IP 地址" 在 "**==不同网段间==**" 进行转发。
>
> ![[_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-A3A6BE6386D0D857B4CF1A351E795745.png|669]]
> [!caution] 两个**不同网段的 IP 地址**之间无法 "直接" 通信,必须**经过网关(即路由器)转发数据包**。
>
> 如果没有网关,则两个不同的网络之间**不能**进行通信,即使两个网络在链路层直连(例如连接在同一台交换机或集线器、或者网线直连),IP 协议也会 **根据子网掩码** 判定**两个网络中的主机处在不同的网络里**,从而无法互通。
> [!NOTE] 局域网的定义
>
> **经==二层 or 一层设备==所相连的==各台主机接口或路由器接口==**,**配置 IP 地址&子网掩码为同一网段**,
> 则物理上处在同一 "**链路层广播域**",逻辑上构成了一个 "**局域网**"。
>
>
>
> ![[_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-BECFF5FD5561F3294BD35FDE54F6BD46.png|602]]
>
> 如果只是**数据链路层**直连,但 **IP 不在同一网段**,则设备**并不属于同一局域网**。
>
<br><br><br>
# 数据包中 IP 地址和 MAC 地址的变化
> [!summary]
>
> - **源、目的 IP 地址始终不变**(不考虑 NAT、VPN 等情况)
> - **源、目的 MAC 地址在==同一子网内==(同一广播域)传输时不变,==跨网段==时发生改变**。
>
在**不考虑 NAT,VPN** 等特殊情况时,变化情况如下 [^2]:
- (1)数据包传递过程中,**==源、目的 IP 地址始终不变==**;
- 在**网络层**使用 **IP 地址** 进行寻址,故**源、目的 IP 地址作为唯一标识**显然不会发生变化。
- (2)数据包在 **同一网段内经 "交换机" 转发** 时,**源、目的 MAC 地址不变**。
- (3)数据报在 **==不同网段==间经过 "==路由器==" 转发**时,**源、目的 MAC 地址==改变==**。
- **源 MAC 地址**变更为 => **该路由器==出接口的 MAC 地址==**;
- **目的 MAC 地址**变更为 => **==下一跳路由器==接口的 MAC 地址**。
> [!example]
>
> 参见说明[^3]
>
> ![[_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-2C0B2649F9227B34D8BEF93E1F23830F.png|679]]
>
>
<br><br><br>
# 总结:两台主机之间的通信过程
源主机**查询自身路由表**,检查 **==目的 IP 地址==是否与自己在同一网段**,据此区分两种情况:
- 1)两台主机位于同一网段上,则
- **源主机查询 ==ARP 缓存表==(或广播 APR 请求)获取==目的主机的 MAC 地址==**,**封装数据帧后直接向目的主机发送数据包**。
- 2)两台主机不在同一网段上,则:
- **源主机查询 ==ARP 缓存表==(或广播 APR 请求)获取==网关的 MAC 地址==,将数据包发送给网关(路由器)做进一步转发**。
- **网关收到数据包后==查询自身路由表==,获取==下一跳路由器的 IP 地址==, <br>再查询 ==APR 缓存表==获取下一跳路由器接口的 ==MAC 地址==**,
而后重新封装数据包的 **"源 MAC 地址、目的 MAC 地址"**,从出接口**转发给下一个路由器**。
- 以此反复,直到**目的主机位于某一路由器直连网段时**,路由器重复 ARP 过程 **获取目的主机 MAC 地址**,
重新封装数据包后发送给**目的主机**。
> [!NOTE] 同网段的两台主机之间的通信
> ![[02-开发笔记/07-计算机网络/网络层/ICMP 协议#^2shgdo]]
> [!NOTE] 不同网段间的两台主机之间的通信过程
>
>
>
> 参见 [^4]:
> 
>
<br>
## 详细过程
##### (1)源主机检查自身路由表,确定目的 IP 地址是否与其位于同一网络下
| 情况 | 操作 |
| ---- | ----------------------------------------------------------------------------------- |
| 同一网段 | **数据包将会被==直接发送给目的主机==** |
| 不同网段 | - **根据默认路由**,**数据包将被发送给==默认网关==**。<br>- 若**不存在默认路由**(未配置默认网关),则无法发送数据包,报错请求失败,不可达。 |
##### (2)源主机检查自身的 ARP 缓存表,获取下一个目的设备接口的 MAC 地址
| 情况 | 操作 |
| ---- | -------------------------------------------------- |
| 同一网段 | 源主机将从 ARP 缓存表中获取 ** "==目的 IP 地址==" 对应设备的 MAC 地址** |
| 不同网段 | 源主机将从 ARP 缓存表中获取 **"==默认网关=="(即路由器接口)的 MAC 地址**。 |
若 APR 缓存表中没有所需的 MAC 地址,则源主机将会**发起 ARP 广播请求**。
若 **APR 请求无应答**,则源主机无法发送数据包,将报错请求失败、不可达。
##### (3)源主机封装数据包
源主机封装完成将要发送的数据帧,包括**源 IP 地址、源 MAC 地址、目的 IP 地址、目的 MAC 地址**。
| 情况 | 目的 MAC 地址 |
| ---- | ----------------------------- |
| 同一网段 | **==目的 IP 地址==对应的接口的 MAC 地址** |
| 不同网段 | **==默认网关==的接口的 MAC 地址** |
##### (4)源主机发送数据包
数据帧**经由源主机的网卡**发出,**发给本地链路上的默认网关的接口**,或者**目的 IP 地址对应的设备接口**。
##### (5)(若源、目的 IP 不在同一网段) **默认网关收包、拆包、重新封装数据包并进行转发**
若源、目的 IP 不在同一网段,则**源主机将数据包发送给默认网关(路由器)**,
路由器将执行以下操作:
1. 收到数据包后将进一步**检查自身的==路由表==和 ==ARP 缓存表==,确定==下一跳地址==及对应的==转出端口==、==下一跳设备接口的 MAC 地址**==;
2. **重新封装数据包**:
- 将**源 MAC 地址**修改为**路由器==出接口==的 MAC 地址**
- 将**目的 MAC 地址** 修改为 **==下一跳设备接口==的 MAC 地址**
- **将 IP 头部的 TTL 减一**
3. **从出接口转发出数据包**。
##### (6)目的主机接收数据包
当数据帧到达目的主机的**网络接口**(网卡)后:
- 在**数据链路层**,网卡**会检查帧中的==目的 MAC 地址==**,若与其网卡自身的 MAC 地址匹配,则**解封装数据帧**,去掉帧头、MAC 头部、帧尾,**向上交付给网络层**。
- 在**网络层**,主机里的协议栈会**检查 IP 数据报中的==目的 IP 地址==**,若与其自身 IP 地址匹配,则接受 IP 数据报。
- 在涉及分组时,则需要**对多个 IP 数据报进行重组**,得到完整的数据。
- 最后,去掉 IP 头部,交付给传输层。
- 在**传输层**,协议栈**检查数据的正确性和完整性**,对于多个 TCP 报文段则需要**按序列号重组**。
- 得到完整数据后,**检查端口号**,将数据**交付给对应的应用程序处理**。
![[_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-85DC8099FD4FF9B3BF1E3C720DC9B73A.png|560]]
<br><br>
# FAQ
#### ❓<font color="#c00000">两台电脑经过网线直连,但二者配置的 IP 地址不在同一网段,能否 ping 通?</font>
> [!NOTE] **两台电脑网线直连后,必须配置二者 IP 地址属于同一网段,才能互相 ping 通**。
答:**==均不能 ping 通==**。
参见下方说明:
![[05-工具/网络相关工具/思科 Cisco Packet Tracer/Cisco Packet Tracer 工具#组网模拟示例#场景二:两台主机 IP 地址不在同一网络|Cisco Packet Tracer 工具]]
#### ❓ <font color="#c00000">多台主机经交换机相连,但不在同一网段,能否互相通信?</font>
场景如下图所示:

答:仅属于同一网段的 **PC1 与 PC4**、**PC2 与 PC3** 能够**两两互相 ping 通**。
原因:PC1 的路由表中仅有**指向其 "自身所在网络 `192.168.1.0/25`" 的路由**,**==不存在指向另一网段 `192.168.1.128/25` 的路由==**,<br>故 **PC1 无法 ping 通 PC3 和 PC4**,其余同理。
> [!caution] 尽管四台主机**在 "数据链路层" 上属于==同一个广播域==**,但是在 "**网络层**" 上**分属两个不同的网段**。
>
> 在 **PC1 路由表**中不存在匹配项的情况下,**根本不会发送数据包**,**故==不会触发 APR 请求==**,
> 所以尽管理论上四台主机 "**在数据链路层**" 属于同一个广播域,但**实际场景下并不存在 "仅链路层互通" 的情况**,
>
<br><br><br>
# 常见场景下的通信示例
几种常见场景,参见 [[05-工具/网络相关工具/思科 Cisco Packet Tracer/Cisco Packet Tracer 工具#组网模拟示例|Cisco Packet Tracer 工具-组网模拟示例]] ⭐⭐⭐
### 同一网段内的两台主机间通信示例(不同拓扑结构)
同一网段内的两台主机 A 与 B 进行通信,根据 A 和 B 的连接方式可能是如下几种[^5]:
##### (1)A 与 B 通过网线或交换机直连。
![[_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-A775098E86CD64CF693CCA953179D406.png|338]]
两台电脑用 "**交叉线**" 直连,配置 IP 地址为同一网段,则可以互相 ping 通。
也可**在二者中间加入一台交换机或集线器**,效果相同。
> 
##### (2)A 与 B 通过交换机相连,交换机同时连接路由器一端。 (**家用路由器类似于该形式**)

A 和 B 通过交换机直连,**A 发送的消息经过交换机只会传递给 B**,不经过路由器,交换机不会向路由器所接的端口发送。
##### (3)A 与 B 通过集线器相连,集线器同时连接路由器一端。

A 与 B 之间的所有通信,包括 ARP、A 与 B 之间的数据帧都被 HUB 以广播方式,发送给广播域里的每一端。
因此**路由器会收到 A 与 B 之间的通信数据包,但由于==数据包目的 MAC 地址非路由器==,会被路由器丢弃。**
<br><br>
# ♾️参考资料
# Footnotes
[^1]: 《计算机网络(第八版)》——谢希仁
[^2]: [关于MAC地址和IP地址在传输过程中变与不变的问题——计网络——网络层学习常遇问题](https://blog.csdn.net/qq_45947664/article/details/121111511)
[^3]: [数据帧转发过程中IP地址及MAC地址的变化](https://zhuanlan.zhihu.com/p/515239767)
[^4]: [📔【计算机网络】两台主机的通信过程](https://imageslr.com/2021/computer-communicate.html#%E4%B8%A4%E5%8F%B0%E4%B8%BB%E6%9C%BA%E7%9A%84%E9%80%9A%E4%BF%A1%E8%BF%87%E7%A8%8B)
[^5]: [同一网段内的两台主机通信是否需要路由器?](https://www.zhihu.com/question/41496681)