本节重点
理解网络层的作用, 深入理解IP协议的基本原理
理解数据链路层的作用, 了解ARP协议
对整个TCP/IP协议有系统的理解
对TCP/IP协议体系下的其他重要协议和技术有一定的了解
学会使用一些分析网络问题的工具和方法
1.网络层
在复杂的网络环境中确定一个合适的路径
1.1IP****协议

1.2基本概念
主机: 配有IP地址, 但是不进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统称;
1.3协议头格式

4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.
4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节.
8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.
16位总长度(total length): IP数据报整体占多少个字节.
16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.
3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁 止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,
最后一个分片置为1, 其他是0. 类似于一个结束标记.
13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
8位协议: 表示上层协议的类型
16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
32位源地址和32位目标地址: 表示发送端和接收端.
选项字段(不定长, 最多40字节): 略
1.4网段划分**(重要)**
IP地址分为两个部分, 网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

不同的子网其实就是把网络号相同的主机放到一起.
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.
那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.
有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.
过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示(该图出 自[TCPIP])

A类 0.0.0.0到127.255.255.255
B类 128.0.0.0到191.255.255.255
C类 192.0.0.0到223.255.255.255
D类 224.0.0.0到239.255.255.255
E类 240.0.0.0到247.255.255.255
随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址;
例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了
针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing):
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;
将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;
IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高 24位是1,也就是255.255.255.0
1.5特殊的IP地址
将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

一、核心模块拆解
图中主要分为 4 个核心模块,各模块职责如下:
- IP 输出函数
- 入口:所有待发送的 IP 报文首先进入此函数。
- 分发逻辑 :根据报文目的地址,将报文分发到 环回驱动程序 或 以太网驱动程序。
- 作用:决定报文是走 "本机回环" 还是 "物理以太网"。
- 环回驱动程序
- 核心职责 :处理本机自通信的 IP 报文(目的地址为环回地址 127.0.0.0/8 或本机接口 IP)。
- 处理逻辑 :直接将报文放入 IP 输入队列 ,并交给 IP 输入函数 处理。
- 特点:报文不会离开主机,完全在操作系统内核中完成回环。
- 以太网驱动程序
负责处理需要发送到物理网络的 IP 报文,内部包含两层关键判断:
-
判断 1:目的 IP 是否为广播 / 多播地址?
- ✅ 是:拷贝一份报文到环回驱动的 IP 输入队列(让本机也能收到该广播 / 多播),同时继续走以太网发送流程。
- ❌ 否:进入下一层判断。
-
判断 2:目的 IP 是否与当前接口 IP 相同?
- ✅ 是:将报文交给环回驱动程序处理(本机给自己发,不走物理网)。
- ❌ 否 :调用 ARP 协议 获取目的主机的以太网 MAC 地址,封装成以太网帧后发送到物理以太网。
-
IP 输入函数
- 统一入口 :接收来自 环回驱动 和 以太网驱动 的 IP 输入队列报文。
- 处理逻辑:对 IP 报文进行解析、校验后,交付给上层传输层协议(如 TCP/UDP)处理。
- 作用:屏蔽底层硬件差异,为上层提供统一的 IP 报文处理接口。
- 以太网接收侧
- 从物理以太网接收帧后,先通过 "基于以太网帧类型进行分用" 模块判断帧类型:
- 若为 IP 帧:放入 IP 输入队列,交给 IP 输入函数。
- 若为 ARP 帧:交给 ARP 模块处理(如回复 ARP 请求、更新 ARP 缓存)。
二、典型场景流程梳理
场景 1:本机发送到环回地址(如 127.0.0.1)
IP 输出函数 → 环回驱动程序 → 放入 IP 输入队列 → IP 输入函数 → 上层应用
✅ 特点:完全不经过物理以太网,高效且可靠。
场景 2:本机发送广播 / 多播报文
IP 输出函数 → 以太网驱动程序 → 判定为广播/多播
├─→ 拷贝一份 → 环回驱动程序 → IP 输入队列 → IP 输入函数(本机接收)
└─→ 主流程 → ARP → 发送到以太网 → 局域网其他主机接收
✅ 特点:本机必须能收到自己发出的广播 / 多播,因此需要拷贝到环回队列。
场景 3:本机给自己发(目的 IP 为本机接口 IP,如 192.168.1.100 → 192.168.1.100)
IP 输出函数 → 以太网驱动程序 → 判定目的 IP = 本机接口 IP → 环回驱动程序 → IP 输入队列 → IP 输入函数
✅ 特点:等价于环回地址,不走物理网络。
场景 4:本机发送到其他主机(如 192.168.1.100 → 192.168.1.200)
IP 输出函数 → 以太网驱动程序 → 判定目的 IP ≠ 本机/广播 → ARP 获取目的 MAC → 封装以太网帧 → 发送到以太网
→ 目的主机以太网接收 → 分用为 IP 帧 → IP 输入队列 → IP 输入函数 → 目的主机上层应用
场景 5:从以太网接收外部 IP 报文
以太网物理层 → 以太网驱动程序 → 帧类型分用(识别为 IP 帧) → 放入 IP 输入队列 → IP 输入函数 → 本机上层应用
三、核心设计思想与特点
- 本机自通信优化:通过 Loopback 设备避免报文进入物理网络,提升效率和可靠性。
- 广播 / 多播兼容性:本机必须接收自己发出的广播 / 多播,因此设计了 "拷贝到环回队列" 的逻辑。
- 统一输入接口:无论报文来自环回还是以太网,最终都由 IP 输入函数统一处理,保证协议栈逻辑一致性。
- ARP 依赖:以太网环境下,IP 报文发送前必须通过 ARP 解析目的 MAC 地址,才能封装成可在物理网络传输的以太网帧。
1.6私有IP地址和公网IP地址
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址
10.*,前8位是网络号,共16,777,216个地址
172.16.到172.31.,前12位是网络号,共1,048,576个地址
192.168.*,前16位是网络号,共65,536个地址
包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);

