
通信目标:主机A(192.168.1.10)、主机B(192.168.2.20)
阶段1:主机A判断目标主机B是否和自己处在同一网段
主机A在发送数据前,必须先进行网段判断,这是TCP/IP协议栈的强制逻辑,步骤如下:
步骤1.1 提取自身 IP + 子网掩码,计算自身网段
主机A的IP:192.168.1.10,子网掩码:255.255.255.0
将IP和子网掩码转为二进制,执行按位与运算:
- 192.168.1.10 二进制:
11000000.10101000.00000001.00001010 - 255.255.255.0 二进制:
11111111.11111111.11111111.00000000 - 按位与结果:
11000000.10101000.00000001.00000000 - 转回十进制:192.168.1.0 → 这是主机 A 所在的网段;
步骤1.2用目的 IP + 子网掩码,计算目的主机B所在的网段
主机A知道目的IP是192.168.2.20,默认使用自身子网掩码计算对方网段。
- 192.168.2.20 二进制:
11000000.10101000.00000010.00010100 - 掩码二进制:
11111111.11111111.11111111.00000000 - 按位与结果:
11000000.10101000.00000010.00000000 - 转回十进制:192.168.2.0 → 这是主机 B 的网段
步骤1.3 对比两个网段,网段不同,判定为跨网段通信
主机A不会直接在自身网段中找B的MAC地址,而是将数据发送给 LAN1 的默认网关 192.168.1.1(路由器C)
阶段2:主机A获取路由器C的MAC地址(APR寻址)
主机A只知道网关的IP 192.168.1.1,但是数据链路层必须使用MAC寻址,因此发起 ARP请求:
主机A构造 APR 广播帧:
- 源 MAC:00:00:0A:AA:AA:AA
- 目的 MAC:
FF:FF:FF:FF:FF:FF(广播地址,LAN1 所有设备都能收到) - 内容:(谁的 IP 是 192.168.1.1?请把你的 MAC 发给我)
LAN1内只有路由器C匹配IP,回复ARP单播响应:
- 源 MAC:00:00:0C:CC:CC:01
- 目的 MAC:00:00:0A:AA:AA:AA
- 内容:(我是 192.168.1.1,我的 MAC 是 00:00:0C:CC:CC:01)
主机A将 192.168.1.1 00:00:0C:CC:CC:01 存入 ARP 缓存,后续继续使用
阶段3:主机A逐层完成数据封装
**3.1 应用层:**生成 http 请求报文
cpp
GET /index.html HTTP/1.1
Host: 192.168.2.20
Content-Type: text/html
内容记为:HTTP_DATA
3.2 传输层:需要建立 TCP 连接
添加头部字段:
- 源端口:12345(A 随机生成的临时端口)
- 目的端口:80(HTTP 默认端口)
- 序列号、确认号、ACK 标志位
封装后: TCP头部 + HTTP_DATA = TCP_SEGMENT
3.3 网络层 ( 源 / 目的 IP 全程固定不变)
- 源 IP:192.168.1.10(主机 A)
- 目的 IP:192.168.2.20(主机 B)
- TL:64(初始值,防环路)
- 协议号:6(标识上层为 TCP)
封装后:IP头部 + TCP_SEGMENT = IP_PACKET
3.4 数据链路层 (以太网帧)
添加以太网帧头 + 帧尾, MAC地址指向网关C
- 帧头:源 MAC:00:00:0A:AA:AA:AA(主机 A) 、目的 MAC:00:00:0C:CC:CC:01(路由器 C 左口)、类型字段:0x0800(标识上层为 IPv4)
- 帧尾:FCS 校验序列(防数据传输错误)
最终完整数据帧: FRAME_A_TO_C
主机 A 将该帧 通过 LAN1 发送给路由器 C
阶段4: 路由器C接收帧 在自身网络层解析IP
4.1 数据链路层处理(路由器C)
- 接收 FRAME_A_TO_C,先校验帧尾 FCS,数据无误泽继续;
- 检查目的 MAC: 00:00:0C:CC:CC:01 判断是自己的左口,接收该帧;
- 剥离以太网帧头 + 帧尾,取出内部的 IP_PACKET;
- 将 IP 数据包交给路由器C自身的网络层进行解析
4.2 网络层处理
- 解析IP头部:读取目的IP:192.168.2.20、源IP:192.168.1.10
- 判断IP归属:对比自身所有接口IP(192.168.1.1/192.168.2.1),发现目的IP不是自己,不向上交付。zhilian
- 查询路由表:
| 序号 | 目的网络 | 子网掩码 | 下一跳 IP | 出接口 | 路由类型 |
|---|---|---|---|---|---|
| 1 | 192.168.1.0 | 255.255.255.0 | 直连 | GE0/0(左口) | 直连路由 |
| 2 | 10.0.0.0 | 255.255.255.0 | 直连 | GE0/1(右口) | 直连路由 |
| 3 | 192.168.2.0 | 255.255.255.0 | 10.0.0.2 | GE0/1(右口) | 静态路由 |
| 4 | 0.0.0.0 | 0.0.0.0 | 10.0.0.2 | GE0/1(右口) | 默认路由 |
4.路由表匹配规则:
路由器C执行 最长前缀匹配(路由器查询核心算法)
路由器C用目的IP(192.168.2.20)和每条目的网络的子网掩码进行按位与,计算匹配网段,判断是否吻合。
- 匹配条目 1:192.168.1.0/24
192.168.2.20 & 255.255.255.0 = 192.168.2.0 ≠ 192.168.1.0 → 不匹配
- 匹配条目 2:10.0.0.0/24
192.168.2.20 & 255.255.255.0 = 192.168.2.0 ≠ 10.0.0.0 → 不匹配
- 匹配条目 3:192.168.2.0/24
192.168.2.20 & 255.255.255.0 = 192.168.2.0 = 条目 3 目的网络 → 匹配成功
- 匹配条目 4:默认路由 0.0.0.0/0(所有 IP 都匹配)仅当无精确路由时才用
此处已有精确匹配,不选用
5.从匹配条目提取转发关键信息
从路由表条目 3 中,路由器 C 确定:
出接口:GE0/1(右口,连接中转网段 10.0.0.0/24)
下一跳 IP:10.0.0.2(路由器 D 的左口 IP)
路由类型:静态路由,无需再查其他条目
阶段5:路由器 C 网络层完成 IP 包修改
路由查询完成后,C 在网络层对 IP 包做强制修改(端到端 IP 不变,仅修改 IP 头字段):
- TTL 字段减 1:64 → 63(防止路由环路)
- 重新计算IP 头部校验和(TTL 变化后原校验和失效)
- 源 / 目的 IP保持不变:源 192.168.1.10,目的 192.168.2.20
- 判定:目的 IP 不是 C 自身 IP,不向上交给传输层 / 应用层,直接向下交给数据链路层封装转发
阶段 6:路由器 C 获取下一跳(路由器 D)的 MAC 地址
路由器 C 知道下一跳 IP 是 10.0.0.2(D),但数据链路层需要 MAC,因此在中转 LAN3发起 ARP 请求:
- 源MAC: 00:00:0C:CC:CC:02
- 目的 MAC:FF:FF:FF:FF:FF:FF
- 内容:(
谁是10.0.0.2?请告诉我你的MAC)
LAN3中只有路由器D匹配IP,回复ARP响应:
- 源MAC: 00:00:0D:DD:DD:01
- 目的MAC: 00:00:0C:CC:CC:02
- 内容:(我是10.0.0.2,我的MAC是 00:00:0D:DD:DD:01)
阶段7: 路由器C重新封装以太网帧,转发给D
IP 数据包完全不变,仅替换数据链路层 MAC 地址:
- 源 MAC:路由器 C 右口
00:00:0C:CC:CC:02 - 目的 MAC:路由器 D 左口
00:00:0D:DD:DD:01 - 类型字段:0x0800(IPv4)+ 帧尾 FCS
- 帧发出:路由器 C → 路由器 D
阶段8:路由器D接收数据 + 查路由表 + 转发给主机B
8.1 D 收到帧,目的 MAC 是自身左口 MAC,拆帧取出 IP 包,上交网络层。
8.2 D的路由表
| 目的网络 | 掩码 | 下一跳 | 出接口 |
|---|---|---|---|
| 10.0.0.0 | /24 | 直连 | GE0/0 |
| 192.168.2.0 | /24 | 直连 | GE0/1 |
8.3 目的 IP:192.168.2.20 → 匹配直连网段 192.168.2.0/24
8.4 出接口:GE0/1(右口),下一跳:直连主机 B
8.5 D 修改 IP 头(TTL=63→62,重算校验和)
8.6 D通过 ARP 获取主机 B 的 MAC:00:00:0B:BB:BB:BB
8.7 D 重新封装帧,转发给 B
- 源 MAC:D 右口
00:00:0D:DD:DD:02 - 目的 MAC:B
00:00:0B:BB:BB:BB
阶段9:主机 B 逐层解封装,接收数据
- 链路层:拆帧,取出 IP 包
- 网络层:目的 IP 是自身,拆 IP 头,取 TCP 段
- 传输层:目的端口 80,拆 TCP 头,取 HTTP 数据
- 应用层:解析 HTTP GET 请求,通信完成