


文章目录
[1. 应用程序怎样与另一台计算机通信?](#1. 应用程序怎样与另一台计算机通信?)
[2. 网络层的核心职责](#2. 网络层的核心职责)
[二、TCP/IP 分层体系与各层的职责](#二、TCP/IP 分层体系与各层的职责)
[1. 网络分层是什么?](#1. 网络分层是什么?)
[2. 应用层、TCP、IP 为什么都在传输数据?](#2. 应用层、TCP、IP 为什么都在传输数据?)
[3. IP 并不只能承载 TCP](#3. IP 并不只能承载 TCP)
[三、数据在应用层、TCP、IP 和链路层之间怎样封装?](#三、数据在应用层、TCP、IP 和链路层之间怎样封装?)
[1. 应用程序提供字节数据](#1. 应用程序提供字节数据)
[2. TCP 报文段](#2. TCP 报文段)
[3. IPv4 封装 TCP 报文段](#3. IPv4 封装 TCP 报文段)
[4. 以太网封装 IPv4 数据报](#4. 以太网封装 IPv4 数据报)
[四、网络设备、网络接口、IP 地址和 MAC 地址的关系](#四、网络设备、网络接口、IP 地址和 MAC 地址的关系)
[1. 什么是网络接口?](#1. 什么是网络接口?)
[2. 一个以太网接口可以同时具有 IP 地址和 MAC 地址](#2. 一个以太网接口可以同时具有 IP 地址和 MAC 地址)
[3. 为什么一个接口能够同时具有两种地址?](#3. 为什么一个接口能够同时具有两种地址?)
[4. 一个网络接口也可能具有多个 IP 地址](#4. 一个网络接口也可能具有多个 IP 地址)
[5. IP 地址和 MAC 地址分别标识什么?](#5. IP 地址和 MAC 地址分别标识什么?)
[6. "网络接口"和"协议层"不能混为一谈](#6. “网络接口”和“协议层”不能混为一谈)
[1. 主机](#1. 主机)
[2. 路由器](#2. 路由器)
[3. 主机和路由器是网络角色](#3. 主机和路由器是网络角色)
[4. 网络节点](#4. 网络节点)
[1. 为什么有目的 IP,还需要路由表?](#1. 为什么有目的 IP,还需要路由表?)
[2. 路由表的作用](#2. 路由表的作用)
[3. 路由与转发的区别](#3. 路由与转发的区别)
[4. 下一跳是什么?](#4. 下一跳是什么?)
[5. IPv4 数据报首部是否有两个目的 IP?](#5. IPv4 数据报首部是否有两个目的 IP?)
[6. 为什么路由器不需要知道整条路线?](#6. 为什么路由器不需要知道整条路线?)
[七、默认网关、默认路由和 0.0.0.0/0](#七、默认网关、默认路由和 0.0.0.0/0)
[1. 为什么主机需要默认网关?](#1. 为什么主机需要默认网关?)
[2. 默认路由](#2. 默认路由)
[3. 默认网关是在电脑内部吗?](#3. 默认网关是在电脑内部吗?)
[4. 默认网关是主机专有的吗?](#4. 默认网关是主机专有的吗?)
[5. 如果无法到达目标,是否都交给默认网关?](#5. 如果无法到达目标,是否都交给默认网关?)
[八、ARP:下一跳 IP 怎样对应到当前链路上的 MAC 地址?](#八、ARP:下一跳 IP 怎样对应到当前链路上的 MAC 地址?)
[1. 为什么已经确定下一跳 IP,还需要 MAC 地址?](#1. 为什么已经确定下一跳 IP,还需要 MAC 地址?)
[2. ARP 的作用](#2. ARP 的作用)
[3. ARP 缓存](#3. ARP 缓存)
[4. ARP 缓存会不会作为整张表传给数据链路层?](#4. ARP 缓存会不会作为整张表传给数据链路层?)
[九、ARP 缓存与交换机 MAC 地址表的区别](#九、ARP 缓存与交换机 MAC 地址表的区别)
[1. ARP/邻居缓存解决什么问题?](#1. ARP/邻居缓存解决什么问题?)
[2. 以太网交换机 MAC 地址表解决什么问题?](#2. 以太网交换机 MAC 地址表解决什么问题?)
[3. 它们怎样配合?](#3. 它们怎样配合?)
[1. 网络拓扑](#1. 网络拓扑)
[2. A 构造 IPv4 数据报](#2. A 构造 IPv4 数据报)
[3. A 根据路由信息选择下一跳](#3. A 根据路由信息选择下一跳)
[4. A 解析下一跳 MAC 地址](#4. A 解析下一跳 MAC 地址)
[5. R 接收数据报](#5. R 接收数据报)
[6. R 向 B 发送](#6. R 向 B 发送)
[7. 最终目的 IP 与下一跳如何区分?](#7. 最终目的 IP 与下一跳如何区分?)
[8. 多路由器转发的情况](#8. 多路由器转发的情况)
[1. 路由器不需要证明整个路径必然成功](#1. 路由器不需要证明整个路径必然成功)
[2. 没有可用路由时会怎样?](#2. 没有可用路由时会怎样?)
[3. 有默认路由但最终目标不可达,会怎样?](#3. 有默认路由但最终目标不可达,会怎样?)
[4. 如果路由器之间形成环路呢?](#4. 如果路由器之间形成环路呢?)
[1. 接收到以太网帧后,并不是直接交给 Java 程序](#1. 接收到以太网帧后,并不是直接交给 Java 程序)
[2. IP 层收到数据后是否必然向上传输?](#2. IP 层收到数据后是否必然向上传输?)
[3. 如果目的 IP 是本机地址,就一定交给 TCP 吗?](#3. 如果目的 IP 是本机地址,就一定交给 TCP 吗?)
[4. IP 地址、端口号、Socket 的关系](#4. IP 地址、端口号、Socket 的关系)
[十三、IP 的尽力而为服务与 TCP 的可靠传输](#十三、IP 的尽力而为服务与 TCP 的可靠传输)
[1. IPv4 为什么不能保证一定送达?](#1. IPv4 为什么不能保证一定送达?)
[2. TCP 如何在 IP 基础上提供可靠字节流?](#2. TCP 如何在 IP 基础上提供可靠字节流?)
[3. IP 不可靠是否意味着链路层也不可靠?](#3. IP 不可靠是否意味着链路层也不可靠?)
[1. 不同层可以具有自己的差错处理能力](#1. 不同层可以具有自己的差错处理能力)
[2. 当前链路的可靠性与端到端可靠性是不同的问题](#2. 当前链路的可靠性与端到端可靠性是不同的问题)
[3. 链路层帧头会逐跳变化,是否表示上层数据始终累积可靠性?](#3. 链路层帧头会逐跳变化,是否表示上层数据始终累积可靠性?)
[4. 数据停留在协议层中的时间,不决定可靠性等级](#4. 数据停留在协议层中的时间,不决定可靠性等级)
[5. TCP 已经确认的数据,应用程序就一定处理完成了吗?](#5. TCP 已经确认的数据,应用程序就一定处理完成了吗?)
[6. TCP 能提供可靠字节流,是否意味着它在任何情况下都不会失败?](#6. TCP 能提供可靠字节流,是否意味着它在任何情况下都不会失败?)
[十五、以一次 Java 网络通信串联全部机制](#十五、以一次 Java 网络通信串联全部机制)
[1. 一个 IP 数据报是否携带"最终目的 IP"和"每跳变化的下一跳 IP"?](#1. 一个 IP 数据报是否携带“最终目的 IP”和“每跳变化的下一跳 IP”?)
[2. 下一跳一定是一台路由器吗?](#2. 下一跳一定是一台路由器吗?)
[3. MAC 地址是不是对应整个网络设备?](#3. MAC 地址是不是对应整个网络设备?)
[4. 网络接口是否只有 IP,以太网接口是否只有 MAC?](#4. 网络接口是否只有 IP,以太网接口是否只有 MAC?)
[5. 路由表是否直接输出目的 MAC 地址?](#5. 路由表是否直接输出目的 MAC 地址?)
[6. ARP 缓存是不是交换机的 MAC 地址表?](#6. ARP 缓存是不是交换机的 MAC 地址表?)
[7. 网络层是否每次将整个 ARP 缓存交给链路层?](#7. 网络层是否每次将整个 ARP 缓存交给链路层?)
[8. 路由器收到 TCP/IPv4 数据时,是否需要拆到 TCP 层再重新封装?](#8. 路由器收到 TCP/IPv4 数据时,是否需要拆到 TCP 层再重新封装?)
[9. IP 目的地址为本机地址时,是否一定交给 TCP?](#9. IP 目的地址为本机地址时,是否一定交给 TCP?)
[10. 一个 TCP 报文段的载荷是否就是一个完整应用层报文?](#10. 一个 TCP 报文段的载荷是否就是一个完整应用层报文?)
[11. 协议层次越高,可靠性是否一定越强?](#11. 协议层次越高,可靠性是否一定越强?)
[12. 某个以太网帧经过检查后,数据是否在后续链路上持续受这一检查保护?](#12. 某个以太网帧经过检查后,数据是否在后续链路上持续受这一检查保护?)
[13. 如果每一段链路都没有检查出错误,能否证明应用层业务成功?](#13. 如果每一段链路都没有检查出错误,能否证明应用层业务成功?)
知识范围: TCP/IP 网络分层、应用数据封装、IP 地址与网络接口、主机与路由器、路由表与默认网关、逐跳转发、ARP、以太网交换机、接收端协议处理,以及不同层次的可靠性机制。
一、计算机网络为什么需要网络层?
1. 应用程序怎样与另一台计算机通信?
假设电脑 A 上运行一个 Java 客户端程序,需要向另一座城市的数据中心中的服务器 B 发送数据。
应用程序可以通过 Socket API 向 TCP 连接写入字节,例如:
OutputStream out = socket.getOutputStream();
out.write("Hello".getBytes(StandardCharsets.UTF_8));
这里假设 socket 对应一个已经建立的 TCP 连接。
"Hello" 通过 UTF-8 编码形成五个字节,应用程序通过 write() 将这些字节交给相应的输出流。
但是,这次应用程序的写入操作,本身没有指定:
- 数据应该经过哪台路由器。
- 当前应该从哪一个网络接口发送。
- 怎样找到下一个网络设备。
- 如何穿越多个不同的网络。
- 中途出现丢包时怎样处理。
这些事情需要操作系统中的网络协议栈与网络设备共同完成。
尤其当电脑 A 与服务器 B 不处于同一个局域网时,数据通常需要经过多个网络设备才能抵达目标。
所以计算机网络需要一套能够支持跨网络寻址和转发 的协议机制。
IP(Internet Protocol,互联网协议)便是其中最核心的协议之一。
2. 网络层的核心职责
在 TCP/IP 分层体系中,网络层的重要职责是:
通过网络层地址识别数据报的目标,使用路由与转发机制,使 IP 数据报能够跨越不同网络,向最终目的地传送。
其中涉及两个不同的概念:
寻址: IP 协议定义 IP 地址及其在数据报中的使用方式。
路由与转发: 网络设备依据路由信息,决定数据报应当从哪个接口发出,以及应该交给哪个下一跳。
IP 数据报不需要一次性知道整条路径上的所有设备。
中间路由器可以依靠自己的路由信息,逐跳处理数据报。
然而,IP 提供的基础数据报服务并不保证每个数据报必然送达。
二、TCP/IP 分层体系与各层的职责
1. 网络分层是什么?
网络分层,是按照通信功能对网络协议进行的逻辑划分。
常见的四层 TCP/IP 模型可以表示为:
应用层
↓
传输层
↓
网络层
↓
网络接口相关层次
从功能上看:
| 层次 | 核心职责与示例 |
|---|---|
| 应用层 | 定义应用程序之间交换业务数据的规则,例如 HTTP |
| 传输层 | 提供 TCP、UDP 等端点间的数据传输服务 |
| 网络层 | 使用 IP 数据报、IP 地址、路由与转发机制实现跨网络通信 |
| 网络接口相关层次 | 使用以太网、Wi-Fi 等技术完成当前链路上的数据交付 |
这里的四层是逻辑协议层次,并不表示:
- 每一层必须对应一台独立的计算机。
- 每一层都必须具有单独的物理网卡。
- 同一台设备只能实现其中一层的协议。
- 每一层的处理逻辑必须由一个独立的软件进程完成。
一台普通电脑可以同时完成以太网、IP、TCP 和应用层协议处理。
在常见操作系统中,大量 TCP/IP 协议处理逻辑由操作系统内核实现,应用程序使用 Socket API 等接口调用操作系统提供的网络能力。
2. 应用层、TCP、IP 为什么都在传输数据?
虽然它们都参与数据传输,但各自解决的问题不同。
应用层
应用层定义业务数据及应用程序之间如何解释这些数据。
例如,一个应用程序要发送:
Hello
应用程序负责决定这些字节具有怎样的业务意义。
TCP
TCP(Transmission Control Protocol,传输控制协议)提供面向连接的可靠、有序字节流服务。
它通过相关协议机制实现:
- TCP 连接的管理。
- 对字节流进行序列号管理。
- 确认应答与重传。
- 流量控制。
- 拥塞控制。
TCP 使用 IP 提供的数据报传送服务,使 TCP 报文段能够在网络中传送。
IP
IP 的主要任务是提供网络层的数据报传送机制。
例如,当 TCP 要向某个通信端点发送报文段时,IP 可以将 TCP 报文段作为 IPv4 数据报的载荷,按照目的 IP 地址和路由信息发送。
因此,TCP 关注的是其定义的端到端字节流传输服务;IP 关注的是数据报的网络层寻址、处理和转发。
两者的协议职责不能混同。
数据链路层
即使一个 IP 数据报已经明确了最终目的 IP,当前网络设备仍然需要把它交付给当前链路上的下一站。
在以太网链路中,数据通过以太网帧传输,帧中可以包含源 MAC 地址、目的 MAC 地址等链路层信息。
链路层解决当前链路上的交付问题,不负责独立决定整个互联网中的端到端路由。
3. IP 并不只能承载 TCP
IP 数据报的载荷可以属于不同的上层协议。
例如:
IPv4 数据报
├── TCP 报文段
├── UDP 数据报
└── ICMP 报文等
IPv4 首部中的 Protocol 字段用于标识其载荷所对应的上层协议。
因此,不能认为 IPv4 收到数据后一定交给 TCP。
三、数据在应用层、TCP、IP 和链路层之间怎样封装?
1. 应用程序提供字节数据
假设 Java 程序调用:
out.write("Hello".getBytes(StandardCharsets.UTF_8));
这次调用产生的五个 UTF-8 字节,通过与 TCP Socket 关联的输出流进入操作系统的 TCP 发送路径。
需要区分:
应用程序调用一次 write(),不等于网络中必定发送一个 TCP 报文段。
TCP 面向字节流,应用程序写入数据的次数与 TCP 实际形成报文段的数量之间,不存在固定的一一对应关系。
例如:
out.write(messageA);
out.write(messageB);
这两次写入的数据可能以不同方式被组织成 TCP 报文段。
某个 TCP 报文段可能只携带一份应用层消息的一部分,也可能携带来自多次应用写入的字节。
TCP 不会因为应用程序调用了两次 write(),就必然在传输过程中保留两个独立的应用层消息边界。
2. TCP 报文段
TCP 在发送路径中会根据协议状态和发送机制,将部分字节流组织成 TCP 报文段。
简化表示:
TCP 报文段
┌─────────────┬─────────────┐
│ TCP 首部 │ TCP 数据 │
└─────────────┴─────────────┘
TCP 首部包含源端口、目的端口、序列号、确认号、控制标志等信息。
TCP 数据部分承载需要传输的字节流中的相应字节。
特别需要区分:
TCP 数据部分不必然是一份完整的应用层报文。
一个应用层消息与 TCP 报文段之间没有固定的一对一关系。
如果应用程序希望识别完整消息的开始和结束,还需要由应用层协议明确规定消息边界,例如固定长度、长度字段或分隔符等方案。
这些机制属于应用层自己的协议设计,不是 TCP 自动提供的消息边界。
3. IPv4 封装 TCP 报文段
假设 TCP 报文段准备通过 IPv4 发送。
IPv4 层会添加 IPv4 首部。
得到:
IPv4 数据报
┌──────────────┬─────────────────────────┐
│ IPv4 首部 │ IPv4 载荷 │
│ ├───────────┬─────────────┤
│ │ TCP 首部 │ TCP 数据 │
└──────────────┴───────────┴─────────────┘
在这个例子中:
- 整体是 IPv4 数据报。
- IPv4 数据报由首部和载荷组成。
- IPv4 载荷承载 TCP 报文段。
- TCP 报文段内部又分成 TCP 首部和 TCP 数据部分。
IPv4 首部包含源 IP、目的 IP、协议类型、长度、TTL 等网络层相关信息。
TCP 首部和 IPv4 首部属于两个不同协议。
普通 IP 路由器进行基础 IPv4 转发时,通常不需要把 TCP 报文段进一步交给应用程序处理。
4. 以太网封装 IPv4 数据报
当 IPv4 数据报通过以太网发送时,还需要以太网封装。
简化结构:
以太网帧
┌────────────┬────────────┬────────────┬────────────┬──────────┐
│以太网首部 │ IPv4 首部 │ TCP 首部 │ TCP 数据 │帧校验等 │
└────────────┴────────────┴────────────┴────────────┴──────────┘
这里存在三种不同的协议数据结构:
- TCP 报文段。
- IPv4 数据报。
- 以太网帧。
它们存在封装关系,但不能当成同一种"数据包"。
重要区别:以太网帧不一定从源主机原封不动地到达最终目的主机
当 IP 数据报经过普通路由器时,接收链路上的以太网帧会被处理。
路由器将符合条件的 IP 数据报从另一个网络接口转发出去时,会使用输出链路适用的封装。
如果下一段仍是以太网,路由器就会构造新的以太网帧。
因此,同一个被转发的 IPv4 数据报,在不同以太网链路上可能被不同的以太网帧承载。
不能理解为源主机发送的第一个以太网帧,一直不变地穿越所有路由器直到服务器。
四、网络设备、网络接口、IP 地址和 MAC 地址的关系
这是本次追问中反复讨论的核心问题之一。
1. 什么是网络接口?
网络接口(Network Interface)是设备或操作系统参与网络通信所使用的接口。
网络接口既可以关联实际硬件,也可以是逻辑接口。
例如:
网络接口
├── 以太网接口
├── Wi-Fi 接口
├── 回环接口
└── VPN 等虚拟接口
因此:
以太网接口是网络接口的一种,网络接口不一定是以太网接口。
以太网接口与网络接口不是两个必定相互独立、分别属于不同网络层次的实体。
在普通计算机中,一个以太网接口可以参与以太网帧收发,同时关联 IPv4 地址配置。
2. 一个以太网接口可以同时具有 IP 地址和 MAC 地址
假设一台路由器具有两个以太网接口。
路由器 R
以太网接口 1:
IPv4 地址:192.168.1.1
MAC 地址:MAC-R1
以太网接口 2:
IPv4 地址:192.168.2.1
MAC 地址:MAC-R2
其中 MAC-R1 和 MAC-R2 是用于解释的符号。
这两个接口分别连接不同的网络。
在这一典型配置下,每个以太网接口都可以关联:
- 一个用于 IPv4 通信的 IP 地址。
- 一个用于以太网链路通信的 MAC 地址。
IP 地址与 MAC 地址的区别主要来自协议层次及其使用目的。
它们不必分别属于两个独立的物理接口。
3. 为什么一个接口能够同时具有两种地址?
因为同一个接口参与网络通信时,可以同时涉及不同协议的处理。
IPv4 地址供 IP 层使用,例如:
- 判断数据报的源地址或目的地址。
- 判断数据报是否属于本机接收范围。
- 根据目的地址进行路由选择。
- 参与 IPv4 通信端点识别。
MAC 地址供相应链路层技术使用,例如:
- 标识当前以太网链路上的接口地址。
- 作为以太网帧的源地址或目的地址。
- 供交换机等链路层设备进行帧转发处理。
因此,一个网络接口同时关联 IP 地址和 MAC 地址,并不矛盾。
它们参与的是不同协议机制。
4. 一个网络接口也可能具有多个 IP 地址
例如:
eth0:同一个以太网接口
MAC:
02:00:00:00:01:01
IPv4:
192.168.1.10/24
192.168.1.20/24
这是一个接口配置多个 IPv4 地址的示例。
同一个网络接口可以关联多个 IP 地址,不必一对一。
反过来,某些逻辑接口不使用普通以太网 MAC 地址,或者其 MAC 地址与下层物理接口的关系更复杂。
例如:
- 回环接口。
- 某些 VPN 虚拟接口。
- 桥接接口。
- VLAN 逻辑接口。
因此不能建立普遍规则:"任何网络接口都必须恰好有一个 IP 地址和一个 MAC 地址。"
5. IP 地址和 MAC 地址分别标识什么?
在典型 IPv4 以太网环境中:
IP 地址 是 IP 层使用的逻辑地址,通常配置在网络接口或相关逻辑接口上。
MAC 地址是以太网等链路层技术使用的地址,通常关联链路层接口。
不能简单定义成:
IP 地址 = 网络接口的身份
MAC 地址 = 整台网络设备的唯一身份
一台网络设备可能具有多个接口、多个 IP 地址和多个 MAC 地址。
网络设备改变接入网络后,也可能改变相应 IP 配置。
对于 MAC 地址,还需要考虑虚拟接口、软件配置地址、桥接设备等情况。
因此,两种地址都不应被理解为整台物理设备永久且唯一的身份标识。
6. "网络接口"和"协议层"不能混为一谈
这也是本次截图中需要澄清的另一项关系。
网络接口是计算机或操作系统参与网络通信所使用的接口对象。
而数据链路层、网络层、传输层是通信协议的逻辑功能层次。
例如:
网卡及驱动收到数据
↓
以太网帧处理
↓
IPv4 数据报处理
↓
TCP 报文段处理
↓
应用程序读取数据
这个过程并不要求每一层都具有一台独立设备。
也不意味着"IP 接口"和"以太网接口"一定是相互独立的实体。
网络接口、硬件设备与协议处理模块属于不同的概念维度,需要分别理解。
五、主机、路由器和网络节点
1. 主机
主机(Host)通常是作为网络通信源端或目的端的设备或系统。
例如:
- 普通电脑。
- 手机。
- 应用服务器。
主机可以运行应用程序,发出网络通信请求,也可以接收网络数据。
2. 路由器
路由器(Router)的核心作用是连接 IP 网络,并根据路由信息转发 IP 数据报。
假设:
网络 A
│
│
路由器 R
│
│
网络 B
路由器 R 具有连接两个网络 的接口。
例如:
接口 1 → 网络 A
接口 2 → 网络 B
当来自网络 A 的数据报需要到达网络 B 时,R 可以通过自己的 IP 转发功能,依据相关路由信息把数据报从适当接口转发出去。
3. 主机和路由器是网络角色
主机和路由器之间的区别,主要反映设备承担的通信角色。
这不意味着它们一定是完全不同的硬件类型。
例如:
一台 Linux 电脑如果配置了多个网络接口,并启用适当的 IP 转发功能,也可能承担路由器角色。
一台家用路由器除了进行路由转发,还可能运行:
- 管理界面。
- DNS 转发服务。
- 其他网络应用程序。
所以,主机和路由器之间不存在绝对的"硬件设备只能属于其中一种"的界限。
4. 网络节点
网络节点(Node)是更宽泛的概念。
在本次网络层讨论中,主要考虑参与 IP 通信的主机和路由器。
六、路由表、路由选择与下一跳
1. 为什么有目的 IP,还需要路由表?
IPv4 数据报首部包含最终目的 IP 地址。
例如:
源 IP:
198.51.100.10
目的 IP:
203.0.113.8
这两个地址均为文档示例地址。
目的 IP 表示数据报需要被送往的最终 IP 目标。
但是,这个目的 IP 并没有直接告诉发送设备:
应该从当前设备的哪个网络接口发送,才能朝目标方向继续传输?
因此,发送主机或路由器需要依据路由信息决定下一步处理。
2. 路由表的作用
路由表或相关转发表可以记录不同目的网络范围 所对应的转发方式 。
例如:
| 目的网络范围 | 下一步动作 |
|---|---|
| 网络 A | 由接口 1 直接发送 |
| 网络 B | 由接口 2 直接发送 |
| 某个远端网络 | 交给指定下一跳路由器 |
| 其他符合默认路由的目的地址 | 按默认路由处理 |
这只是路由机制的概念化表示。
真实的 IPv4 路由表通常包含:
- 目的网络前缀。
- 下一跳地址(如果需要)。
- 输出网络接口。
- 相应路由优先级及其他信息。
一条路由记录不必列出某个网络中的每一台主机。
它可以通过网络前缀描述一组地址。
3. 路由与转发的区别
**路由(Routing)**侧重于建立、获取和维护去往不同网络的路径信息。
**转发(Forwarding)**侧重于处理一个已经到达设备的具体数据报,根据转发信息决定怎样处理并送出。
例如:
路由器 R 已有一条去往网络 B 的路由信息。
当一个目的地址属于网络 B 的数据报到达时,R 可以依据转发表确定输出方向。
路由信息为转发提供依据。
但具体的数据报仍需要经过相应的检查、处理和输出过程。
4. 下一跳是什么?
下一跳(Next Hop)指当前转发过程中需要交付的下一站。
例如:
主机 A → 路由器 R1 → 路由器 R2 → 服务器 B
从 A 的角度:
最终目的 IP = B 的地址
当前下一跳 = R1
从 R1 的角度:
最终目的 IP = B 的地址
当前下一跳 = R2
从 R2 的角度,如果 B 位于直接连接的网络:
最终目的 IP = B 的地址
当前链路交付目标 = B
因此,下一跳可能是一台路由器,也可能直接就是最终目的主机。
下一跳会随着数据报所在的转发节点和该节点的转发决策而改变,但并不意味着每经过一跳都必须存在另一个独立的"下一跳路由器"。
5. IPv4 数据报首部是否有两个目的 IP?
这是本次追问中的重要误区。
普通 IPv4 首部包含源 IP 地址和目的 IP 地址。
但它通常没有另一个专门用来逐跳更新的"下一跳 IP 地址字段"。
需要区分:
最终目的 IP:
位于 IPv4 数据报首部。
下一跳 IP:
当前设备依据路由信息确定的转发决策信息。
下一跳 IP 不需要每次都作为新的字段加入 IP 数据报。
因此:
最终目的 IP 和当前下一跳 IP,是概念上两类不同的地址信息;它们并不必然是 IPv4 首部中的两个目的地址字段。
6. 为什么路由器不需要知道整条路线?
假设:
A → R1 → R2 → R3 → B
R1 不必事先掌握 A 到 B 的完整逐跳设备清单。
它只需要根据自己掌握的路由信息,决定当前应当如何处理目的地址为 B 的数据报。
例如:
R1 查询目的 IP
↓
找到匹配的转发信息
↓
决定交给 R2
随后 R2 再作自己的判断。
这就是逐跳转发模型。
当然,这种机制存在前提:
路由器需要具有相应的路由信息,当前链路及下一跳也需要满足必要的转发条件。
路由信息不一定永远准确,也不能单独证明整个端到端路径一定可达。
七、默认网关、默认路由和 0.0.0.0/0
1. 为什么主机需要默认网关?
假设一台家庭电脑具有:
IPv4 地址:
192.168.1.10
家庭路由器 LAN 接口:
192.168.1.1
当电脑向本地直接连接网络中的其他设备通信时,可能通过相应的直连路由 直接发送。
但当目标在其他网络中,电脑可能需要把数据报交给路由器,由路由器继续转发。
这就涉及默认路由与默认网关。
2. 默认路由
一个典型的 IPv4 默认路由可以表示为:
目的网络前缀:0.0.0.0/0
下一跳:192.168.1.1
其中:
0.0.0.0/0 是默认路由常见的目的网络前缀表示。
它不是一个新出现的"用于转发的路由器地址"。
192.168.1.1 才是这条假设路由指定的下一跳地址。
/0 的具体含义与 CIDR 前缀长度有关,表示零位网络前缀匹配要求,因此能够匹配所有 IPv4 目的地址。
但能够匹配所有 IPv4 地址,不意味着系统始终优先使用它 。
如果还有更具体、适用的路由,一般会优先依据最长前缀匹配等路由选择规则使用相应路由。
完整的 CIDR 位运算和路由匹配规则会在后续专门学习。
3. 默认网关是在电脑内部吗?
需要区分:
电脑中的路由信息 与下一跳网关设备或接口。
通常情况下,电脑操作系统内部维护自己的路由表。
路由表中可以记录:
默认路由:
0.0.0.0/0
下一跳:
192.168.1.1
但 192.168.1.1 通常是另一台设备------例如家用路由器------在当前局域网中的接口地址。
路由表在电脑中,不意味着这台网关路由器也必须在电脑内部。
某些虚拟网络环境的网关可以由本机软件或虚拟接口实现,因此不能从名称推断网关必然是外部独立硬件。
4. 默认网关是主机专有的吗?
不是。
路由器本身也可以设置默认路由 。
例如一台家用路由器可以向上游路由器配置默认路由。
因此:
- 普通电脑可以有默认路由。
- 服务器可以有默认路由。
- 路由器也可以有默认路由。
并且,不是所有数据报都会使用默认路由。
设备应根据其路由选择规则确定具体使用哪条路由。
5. 如果无法到达目标,是否都交给默认网关?
需要分情况。
如果存在适用且更具体的路由,设备可能按照那条路由处理。
如果没有其他更具体的可用路由,但存在适用的默认路由,可以使用默认路由。
如果没有可用路由,通常就无法完成正常转发。
还有一种情况:
设备虽然找到了一条可用的路由,但这条路由对应的后续网络并不一定真正可达。
因此,拥有默认路由不能证明最终目标可达。
八、ARP:下一跳 IP 怎样对应到当前链路上的 MAC 地址?
1. 为什么已经确定下一跳 IP,还需要 MAC 地址?
假设主机 A 要向外部网络发送 IP 数据报。
路由决策得出:
最终目的 IP:
203.0.113.8
下一跳 IP:
192.168.1.1
在当前链路使用以太网的情况下,主机 A 需要构造以太网帧。
以太网帧中的目的 MAC 应当对应当前链路要交付的对象。
如果下一跳为 192.168.1.1,A 还需要知道这个邻居在当前链路上使用的 MAC 地址。
于是需要邻居解析机制。
2. ARP 的作用
ARP(Address Resolution Protocol,地址解析协议)在典型 IPv4 以太网环境中用于建立 IPv4 地址与相应链路层 MAC 地址之间的关联。
例如:
下一跳 IP:
192.168.1.1
解析得到:
MAC-R1
其中 MAC-R1 表示路由器 R 的相应以太网接口 MAC 地址。
这使主机 A 能够构造以当前下一跳接口为目的的以太网帧。
ARP 属于与 IPv4 和链路层紧密协作的协议 。在典型以太网中,ARP 请求与应答通过独立的 ARP 帧 传输,而不是作为普通 TCP 数据封装在 IPv4 数据报内部。
不能因为 ARP 涉及 IP 地址,就推断它必然是 IPv4 协议内部的普通字段。
3. ARP 缓存
操作系统可以维护 ARP/邻居缓存,用于保存此前获得的邻居 IP 地址与 MAC 地址关系。
例如:
192.168.1.1 → MAC-R1
如果缓存中存在有效记录,系统可以复用这个结果。
如果没有适用的有效记录,典型 IPv4 以太网环境下可以通过 ARP 请求和应答获得邻居地址信息。
例如,主机 A 可以在相应广播域中询问 哪个设备拥有 192.168.1.1。
路由器 R 的对应接口可以响应其 MAC 地址。
4. ARP 缓存会不会作为整张表传给数据链路层?
不能把正常发送过程理解成:
IP 层保存整张 ARP 缓存
↓
每次发送时,把整张表交给链路层
↓
链路层自己重新查找
在典型实现中,IP 路由处理、邻居解析和链路层封装相互协作。
一次具体发送通常只需要确定:
- 输出网络接口。
- 本次链路交付目标。
- 这个目标对应的链路层地址。
操作系统可以使用已有邻居缓存记录取得相应 MAC 地址,再形成需要的链路层封装信息。
这不要求把整个 ARP 缓存作为数据报内容或每次发包的参数下传。
具体操作系统怎样组织路由缓存、邻居表、驱动接口和发送队列,属于更底层的实现问题;当前不必把某种特定内核的数据结构当成所有系统的通用规则。
九、ARP 缓存与交换机 MAC 地址表的区别
虽然它们都涉及 MAC 地址,但它们不是同一种数据结构。
1. ARP/邻居缓存解决什么问题?
核心问题是:
已知需要在当前链路上交付的邻居 IP 地址,怎样得到它对应的 MAC 地址?
例如:
192.168.1.1 → MAC-R1
它帮助发送端准备链路层目的地址。
2. 以太网交换机 MAC 地址表解决什么问题?
交换机接收到一个以太网帧时,需要决定将这个帧从哪个交换机端口转发。
普通二层交换机可以维护 MAC 地址转发表(FDB)。
例如:
MAC-R1 → 交换机端口 3
如果交换机知道目的 MAC 对应的输出端口,就可以根据这个信息进行相应转发。
交换机的具体学习、泛洪、过滤等规则在本阶段未完整展开。
但可以确认:
ARP/邻居缓存主要用于邻居 IP 到 MAC 的解析;交换机 MAC 地址表主要用于目的 MAC 到交换机端口的转发选择。
二者的查找输入、结果和执行主体不同。
| 机制 | 查找输入 | 结果 | 典型用途 |
|---|---|---|---|
| ARP/邻居缓存 | 邻居 IPv4 地址 | MAC 地址 | 准备本次链路层交付 |
| 交换机 MAC 地址表 | 目的 MAC(及相关 VLAN 上下文) | 交换机端口 | 在以太网交换机内转发帧 |
3. 它们怎样配合?
假设:
主机 A → 以太网交换机 S → 路由器 R
主机 A 首先依据路由信息决定将数据交给 R。
如果下一跳 IP 为 192.168.1.1,A 通过 ARP 得到 MAC-R1。
于是 A 构造:
以太网帧:
源 MAC = MAC-A
目的 MAC = MAC-R1
这个帧到达交换机 S。
交换机 S 根据目的 MAC-R1 以及自己的 MAC 转发表,确定使用哪个输出端口。
所以可以区分两个处理阶段:
主机 A: 根据路由与邻居解析结果,确定要发给哪个 MAC 地址。
交换机 S: 根据收到的帧的目的 MAC 地址,决定从哪个交换机端口继续转发。
主机的 ARP 缓存不等于交换机的 MAC 转发表。
交换机也通常不需要访问主机 A 的 IP 路由表来决定普通以太网帧的输出端口。
十、完整示例:从一台主机到另一台主机的逐跳转发
下面把路由表、ARP、以太网封装、IPv4 转发、不同接口的 MAC 地址全部放到同一个场景中。
1. 网络拓扑
假设:
网络 A 网络 B
主机 A 主机 B
│ │
│ │
└── 路由器 R ─────────────┘
│
两个以太网接口
具体配置:
| 设备 | IPv4 地址 | MAC |
|---|---|---|
| 主机 A | 192.168.1.10 | MAC-A |
| R 的接口 1 | 192.168.1.1 | MAC-R1 |
| R 的接口 2 | 192.168.2.1 | MAC-R2 |
| 主机 B | 192.168.2.20 | MAC-B |
假设两个网络分别为:
网络 A:
192.168.1.0/24
网络 B:
192.168.2.0/24
这里的 /24 是网络前缀长度,完整的网络划分与前缀计算机制将在后续阶段展开。
当前只需知道:这是两个不同的 IPv4 网络,R 分别连接它们。
2. A 构造 IPv4 数据报
A 要向 B 发送数据。
假设 IPv4 首部包含:
源 IP:
192.168.1.10
目的 IP:
192.168.2.20
这个目的 IP 是最终目标 B 的地址。
3. A 根据路由信息选择下一跳
假设 A 的路由表决定:
要去往 B 所在网络,需要通过下一跳 192.168.1.1。
所以:
最终目的 IP:
192.168.2.20
当前下一跳 IP:
192.168.1.1
A 当前不是直接把以太网帧发送给 B。
它需要先把数据交给 R 的接口 1。
4. A 解析下一跳 MAC 地址
A 使用邻居缓存或 ARP,获得:
192.168.1.1 → MAC-R1
然后准备以太网帧:
以太网帧:
源 MAC = MAC-A
目的 MAC = MAC-R1
IPv4 数据报:
源 IP = 192.168.1.10
目的 IP = 192.168.2.20
这里必须关注两种地址的不同含义:
以太网目的 MAC = 当前要交付的 R 接口 1。
IPv4 目的 IP = 最终目标 B。
5. R 接收数据报
R 的接口 1 接收到相应的以太网帧。
设备对链路层帧进行处理,取得其中的 IPv4 数据报。
R 检查 IPv4 数据报,依据目的地址和转发信息,决定下一步如何处理。
因为 B 在 R 接口 2 所连接的网络中,R 可以决定从接口 2 发送。
在正常 IPv4 转发过程中,R 还需要处理 TTL 等相关 IPv4 首部信息。
R 在此执行的是 IPv4 路由转发,不需要把普通 TCP 载荷交给本机应用程序进行业务处理。
6. R 向 B 发送
R 需要构造下一段链路上的以太网帧。
此时最终目的 B 已位于直接连接的网络上。
R 可以通过邻居解析获得:
192.168.2.20 → MAC-B
然后构造:
新的以太网帧:
源 MAC = MAC-R2
目的 MAC = MAC-B
IPv4 数据报:
源 IP = 192.168.1.10
目的 IP = 192.168.2.20
TTL 已递减
这里:
- 发送接口已经改变为 R 的接口 2。
- 以太网源 MAC 和目的 MAC 发生了变化。
- IPv4 数据报仍然指向 B。
- IPv4 首部中某些字段会按转发规则变化。
在未经过 NAT 等特殊地址转换处理的前提下,IPv4 源 IP、目的 IP 通常不会因为普通路由转发而改变。
7. 最终目的 IP 与下一跳如何区分?
在这个示例中:
主机 A:
最终目的 IP = B
下一跳 IP = R 接口 1
路由器 R:
最终目的 IP = B
当前直连交付目标 = B
因此:
下一跳既可能是另一个路由器,也可能是直接连接网络中的最终目的主机。
普通 IPv4 数据报并不需要增加一个随每一跳变化的独立目的地址字段。
8. 多路由器转发的情况
如果需要经过两个路由器:
A → R1 → R2 → B
那么在典型无 NAT 的以太网转发环境中:
| 链路 | IPv4 目的 IP | 以太网目的 MAC |
|---|---|---|
| A → R1 | B 的 IP | R1 入站接口的 MAC |
| R1 → R2 | B 的 IP | R2 相应接口的 MAC |
| R2 → B | B 的 IP | B 相应接口的 MAC |
这里可以看到:
IPv4 目的地址与当前以太网链路的目的 MAC,承担不同范围内的寻址职责。
十一、路由器如何判断下一跳是否合适?会不会转发失败?
1. 路由器不需要证明整个路径必然成功
假设:
A → R1 → R2 → R3 → B
R1 根据路由信息决定把数据报交给 R2。
这表示 R1 当前具有相应的转发依据。
但不能据此证明:
- R2 当前必然正常工作。
- R3 到 B 的网络连接必然正常。
- 所有链路必然不存在拥塞。
- 后续设备必然拥有有效路由。
- B 必然收到并处理数据。
所以,路由决策能够指示下一步如何处理,并不保证端到端成功。
2. 没有可用路由时会怎样?
如果路由器没有适用的可用路由,就无法按照正常路由流程确定下一步转发方向。
数据报通常会被丢弃。
在符合协议条件并允许发送错误反馈时,设备可能返回 ICMP 目的不可达等错误信息。
3. 有默认路由但最终目标不可达,会怎样?
设备可能按照默认路由把数据报转发给下一跳。
但后续某台路由器可能发现无法继续送达,进而丢弃数据报。
因此,默认路由可以为当前节点提供一个转发方向,但不保证目的主机真正可达。
4. 如果路由器之间形成环路呢?
假设错误路由信息导致:
R1 → R2 → R1 → R2 ...
IPv4 数据报可能不断在设备之间循环。
IPv4 的 TTL 字段用于限制这种现象可能造成的持续转发。
路由器正常转发 IPv4 数据报时,TTL 会递减。
如果达到相应限制,数据报会被丢弃。
TTL 的完整字段定义、具体处理与 ICMP 反馈,将在后续阶段继续系统教学。
十二、接收端怎样将数据交给正确的上层协议?
1. 接收到以太网帧后,并不是直接交给 Java 程序
假设服务器 B 收到一个承载 TCP/IPv4 的以太网帧。
典型处理链如下:
网卡及驱动收到帧
↓
链路层识别并处理帧
↓
识别出 IPv4 数据报
↓
IP 层检查和处理 IPv4 数据报
↓
根据 IPv4 Protocol 字段识别 TCP
↓
TCP 模块处理对应 TCP 报文段
↓
根据连接等信息关联正确的 Socket
↓
可交付的字节进入 TCP 接收路径
↓
应用程序通过 Socket 读取字节
这里既有链路层处理,也有网络层、传输层及应用程序的数据读取。
一个网络接口对象并不等同于上述全部协议处理模块。
2. IP 层收到数据后是否必然向上传输?
不一定。
IP 层接收到 IPv4 数据报后,需要判断它应该:
- 由本机接收。
- 根据条件继续转发。
- 因校验、路由、安全策略或其他条件不满足而丢弃。
因此,即使数据报已经到达设备的网卡,也不意味着一定能交付给应用程序。
3. 如果目的 IP 是本机地址,就一定交给 TCP 吗?
不一定。
如果一个 IPv4 数据报满足本地接收条件,其载荷需要交给哪个协议模块,取决于 IPv4 首部中的 Protocol 字段。
可能交给:
TCP
UDP
ICMP
其他相应协议模块
因此,不能认为所有由本机接收的 IPv4 数据报都包含 TCP。
即使其载荷属于 TCP,TCP 还需要检查连接状态和其他协议条件,才能将相应字节提供给正确的 Socket。
4. IP 地址、端口号、Socket 的关系
IP 地址参与网络层寻址和交付。
TCP/UDP 端口号则用于相应传输协议中的通信端点区分。
例如:
目的 IP:
203.0.113.8
目的 TCP 端口:
8080
IP 主要依据网络层信息处理和交付数据报。
TCP 进一步使用端口号、连接状态及其他必要信息,关联相应的通信端点 。
应用程序再通过 Socket 等操作系统接口进行通信。
这里的端口号不等于进程 ID,也不意味着一个端口必然永久对应一个进程。
十三、IP 的尽力而为服务与 TCP 的可靠传输
1. IPv4 为什么不能保证一定送达?
IPv4 提供的是尽力而为的无连接数据报服务。
网络设备会按照协议规则,尽可能处理和转发符合条件的数据报。
但是可能发生:
- 网络链路故障。
- 路由不可用。
- 设备队列拥塞。
- 网络设备丢弃数据报。
- 某些转发或接收条件不满足。
因此,IP 本身不保证:
- 每个数据报必然到达。
- 多个数据报按发送顺序到达。
- 某个数据报丢失后自动得到类似 TCP 的端到端可靠重传。
- 最终应用程序一定已经读取和处理数据。
这并不意味着 IP 数据报必然经常丢失,也不表示网络层完全没有任何错误检测机制。
IP 是否可靠,需要明确所说的"可靠"究竟指哪一种保证。
2. TCP 如何在 IP 基础上提供可靠字节流?
TCP 会使用序列号、确认应答、重传等协议机制处理数据传输。
例如:
发送方 A
│
│ TCP 数据
├─────────────────→ 接收方 B
│ (途中丢失)
│
│ 等待确认及相关重传条件
│
│ 重传数据
├─────────────────→ 接收方 B
│
│ TCP 确认应答
←─────────────────┤
实际 TCP 实现会依据具体确认信息、重传计时器与其他规则决定是否及何时重传。
不能简单理解成每个 TCP 报文段都采用固定时间、固定次数的独立重传方式。
这里需要掌握的是:
IP 数据报可能丢失,TCP 可以利用自己维护的端到端协议状态与可靠性机制,向应用程序提供可靠、有序的字节流服务。
发送方不一定需要知道具体是哪一台路由器丢弃了数据报。
此外,没有收到 TCP 确认应答,也不必然表示原始数据报丢失;还可能是 ACK 丢失或网络时延变化等原因。
TCP 的机制需要处理这种不确定性。
3. IP 不可靠是否意味着链路层也不可靠?
不能直接这样推导。
不同链路技术可以有各自的差错检测与传输机制。
例如:
- 以太网帧通常具有 FCS 差错检测。
- 某些链路技术还会实施链路层确认与重传。
- IPv4 具有首部校验和。
- TCP 可以提供端到端字节流的可靠性交付机制。
不同协议机制的存在与作用,需要分别分析。
十四、各层的可靠性保障为什么不能机械累加?
这是后续追问中一个重要的理解问题。
1. 不同层可以具有自己的差错处理能力
以太网帧可以通过 FCS 检测传输过程中出现的某些错误。
IPv4 可以利用首部校验和检测首部中的某些错误。
TCP 可以通过序列号、确认应答和重传等机制,处理端到端字节流的可靠交付问题。
应用层还可以根据业务需要设计业务确认或数据校验机制。
这些机制可以相互配合。
但是,不能得出:
网络层在链路层的可靠性上再增加一层可靠性,传输层再增加一层,因此越往上的数据一定越可靠。
因为每一层的机制保证的对象不同。
2. 当前链路的可靠性与端到端可靠性是不同的问题
假设:
A → R1 → R2 → B
A 到 R1 的以太网帧通过 FCS 检查,说明接收端没有通过该检查发现帧中的相关传输差错。
但是,如果 R1 到 R2 的发送过程中数据报被丢弃,第一段链路的 FCS 成功并不能自动把数据报送到 R2。
原因是:
第一段链路的帧处理,与第二段链路的数据交付,是不同的传输过程。
当前链路具有某种错误检测能力,不代表它为后续所有网络链路提供了永久保障。
3. 链路层帧头会逐跳变化,是否表示上层数据始终累积可靠性?
不表示。
当数据报经过路由器时:
- 当前链路上的帧被接收和处理。
- IP 数据报进行相应转发处理。
- 输出链路可能构造新的帧。
每一段链路可能有自己的差错检测。
但是这些检查各自具有特定的作用范围。
上层字节能够继续通过网络传送,并不意味着前面所有链路校验会作为一种不断叠加的永久状态保护上层数据。
协议层次越高,或者某些数据在系统中存在得越久,都不能单独证明可靠性必然更强。
4. 数据停留在协议层中的时间,不决定可靠性等级
假设应用程序发送的数据经过:
应用层 → TCP → IP → 以太网
接收时经过:
以太网 → IP → TCP → 应用层
这说明数据经过多个协议处理阶段。
但不能仅凭处理先后和存在时间长短,就推导出"应用层的数据因为存在得更久,所以享受所有下层协议的累计可靠性"。
数据实际是否正确到达、能否交付给 TCP、能否被应用程序读取、是否完成业务处理,分别需要满足不同条件。
5. TCP 已经确认的数据,应用程序就一定处理完成了吗?
不一定。
假设:
客户端 A 服务器 B
TCP 数据
───────────────────────→
TCP 接收
←───────────────────────
TCP ACK
应用程序读取
应用程序处理
数据库写入
←───────────────────────
应用层业务响应
服务器发送 TCP ACK,通常是在确认相应 TCP 字节序列已被 TCP 接收。
但应用程序可能尚未读取这些字节。
即使应用程序已经读取,也可能尚未完成业务处理。
即使业务处理已经执行,也可能尚未完成数据持久化。
因此:
TCP 字节流得到接收确认,与应用层业务完成确认,是不同层次的事件。
如果业务需要更强的完成语义,就要根据业务要求设计相应的应用层确认、事务或持久化机制。
6. TCP 能提供可靠字节流,是否意味着它在任何情况下都不会失败?
也不能这样理解。
TCP 在连接正常运行并满足协议条件时,能够提供可靠、有序的字节流服务。
但如果网络持续不可用或连接失败,TCP 也可能最终无法完成传输,并向应用程序报告错误。
因此,"TCP 是可靠传输协议"需要结合其实际服务语义和连接运行条件理解。
不能把它理解成网络出现任何故障时,TCP 都可以无限次重试直到必然成功。
十五、以一次 Java 网络通信串联全部机制
现在把第一阶段实际讨论过的对象放在一条完整的通信链中。
假设:
Java 客户端 A
IPv4:192.168.1.10
默认网关:
192.168.1.1
远端服务器 B:
IPv4:203.0.113.8
TCP 端口:8080
假设 A 已建立一个 TCP 连接,并准备通过 Socket 发送 "Hello"。
发送端
第一步:应用程序写入数据。
out.write("Hello".getBytes(StandardCharsets.UTF_8));
应用程序通过 Socket 相关接口提供字节数据。
第二步:TCP 处理字节流。
TCP 根据连接状态和发送机制组织数据,可能形成一个或多个 TCP 报文段。
TCP 报文段包含 TCP 首部和 TCP 数据。
第三步:IPv4 处理。
TCP 报文段可以作为 IPv4 数据报的载荷。
IPv4 数据报具有源 IP 地址、目的 IP 地址等首部字段。
第四步:主机查询路由信息。
根据目标 IP 地址,操作系统决定从哪个接口发送,以及是否需要交给下一跳网关。
在当前示例中,假设使用默认网关 192.168.1.1。
第五步:确定链路层目的地址。
在典型 IPv4 以太网环境中,主机可以通过 ARP/邻居缓存取得下一跳接口的 MAC 地址。
第六步:发送链路层帧。
主机准备以太网封装,网卡及相关发送路径将数据发送到当前链路上。
中间网络
假设数据需要经过多台路由器。
每台路由器根据自身的路由与转发信息处理相应 IPv4 数据报。
正常 IPv4 转发过程中,可能会修改 TTL、更新首部校验和,并使用新链路的封装发送数据报。
中间路由器通常不需要进行 TCP 应用数据的完整业务处理。
如果路由、链路、策略或其他条件不满足,数据报可能被丢弃。
接收端
最终接收主机通过网络接口接收相应帧。
链路层处理后,IP 层判断数据报是否应由本机接收。
如果载荷属于 TCP,就交给 TCP 模块。
TCP 根据连接状态等信息处理数据,使满足交付条件的字节进入接收路径。
应用程序通过 Socket 读取这些字节。
这里的应用程序读取,是建立在前面多项协议处理条件满足的基础上。
需要特别保留的限定条件
这个例子涉及家庭网络和远端服务器,现实中可能还需要 NAT。
NAT 可能修改地址和端口,因此不能把"普通无 NAT 路由过程中源 IP 不变"的说明,直接当成家庭网络访问互联网时的全部真实过程。
NAT 的地址转换、映射关系和响应返回机制将在后续正式教学阶段系统展开。
十六、对本次阅读中重要疑惑的集中辨析
1. 一个 IP 数据报是否携带"最终目的 IP"和"每跳变化的下一跳 IP"?
在普通 IPv4 首部中,没有专门随每跳变化的下一跳 IP 字段。
最终目的 IP 位于数据报首部。
下一跳由当前设备的路由决策确定。
2. 下一跳一定是一台路由器吗?
不一定。
如果目的主机位于当前设备直接连接的网络中,当前链路的交付目标可以就是最终目的主机。
3. MAC 地址是不是对应整个网络设备?
不能普遍这样定义。
MAC 地址通常关联具体链路层接口。
一台网络设备可以具有多个接口和多个 MAC 地址。
4. 网络接口是否只有 IP,以太网接口是否只有 MAC?
不能这样划分。
以太网接口本身就是网络接口的一种。
一个普通以太网接口可以同时关联 IP 地址和 MAC 地址。
5. 路由表是否直接输出目的 MAC 地址?
路由决策通常负责确定输出接口、下一跳或直连交付信息 。
在典型以太网环境中,需要邻居解析来确定相应链路层目的 MAC。
所以路由查找与邻居解析是相互协作的不同处理。
6. ARP 缓存是不是交换机的 MAC 地址表?
不是。
ARP/邻居缓存保存邻居 IP 与 MAC 的关联。
以太网交换机 MAC 地址表保存 MAC 与交换机转发端口等信息的关联。
7. 网络层是否每次将整个 ARP 缓存交给链路层?
不需要建立这种模型。
正常发包过程中,需要的是本次输出所需的相应邻居解析结果。
8. 路由器收到 TCP/IPv4 数据时,是否需要拆到 TCP 层再重新封装?
普通 IP 路由转发通常不需要。
路由器可以处理接收到的链路帧、检查和转发 IPv4 数据报,再在输出链路重新封装。
特殊设备可能为了 NAT、防火墙、代理等功能查看或修改更高层字段,但这不应替代普通路由转发的基本模型。
9. IP 目的地址为本机地址时,是否一定交给 TCP?
不一定。
还需要满足本地接收条件,并根据 IPv4 Protocol 字段确定上层协议。
可能是 TCP,也可能是 UDP、ICMP 或其他协议。
10. 一个 TCP 报文段的载荷是否就是一个完整应用层报文?
不一定。
TCP 提供字节流服务,不保证 TCP 报文段边界与应用层消息边界一致。
11. 协议层次越高,可靠性是否一定越强?
不能按照层数简单推导。
每层机制的保证对象、适用范围和完成条件不同。
链路差错检测、TCP 字节流确认和应用层业务确认属于不同层次的保证。
12. 某个以太网帧经过检查后,数据是否在后续链路上持续受这一检查保护?
不是。
该帧的检查主要针对当前帧及其对应链路的传输。
后续链路需要自己的处理与检测机制。
13. 如果每一段链路都没有检查出错误,能否证明应用层业务成功?
不能。
仍需区分端到端数据传输、TCP 接收、应用程序读取、业务处理和数据持久化等不同事件。