一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之 间的IP地址就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级 替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服 务器上. 这样的服务器可以在阿里云/腾讯云上进行购买
2.路由
在复杂的网络结构中, 找出一条通往终点的路线;
路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程.
所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.

IP数据包的传输过程也和问路一样.
当IP数据包, 到达路由器时, 路由器会先查看目的IP;
路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
依次反复, 一直到达目标IP地址;
那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表

路由表可以使用route命令查看
如果目的IP命中了路由表, 就直接转发即可;
路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
假设某主机上的网络接口配置和路由表如下:

这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到
192.168.56.0/24网络;
路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接
口,Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发
转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3
跟第一行的子网掩码做与运算得 到192.168.56.0,与第一行的目的网络地址不符
再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;
由于192.168.56.0/24正 是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;
转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2
依次和路由表前几项进行对比, 发现都不匹配;
按缺省路由条目, 从eth0接口发出去, 发往192.168.10.1路由器;
由192.168.10.1路由器根据它的路由表决定下一跳地址;
可能会有人疑惑上面上面使用NAT技术会改变源ip地址,那么该如何找回IP地址呢?或者上面所说的能不能全串起来.
一、问题 1:路由器到底是怎么跳转 / 转发数据包的?
- 路由器的基本身份
每个普通家用 / 运营商路由器,都有两个 IP、两个身份:
- LAN 口 IP:自己子网的网关(如 192.168.1.1),管理底下一串主机
- WAN 口 IP:连接上级网络的地址(如 10.1.1.2),是上级子网里的一个普通节点
- 路由表 = 路由器的「导航地图」
路由表里存着N 条转发规则,每条包含 4 个信息:
- 目的网络号
- 子网掩码
- 下一跳(交给谁)
- 出接口(从哪个口发)
- 路由器转发的唯一依据
路由器只看数据包里的「目的 IP」,工作步骤固定:
-
拿 目的 IP 和路由表里的 子网掩码 做 按位与运算
-
算出一个 网络号
-
去路由表里匹配对应的目的网络
-
3 种匹配结果(决定跳不跳、跳去哪)
① 匹配到「本机直连的子网」
- 例子:目的 IP 192.168.1.201 → 算出来是 192.168.1.0
- 动作:不跳转、不经过上级
- 直接在本机 LAN 口的交换机里转发给目标主机
② 匹配到「其他已知子网」
- 例子:目的 IP 10.1.1.5 → 算出来是 10.1.1.0
- 动作:按路由表指定的下一跳转发
- 直接发给对应路由器,不走公网
③ 所有具体子网都匹配不到
- 走最后一条:缺省路由(默认路由)0.0.0.0/0
- 动作:全部扔给上级网关
- 结果:数据包逐级向上,最终进入公网 / 互联网
- 核心结论(路由转发)
- 路由转发 只负责 "找路"
- 路由转发 不修改源 IP、不修改目的 IP
- 匹配规则:最长前缀匹配 → 匹配不到 → 缺省路由兜底
- 你访问公网,本质就是:匹配不到任何内网 → 走缺省 → 跳上级 → 进公网
二、问题 2:源 IP 被 NAT 改掉后,对方服务器怎么把回应发回给你?
- 先分清:路由 ≠ NAT
- 路由 :决定包往哪走 → 不改 IP
- NAT(网络地址转换) :把私网 IP 换成公网 / 上级 IP → 改 IP
- 我们平时上网,是 路由 + NAT 一起工作
- 为什么要改源 IP?
家里的私网 IP(192.168.x.x)运营商的私网 IP(10.x.x.x)在公网上是无效的、不认的,必须换成公网 IP 才能通信。
- NAT 的核心:路由器会偷偷建一张「映射表」
真正用的是 NAPT(端口映射) ,表中记录:【你的私网IP:私网端口】 ←→ 【路由器WAN口IP:公网端口】
- 一台路由器下所有设备,共享一个 WAN 口 IP
- 用不同端口区分每一台设备、每一条连接
- 数据包「出去」的过程(逐级 NAT + 路由)
以:192.168.1.200 → 公网服务器 为例
-
你的电脑发包,源 IP 是私网 IP
-
家用路由器:
- 查路由表 → 走缺省,往上发
- 做 NAT:把源 IP 换成自己 WAN 口 IP,记进 NAT 表
-
运营商路由器:
- 查路由表 → 往公网发
- 做 NAT:再换一层,换成公网 IP,也记表
-
最终到达服务器时,源 IP 已经是公网 IP
-
响应包「回来」的过程(反向查 NAT 表)
服务器只知道把包发回:公网 IP: 公网端口回程完全不靠 "重新算子网",只靠查表:
-
包到运营商路由器
- 看目的端口 → 查 NAT 表 → 还原成上一级私网 IP: 端口
-
包到家用路由器
- 再查 NAT 表 → 还原成你最开始的私网 IP: 端口
-
直接发给你电脑
-
核心结论(NAT 回包)
- 源 IP 虽然被改了,但每一级路由器都存了映射关系
- 回程不靠路由重新计算,靠端口 + NAT 表反向还原
- 数据包出去怎么走,回来就严格按原路返回
- 你虽然藏在多层内网里,但对外表现为一个公网 IP
一句话总结合并版
- 路由转发 :用目的 IP 和掩码算网络号,匹配路由表,能匹配就走对应子网,匹配不到就走缺省路由跳上级 / 公网,只找路不改 IP。
- NAT 转换 :把内网无效的源 IP 换成上级 / 公网 IP,同时记录 IP + 端口的映射表,改 IP 但留记录。
- 回包原理 :响应包按公网 IP + 端口回来,各级路由器按 NAT 表逐级还原,原路精确找到最开始的那台内网主机。
这就是整个互联网最底层的工作原理 :路由负责寻址,NAT 负责隐身,查表负责回家。
3.数据链路层
用于两个设备(同一种数据链路节点)之间进行传递.
3.1对比理解****"数据链路层"和"网络层"
1. 维度对比表(最清晰)
| 维度 | 网络层(Network Layer,三层) | 数据链路层(Data Link,二层) |
|---|---|---|
| 核心目标 | 找到最终目的地,规划整条路线 | 把包传给下一个邻居 |
| 地址 | IP 地址(逻辑地址,可跨网) | MAC 地址(物理地址,出厂固定) |
| 传输单位 | IP 数据报(包 Packet) | 帧(Frame) |
| 工作设备 | 路由器(你刚学的路由表就在这) | 交换机、网卡 |
| 作用范围 | 跨子网、跨路由器、公网 | 同一个局域网、相邻设备之间 |
| 是否变 | IP 从头到尾基本不变(NAT 是特殊例外) | MAC 每过一个路由器就换新的 |
| 关键功能 | 路由选择、子网划分、寻址、路由表 | 封装成帧、MAC 寻址、差错检测、局域网转发 |
| 你刚学的知识 | 路由表、缺省路由、子网掩码、IP 跳转 | ARP(IP 找 MAC)、交换机转发、同子网通信 |
- 用「寄快递」类比
🌏 网络层 = 写快递地址 + 规划全国路线
- 地址:北京市 XX 区 XX 路 XX 号(IP)
- 只管:从发货人 → 收货人,全程怎么走
- 不管:每一站货车怎么开、怎么交接
🚚 数据链路层 = 每一段货车运输 + 站点交接
- 地址:当前货车编号 + 下一个站点编号(MAC)
- 只管:从这个分拣中心 → 下一个分拣中心
- 到一站换一辆车,每跳 MAC 都变
- 局域网 + 路由场景真实走一遍
主机 A:192.168.1.200 → 公网服务器 8.8.8.8
(1)网络层全程干的事(从头到尾不变)
- 源 IP:
192.168.1.200 - 目的 IP:
8.8.8.8 - 路由表判断:跨网 → 走网关 → 逐级跳转IP 地址只在 NAT 时被修改,路由转发本身不修改 IP!
(2)数据链路层每一跳都在变(逐跳替换)
- 主机 A → 家用路由器
- 源 MAC:主机网卡 MAC
- 目的 MAC:路由器 LAN 口 MAC
- 家用路由器 → 运营商路由器
- 源 MAC:家用路由器 WAN 口 MAC
- 目的 MAC:运营商路由器 MAC
- 运营商路由器 → 服务器
- 源 MAC:运营商路由器 MAC
- 目的 MAC:服务器 MAC
结论:
- IP 是终点地址,全程不变
- MAC 是下一站地址,每跳都换
3.2认识以太网
"以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
3.3以太网帧格式

