%% # 纲要 > 主干纲要、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]: > ![image-20230910233855086|674](_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-1ED72445F5B3DA3C6000C8B368012E6E.png) > <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> 场景如下图所示: ![img|525](_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-F650D6AEAC7FF527DF10562A794C51B2.jpg) 答:仅属于同一网段的 **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 通。 也可**在二者中间加入一台交换机或集线器**,效果相同。 > ![image-20230910152501937|626](_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-CED728FE668079A95E61940FA1C6C127.png) ##### (2)A 与 B 通过交换机相连,交换机同时连接路由器一端。 (**家用路由器类似于该形式**) ![image-20230910150433227|410](_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-4DB72AF447FFABDF14284204029FA6BA.png) A 和 B 通过交换机直连,**A 发送的消息经过交换机只会传递给 B**,不经过路由器,交换机不会向路由器所接的端口发送。 ##### (3)A 与 B 通过集线器相连,集线器同时连接路由器一端。 ![img|455](_attachment/02-开发笔记/07-计算机网络/总结/网络上两台主机之间的通信过程.assets/IMG-网络上两台主机之间的通信过程-0BFFD4B992899BB4A9DF9A4E04D466E6.png) 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)