计算机网络

2.8k 词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
╔══════════════════════════════════════════╗
║ Ethernet Frame (数据链路层) ║
║ ┌────────────┬────────────┬──────────┐ ║
║ │ MAC Header │ IP Packet │ CRC Tail │ ║
║ │ │ │ │ ║
║ │ │ ┌────────┬──────────┐ │ ║
║ │ │ │ IP hdr │ TCP/UDP │ │ ║
║ │ │ │ │ Segment │ │ ║
║ │ │ │ │ ┌──────┐ │ │ ║
║ │ │ │ │ │ App │ │ │ ║
║ │ │ │ │ │ Data │ │ │ ║
║ │ │ │ │ └──────┘ │ │ ║
║ │ │ └────────┴──────────┘ │ ║
║ └────────────┴──────────────────────┘ ║
╚══════════════════════════════════════════╝

交换机视角

描述的是交换机如何转发数据帧(主要根据 MAC 地址):

  1. 只处理带有目标 MAC 地址的数据帧;
  2. 查找 MAC 地址表(MAC→端口);
  3. 找到就从对应端口转发;
  4. 找不到就广播给所有端口(学习 MAC 表)

交换机负责在一个局域网内部,基于 MAC 地址,把帧“从 A 发到 B”

1
2
3
4
5
6
7
┌───────────────┐
│ 局域网(LAN) │ ← 局部物理网络
│ ┌───────────┐ │
│ │ 子网 A │ │ ← 一个LAN里可能有一个或多个子网(如通过VLAN)
│ └───────────┘ │
└───────────────┘


主机视角

描述的是主机(如你的电脑)如何确定数据的发送方式:

  1. 主机知道自己和目标的 IP 地址;

    一台主机知道目标 IP 地址,通常是因为用户告诉了它(通过域名、IP输入),或者它自己去查了(DNS/协议发现)

  2. 判断是否在同一个子网(通过子网掩码);

1
2
192.168.1.10  & 255.255.255.0  = 192.168.1.0
192.168.1.200 & 255.255.255.0 = 192.168.1.0
  1. 在同一子网:用 ARP 协议获取对方 MAC 地址,直接发送;

ARP 是一个用于将 IP 地址解析为 MAC 地址的协议。

在以太网通信中,尽管应用层用的是 IP 地址,但真正在数据链路层上传输的是 MAC 地址帧。因此,主机在发送数据时,需要知道目标设备的 MAC 地址 才能发送帧。

1
2
3
4
Who has 192.168.1.3? Tell 192.168.1.1

192.168.1.3 is at 00:1C:42:2E:60:4A

你访问的所有外部网站,其实都走的是“先发给你家路由器的 MAC 地址”,然后由路由器转发出局。

  1. 不在同一子网:用 ARP 获取默认网关的 MAC 地址,把数据发给网关

    主机存有默认网关(通常是路由器)的 IP 地址



路由器视角

描述的是路由器根据 IP 地址来决定下一跳:

  1. 处理目标 IP 地址的数据包;
  2. 查找路由表(IP→下一跳);
  3. 查到就从指定接口发出;
  4. 查不到就回送一个不可达 ICMP 报文。

你主机 IP 是:192.168.1.10
目标 IP 是:10.0.0.3
你发不出去 → 把包交给默认网关(比如:192.168.1.1

路由器会查它的路由表:

1
2
3
4
Destination        Next Hop         Interface
10.0.0.0/24 192.168.2.2 eth1
192.168.1.0/24 Direct eth0

发现 10.0.0.0/24 这个目标网段要通过 eth1 口发出去,下一跳是 192.168.2.2,于是它就把你的包从 eth1 发出。

整体流程回顾:主机 → 路由器 → 目标主机

你是主机A(192.168.1.10),想访问主机B(10.0.0.3),它不在你的子网:

主机端:

  1. 你发现 10.0.0.3 不在同一子网;
  2. 你查到默认网关是 192.168.1.1;
  3. 你发 ARP 问:“谁是 192.168.1.1?” → 得到 MAC 地址;
  4. 把数据包(目标 IP 是 10.0.0.3)发送给 网关的 MAC

路由器端:

  1. 路由器收到包后查看 IP 层的目标地址 → 是 10.0.0.3
  2. 查自己的路由表:这个 IP 要走 eth1 接口;
  3. 看看这条路径的 下一跳(next hop) 是谁,比如 10.0.0.1
  4. 然后发 ARP 请求:“谁是 10.0.0.1?”
  5. 得到回应:10.0.0.1 对应 MAC 为 AA:BB:CC:DD:EE:FF
  6. 构造帧,目的 MAC 就是这个,然后从 eth1 发出。

场景假设:

你电脑(主机A,IP: 192.168.1.10)要访问远程主机B(IP: 10.0.0.3),它不在你的子网。现在一步步讲这个数据包是怎么走出去的,三者怎么配合。


✅ 第一阶段:主机如何发送数据?

🧠 主机要解决:

  • 目标 IP 是谁?
  • 我和它是否在同一个子网?
  • 我要把包发给谁?目标设备还是路由器?

✅ 主机操作:

  1. 判断目标 IP 10.0.0.3 不在同一子网(比如掩码 /24);
  2. 查到默认网关是 192.168.1.1
  3. 查 ARP 表:有没有 192.168.1.1 对应的 MAC 地址?
    • 没有 → 发 ARP 请求:Who has 192.168.1.1?
    • 收到回应 → 得到 MAC 地址;
  4. 构造数据帧:
    • IP 层目的地 IP = 10.0.0.3
    • 帧目标 MAC = 192.168.1.1 的 MAC
  5. 把帧发出去给交换机

✅ 第二阶段:交换机如何中继数据?

🧠 交换机只看 MAC 地址(不看 IP)

  1. 收到帧,看到目标 MAC 是 AA-BB-CC-DD-EE-FF(路由器的 MAC);
  2. 查 MAC 地址表,发现这个 MAC 在端口 2;
  3. 把帧从端口 2 转发给路由器;
  4. 不修改任何内容,纯转发,像“局域网邮递员”。

✅ 第三阶段:路由器如何转发数据?

🧠 路由器要解决:

  • 目标 IP 是哪里?我该从哪个接口发出去?
  • 目标主机在哪个子网?是否直接可达?

✅ 路由器操作:

  1. 查看 IP 头,目标是 10.0.0.3
  2. 查自己的路由表,发现:
    • 10.0.0.0/24 可达,通过 eth1 接口;
    • 下一跳是 10.0.0.1
  3. 查 ARP 表:10.0.0.1 对应 MAC 有吗?
    • 没有 → 发 ARP 请求:Who has 10.0.0.1?
    • 得到回应后,记录 MAC 地址;
  4. 构造新的以太网帧:
    • 源 MAC = 路由器接口 MAC
    • 目标 MAC = 10.0.0.1 的 MAC
    • IP 层仍然是目标 IP = 10.0.0.3
  5. 把帧从 eth1 发出去
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──────────────┐
│ 主机A │ ← 判断子网 → ARP → 发帧
│ 192.168.1.10 │
└──────┬───────┘
↓ 发送数据帧(Dst MAC = 路由器MAC)
┌──────┴───────┐
│ 交换机 │ ← MAC表查表 → 端口转发
└──────┬───────┘

┌──────┴───────┐
│ 路由器 │ ← IP路由查表 → 下一跳ARP → 转发
│ 192.168.1.1 │
└──────┬───────┘
↓ 发往下一个子网或目标主机