源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
帧协议类型字段有三种值,分别对应IP、ARP、RARP;
帧末尾是CRC校验码
3.4认识MAC地址
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
3.5对比理解MAC地址和IP地址
IP地址描述的是路途总体的 起点 和 终点;
MAC地址描述的是路途上的每一个区间的起点和终点;
3.6认识****MTU
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
不同的数据链路层标准的MTU是不同的;
3.7MTU对IP****协议的影响
由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.
将较大的IP包分成多个小包, 并给每个小包打上标签;
每个小包IP协议头的 16位标识(id) 都是相同的;
每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据


3.8MTU对UDP****协议的影响
让我们回顾一下UDP协议:
一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了
3.9MTU对于TCP****协议的影响
让我们再回顾一下TCP协议:
TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(MaxSegment Size);
TCP在建立连接的过程中, 通信双方会进行MSS协商.
最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
MSS的值就是在TCP首部的40字节变长选项中(kind=2)
MSS和MTU的关系

3.10查看硬件地址和****MTU

使用ifconfig命令, 即可查看ip地址, mac地址, 和MTU;
3.11ARP****协议
虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议;
3.12ARP****协议的作用
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
因此在通讯前必须获得目的主机的硬件地址;
3.13ARP****协议的工作流程

源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少", 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址

