网络通信流程

通信目标:主机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)

  1. 接收 FRAME_A_TO_C,先校验帧尾 FCS,数据无误泽继续;
  2. 检查目的 MAC: 00:00:0C:CC:CC:01 判断是自己的左口,接收该帧;
  3. 剥离以太网帧头 + 帧尾,取出内部的 IP_PACKET;
  4. 将 IP 数据包交给路由器C自身的网络层进行解析

4.2 网络层处理

  1. 解析IP头部:读取目的IP:192.168.2.20、源IP:192.168.1.10
  2. 判断IP归属:对比自身所有接口IP(192.168.1.1/192.168.2.1),发现目的IP不是自己,不向上交付。zhilian
  3. 查询路由表:
序号 目的网络 子网掩码 下一跳 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 逐层解封装,接收数据

  1. 链路层:拆帧,取出 IP 包
  2. 网络层:目的 IP 是自身,拆 IP 头,取 TCP 段
  3. 传输层:目的端口 80,拆 TCP 头,取 HTTP 数据
  4. 应用层:解析 HTTP GET 请求,通信完成
相关推荐
小江的记录本2 小时前
【网络安全】《网络安全常见攻击与防御》(附:《六大攻击核心特性横向对比表》)
java·网络·人工智能·后端·python·安全·web安全
2401_873479403 小时前
应急响应:勒索软件攻击源IP分析,如何通过IP地址查询定位辅助溯源?
网络·tcp/ip·安全·网络安全·ip
拾薪5 小时前
[SuperPower] Brainingstorm - 流程控制架构分析
网络·人工智能·ai·架构·superpower·brainstorming
IMPYLH5 小时前
Linux 的 rm 命令
linux·运维·服务器·网络·bash
white-persist5 小时前
【vulhub shiro 漏洞复现】vulhub shiro CVE-2016-4437 Shiro反序列化漏洞复现详细分析解释
运维·服务器·网络·python·算法·安全·web安全
黄俊懿6 小时前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第一节:DNS优化
网络·计算机网络·架构·系统架构·cdn·dns·架构设计
Byron Loong7 小时前
【网络】Python 怎么做TCP通讯
网络·python·tcp/ip
裕工实验室7 小时前
功率模块为什么一定要用陶瓷PCB?从结构到选材一篇讲清(附DPC / DBC / AMB选型逻辑)
网络·硬件工程·pcb工艺·材料工程
SilentSamsara7 小时前
HTTP/1.1 到 HTTP/3:每代协议解决了什么问题
网络·网络协议·tcp/ip·http·https