想一想,为什么要有缓存表? 为什么表项要有过期时间而不是一直有效?
再想一想, 结合我们刚才讲的工作流程, ARP的数据报应该是一个什么样的格式?
一、为什么要有 ARP 缓存表?
一句话:为了不每次都发广播、不浪费网络资源
-
如果没有 ARP 缓存 你每发一个 IP 包,都要先广播一次:"谁是 192.168.0.1?告诉我你的 MAC!"整个局域网所有人都要停下来听你喊。
-
有了 ARP 缓存问过一次就记下来,下次直接用:
- 不用广播
- 不用等待应答
- 不占用局域网带宽
- 发包速度更快
总结:
ARP 缓存 = 本地小抄 作用:减少广播、提高速度、降低局域网拥堵。
二、为什么缓存表要有过期时间,不能永久有效?
一句话:因为 IP ↔ MAC 的对应关系会变,永久存会出错
这些情况都会让 "旧记录" 变成错的:
- 设备换了网卡 → MAC 变了
- DHCP 重新分配 IP → 同一个 MAC 换了 IP
- 设备关机、拔掉、换成别的设备
- 设备太多,ARP 表会无限变大,占内存
如果永远不删:
- 你还往旧 MAC 发包
- 包永远发不到正确主机
- 网络直接不通
总结:
过期时间 = 自动更新机制 作用:保证 ARP 表里永远是最新、正确的 MAC 地址。
三、ARP 数据报到底长什么样?(结合你学的以太网帧)
ARP 不是 IP 包,直接封装在以太网帧里。
1)外面套一层:以太网帧
- 目的 MAC:
FF:FF:FF:FF:FF:FF(ARP 请求是广播) - 源 MAC:发送者 MAC
- 类型:
0x0806表示这是 ARP 报文
2)里面真正的 ARP 数据报格式
一共 28 字节,字段如下:
- 硬件类型以太网 = 1
- 协议类型IPv4 = 0x0800
- 硬件地址长度MAC 地址长度 = 6
- 协议地址长度IP 地址长度 = 4
- 操作码 OP
- 1 = ARP 请求
- 2 = ARP 应答
- 发送端 MAC
- 发送端 IP
- 目标 MAC
- 请求时:填
00:00:00:00:00:00(还不知道) - 应答时:填目标 MAC
- 请求时:填
- 目标 IP
四、用最开始的例子,直接看 ARP 请求包内容
你问:192.168.0.1 的 MAC 是多少?
ARP 请求包内容:
- 硬件类型:1(以太网)
- 协议类型:0x0800(IP)
- 操作码:1(请求)
- 发送端 MAC:你的 MAC
- 发送端 IP:你的 IP
- 目标 MAC:00:00:00:00:00:00
- 目标 IP:192.168.0.1
3.14ARP****数据报的格式

注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
硬件类型指链路层网络类型,1为以太网;
协议类型指要转换的地址类型,0x0800为IP地址;
硬件地址长度对于以太网地址为6字节;
协议地址长度对于和IP地址为4字节;
op字段为1表示ARP请求,op字段为2表示ARP应答。
3.15其他重要协议或技术
3.15.1DNS(Domain Name System)
DNS是一整套从域名映射到IP的系统
3.15.2.DNS****背景
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.
于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系.

最初, 通过互连网信息中心(SRI-NIC)来管理这个hosts文件的.
如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.
其他计算机也需要定期下载更新新版本的hosts文件才能正确上网.
这样就太麻烦了, 于是产生了DNS系统.
一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系
如果新计算机接入网络, 将这个信息注册到数据库中;
用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
至今, 我们的计算机上仍然保留了hosts文件. 在域名解析的过程中仍然会优先查找hosts文件的内容
cpp
cat /etc/hosts
3.15.3.域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称.
bash
www.baidu.com
域名使用 . 连接
com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.
baidu: 二级域名, 公司名.
www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议
3.15.4.使用 dig工具分析DNS****过程
安装 dig 工具
bash
yum install bind-utils
之后就可以使用 dig 指令查看域名解析过程了
bash
dig www.baidu.com
结果形如
cpp
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41628
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 1057 IN CNAME www.a.shifen.com.
www.a.shifen.com. 40 IN A 115.239.210.27
www.a.shifen.com. 40 IN A 115.239.211.112
;; Query time: 0 msec
;; SERVER: 100.100.2.136#53(100.100.2.136)
;; WHEN: Wed Sep 26 00:05:25 CST 2018
;; MSG SIZE rcvd: 90
结果解释
- 开头位置是 dig 指令的版本号
- 第二部分是服务器返回的详情, 重要的是 status 参数, NOERROR 表示查询成功
- QUESTION SECTION 表示要查询的域名是什么
- ANSWER SECTION 表示查询结果是什么. 这个结果先将 www.baidu.com 查询成了 www.a.shifen.com, 再将
www.a.shifen.com 查询成了两个 ip 地址. - 最下面是一些结果统计, 包含查询时间和 DNS 服务器的地址等.
3.16ICMP协议
ICMP协议是一个 网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因
3.17ICMP功能
CMP正是提供这种功能的协议; ICMP主要功能包括:
确认IP包是否成功到达目标地址.
通知在发送过程中IP包被丢弃的原因.
ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;

3.18ICMP的报文格式(选学)
关于报文格式, 我们并不打算重点关注, 大家稍微有个了解即可

ICMP大概分为两类报文:
一类是通知出错原因
一类是用于诊断查询

3.19ping****命令

注意, 此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址.
ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期).ping命令会先发送一个 ICMP Echo Request给对端;
对端接收到之后, 会返回一个ICMP Echo Reply;

3.20traceroute****命令
也是基于ICMP协议实现, 能够打印出可执行程序主机, 一直到目标主机之前经历多少路由器

4.NAPT
那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系

这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项
4.1NAT****技术的缺陷
由于NAT依赖这个转换表, 所以有诸多限制:
无法从NAT外部向内部服务器建立连接;
装换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
**4.**2NAT和代理服务器
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程. 代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.
那么NAT和代理服务器的区别有哪些呢?
从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器.
从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.
代理服务器是一种应用比较广的技术.
翻墙: 广域网中的代理.
负载均衡: 局域网中的代理.
代理服务器又分为正向代理和反向代理.
5.总结
一、分层总览(从顶到底)
| 层级 | 核心目标 | 数据单位 | 关键设备 | 核心作用 |
|---|---|---|---|---|
| 应用层 | 为用户 / 应用提供网络服务 | 应用报文(Message) | 应用程序、网关 | 定义数据格式、业务逻辑(如网页、文件传输) |
| 传输层 | 端到端可靠 / 不可靠通信 | 段(Segment,TCP)/ 用户数据报(Datagram,UDP) | 操作系统协议栈 | 区分不同应用(端口号)、保证数据可靠(TCP) |
| 网络层 | 跨网络寻址与路由 | IP 数据报(Packet) | 路由器 | 找到目标主机(IP 地址)、跨网转发、分片 / 重组 |
| 数据链路层 | 局域网内相邻设备传输 | 帧(Frame) | 交换机、网卡 | 封装成帧、MAC 寻址、差错检测、局域网转发 |
| (物理层) | 比特流物理传输 | 比特(Bit) | 网线、网卡、集线器 | 把帧转成电 / 光信号在物理介质传输 |
二、逐层详解(从应用到链路)
- 应用层:用户看得见的网络
- 核心作用:直接和应用程序交互,定义「要传什么、怎么传」。
- 典型协议 :
- HTTP/HTTPS:网页浏览
- DNS:域名转 IP
- FTP:文件传输
- SMTP/POP3:邮件
- 数据形态:应用层报文(比如 HTTP 请求头 + body),还没有任何网络层头部。
- 传输层:端到端的「快递分拣」
- 核心作用 :
- 用端口号区分不同应用(比如浏览器用 80/443,QQ 用其他端口),让数据能准确到对应程序。
- 提供两种通信模式:
- TCP:可靠、面向连接(三次握手、四次挥手、重传、排序),适合文件 / 网页传输。
- UDP:不可靠、无连接、高效,适合直播 / 游戏 / DNS。
- 数据封装 :给应用层报文加上 TCP/UDP 首部 (含源端口、目的端口、校验和等),变成:
- TCP:TCP 段(Segment)
- UDP:UDP 用户数据报(Datagram)
- 和上层的关系:应用层报文 → 被包裹在 TCP/UDP 首部后,交给网络层。
- 网络层:跨网的「导航系统」
- 核心作用 :
- IP 寻址:用 IP 地址标识全球唯一主机,解决「在哪」的问题。
- 路由转发:通过路由表 + 子网掩码,决定数据包「怎么走」到目标主机。
- 分片 / 重组:当报文超过链路 MTU 时,拆成多个分片,到目标主机再还原。
- NAT:把私网 IP 换成公网 IP,让多台设备共享公网 IP 上网(你之前学的核心机制)。
- 关键辅助协议 :
- ARP:IP → MAC 地址转换(连接网络层与数据链路层),广播请求、单播应答,有缓存表和过期时间。
- 数据封装 :给 TCP/UDP 段加上 IP 首部 (含源 IP、目的 IP、标识、分片偏移等),变成IP 数据报(Packet)。
- 核心流程:源主机 → 查路由表 → 若跨网则发给网关(路由器) → 路由器逐级转发 → 目标主机。
- 数据链路层:局域网内的「最后一公里」
- 核心作用 :
- 帧封装:把 IP 数据报封装成以太网帧,添加 MAC 地址和校验信息。
- MAC 寻址:用 MAC 地址标识同一局域网内的物理网卡,实现相邻设备间传输。
- 差错检测:用 CRC 校验发现传输错误,丢弃坏帧。
- 局域网转发:交换机根据 MAC 地址表,把帧转发到目标端口。
- 典型协议 / 格式 :
- 以太网 II 帧 :目的 MAC (6) + 源 MAC (6) + 类型 (2) + 数据 (46~1500) + CRC (4)
- 类型字段:
0x0800=IP 数据报,0x0806=ARP 报文
- 类型字段:
- 以太网 II 帧 :目的 MAC (6) + 源 MAC (6) + 类型 (2) + 数据 (46~1500) + CRC (4)
- 数据封装 :给 IP 数据报加上以太网首部 (含源 MAC、目的 MAC、类型),变成以太网帧(Frame)。
- 和上层的关系:IP 数据报 → 被包裹在以太网帧后,交给物理层转成比特流传输。
三、完整封装 / 解封装流程(以「打开网页」为例)
🔄 发送方(你的电脑):逐层封装
- 应用层 :浏览器生成 HTTP 请求报文(
GET /index.html HTTP/1.1...) - 传输层 :给 HTTP 报文加 TCP 首部(源端口随机、目的端口 443)→ 变成TCP 段
- 网络层 :给 TCP 段加 IP 首部(源 IP:你的私网 IP、目的 IP:服务器公网 IP)→ 变成IP 数据报
- 若 IP 数据报超过 MTU → 路由器分片(你之前学的分片机制)
- 若访问公网 → 路由器做 NAT(源 IP 换成公网 IP)
- 数据链路层 :给 IP 数据报加以太网首部(源 MAC:你的网卡 MAC、目的 MAC:网关 MAC、类型 0x0800)→ 变成以太网帧
- 物理层:帧转成电信号,通过网线 / Wi-Fi 发送出去
🔄 接收方(服务器):逐层解封装
- 物理层:电信号转成以太网帧
- 数据链路层:剥去以太网首部 → 得到 IP 数据报,校验 CRC
- 网络层:剥去 IP 首部 → 若有分片则重组 → 得到 TCP 段,检查 IP 地址
- 传输层:剥去 TCP 首部 → 得到 HTTP 请求报文,检查端口号
- 应用层:HTTP 服务器解析请求,生成响应,原路返回给你的电脑
四、核心逻辑总结(一句话串起所有层)
应用层定义「要什么」,传输层标记「给哪个应用」,网络层定位「去哪台主机」,数据链路层负责「怎么传给隔壁设备」,物理层负责「把数据变成信号传出去」。
关键关联回顾
- ARP:连接网络层(IP)和数据链路层(MAC),解决「知道 IP,怎么找 MAC」的问题。
- 路由:网络层核心,通过路由表决定 IP 数据报的下一跳。
- NAT:网络层 / 传输层扩展,让私网设备共享公网 IP,靠 NAT 表实现回包精准送达。
- 分片:网络层处理 MTU 差异,路由器分片、目标主机重组。
- 以太网帧:数据链路层载体,封装 IP/ARP 报文,实现局域网传输。