【计算机网络】IP 协议(IP划分/公私IP/NAT/路由/分片组装/mac帧/MTU/MSS/ARP协议)

目录

前置知识

[IP 协议的报头](#IP 协议的报头)

网段划分

[私有 IP 地址和公网 IP 地址](#私有 IP 地址和公网 IP 地址)

[NAT 技术](#NAT 技术)

路由

[IP 数据报的分片和组装](#IP 数据报的分片和组装)

数据链路层

以太网技术

[MTU 和滑动窗口的 MSS](#MTU 和滑动窗口的 MSS)

[数据链路层和 IP 层的合作](#数据链路层和 IP 层的合作)

[ARP 协议](#ARP 协议)


前置知识

  • TCP 协议只是提供了将数据可靠的传输的策略,不具备传输数据的能力,而 IP 协议具备。IP 协议 + TCP 协议提供了将数据可靠的传输的能力。
  • 在进行网络通信之前,要对网络的每台主机进行唯一的标识,IP 地址就是对主机的唯一标识
  • 我们去某个地方,一定是先到达目标城市,再到达目标地点。目标城市就好比一个子网,目标地点就好比子网的一台主机
  • 所以 IP 地址的构成一定是目标网络 + 目标主机
  • 在网络查找目标主机时,由于查找的本质是排除,IP 地址能够帮助我们更快排除其他主机,更快找到目标主机。

IP 协议的报头

  • 4 位版本号 (version): 指定 IP 协议的版本, IPv4 值为 4,IPv6 值为 6. 接收端发现版本不对会丢弃数据包。
  • 4 位首部部长度(header length) : 与 TCP 协议相同。指示 IP协议头部的总长度(以 4 字节为单位)。IP 的标准报头大小为 20 字节,但是因为选项 Options 字段长度可变(范围 0 到 40 字节),所以需要这个字段来明确有效载荷从哪里开始。例如:如果该值为 5,则表示头部长度为 5 * 4 = 20 字节(无选项)。最大值为 15,对应 60 字节(选项占 20 字节)
  • 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 位协议: 表示上层协议的类型.1:ICMP(ping 用的就是这个)6:TCP(例如 HTTP、HTTPS)17:UDP(例如 DNS、视频流)89:OSPF(路由协议)
  • 16 位首部校验和: 使用 CRC 进行校验, 来鉴别头部是否损坏.
  • 32 位源地址和32位目标地址: 表示发送端和接收端.
  • 选项字段(不定长, 最多40字节): 略

网段划分

IP地址分为两个部分, 网络号和主机号

网络号 : 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

不同的子网其实就是把网络号相同的主机放到一起.如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.

有关路由器

  • 路由器本质也是一个子网的主机,也要配置 IP 地址。
  • 路由器至少要连接两个子网,相当于路由器至少同时是两个子网的主机,有两个以上 IP 地址。
  • 路由器一般是子网的第一台设备,一般它的 IP 地址是网络号.1.
  • 路由器的功能不仅仅是 IP 报文的转发,还有诸如构建子网(局域网)的功能。

分类划分法

手动管理子网内的 IP, 是一个相当麻烦的事情.过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示(通过第一个 0 出现的位置区分不同的划分方式)

随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织(这里的组织,可以是一个机构、运营商甚至一个国家)都申请 B 类网络地址(因为 B 类的 IP 的网络号和主机号相对比较均衡,可以分配更多子网,每个子网可以分配较多主机), 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址(而实际网络架设中, 不会存在一个子网内有这么多主机的情况. 因此大量的IP地址都被浪费掉了),不知是 A 类可能浪费,所有划分方式都可能浪费。本来 IP 地址就只有 43 亿,现在已经不够用了,划分方式还出现了浪费。

排名 国家/地区 持有的 IPv4 地址数 占全球总量比例 数据来源/备注
1 🇺🇸 美国 16.08亿 43.60% IDIDB, 2026年数据
2 🇨🇳 中国 3.51亿 9.52% 综合数据
3 🇯🇵 日本 1.99亿 5.41% IP2Location, 2025年数据
4 🇬🇧 英国 1.39亿 3.77% 综合数据
5 🇩🇪 德国 1.37亿 3.71% IP2Location, 2025年数据
6 🇰🇷 韩国 1.15亿 3.13% IP2Location, 2025年数据
7 🇫🇷 法国 8327万 2.26% 综合数据
8 🇧🇷 巴西 8970万 2.43% IP2Location, 2025年数据
9 🇨🇦 加拿大 6979万 1.89% IP2Location, 2025年数据
10 🇮🇹 意大利 5753万 1.56% IP2Location, 2025年数据

CIDR 划分法

针对上面的情况提出了新的划分方案, 称为CIDR (Classless Interdomain Routing)

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
  • 子网掩码也是一个 32 位的正整数. 必须是连续的 1 从高位开始,不能出现间断,用连续的 "0" 来结尾;比如 255.0.0.0、255.255.0.0、255.255.255.0
  • 将 IP 地址和子网掩码的"连续 1 部分"进行按位与操作, 得到的结果就是网络号;将 IP 地址和子网掩码的"连续 0 部分"进行按位非操作, 得到的结果就是网络号;
  • 特殊的 IP 地址:每个子网的第一个地址(主机位全 0)是网络地址 ,代表的是该子网(局域网)。最后一个地址(主机位全 1)是广播地址,用来给同一子网的所有主机发送数据,127 开头的 IP 地址,是本地环回地址。这些地址都不能分配给某个具体设备。
  • 子网掩码可以简写为"/前缀长度",即网络部分 1 的个数。比如 255.0.0.0,前缀长度就是 \8,192.168.1.10/24 就表示 192.168.1.10 的前 24 位是网络部分,后 8 位是主机部分
  • CIDR 划分法是建立在分类划分法之上的,即 CIDR 划分法是在分类划分法的基础之上划分的,比如我得到的是 B 类的 IP 地址,但是我觉得主机部分太多了,我的每个子网只需要十几台主机,于是我在 B 类 IP 地址的基础之上,把主机部分的前 12 位纳入网络部分,只给主机部分保留 4 位,这样,每个子网最多只能接入 2^4 - 2 = 14 台主机。

常用子网掩码

掩码 前缀 地址总数 可用主机数 典型应用
255.255.255.252 /30 4 2 路由器间点对点链路
255.255.255.248 /29 8 6 小型设备组(如监控)
255.255.255.240 /28 16 14 小型办公室网络
255.255.255.224 /27 32 30 中小型部门网络
255.255.255.192 /26 64 62 中型部门网络
255.255.255.128 /25 128 126 较大部门网络
255.255.255.0 /24 256 254 最常见的小型网络
255.255.254.0 /23 512 510 合并两个 /24 子网
255.255.252.0 /22 1024 1022 合并四个 /24 子网
255.255.248.0 /21 2048 2046 中型企业子网
255.255.240.0 /20 4096 4094 较大企业子网
255.255.0.0 /16 65536 65534 大型企业主网段

特殊的子网掩码

掩码 前缀 特点 用途
255.255.255.255 /32 只有 1 个地址 主机路由、环回接口
0.0.0.0 /0 匹配所有地址 默认路由(0.0.0.0/0)

CIDR在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP 地址的绝对上限并没有增加), IP 地址仍然不是很够用。这时候有三种方式来解决:

  • 动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;
  • NAT 技术:后面会重点介绍;
  • IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6 用16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 在全球还没有普及,为什么呢?因为不是因为它不好,而是因为 IPv4 + NAT 这套"续命方案"还能撑住,而切换到 IPv6 需要投入真金白银的人力物力和时间,且短期内看不到直接的商业回报。而中国的情况则相反------政策推动力度大。截至 2024 年 5 月,各类网络中已分配 IPv6 地址的终端数达到 17.65 亿,移动网络 IPv6 流量占比已达 64.56%。这充分说明:当顶层设计给出明确方向时,技术障碍是可以被快速突破的。

私有 IP 地址和公网 IP 地址

私有 IP 地址和公网 IP 地址是 IPv4 地址空间中的两个互补概念,核心区别在于是否在全球互联网上唯一且可路由。简单理解:公网 IP 相当于你的身份证号(全球唯一,在哪都能被找到),私有 IP 相当于你家里的房间号(只在你们家内部有意义,外面的人不知道也不关心)。

对比维度 公网 IP 私有 IP
全球唯一性 是,全球唯一 否,可在不同内网重复使用
在公网路由 可以,是互联网的"门牌号" 不可以,公网路由器会丢弃
获取方式 向 ISP 付费租用 自由使用,无需申请
费用 需要付费(通常按月) 免费
地址范围 除私有、特殊地址外的所有地址 RFC 1918 规定的三段范围
能否直接访问互联网 可以,无需转换 不能,必须通过 NAT 转换
用途 服务器、网站、家庭路由器 WAN 口 局域网内部设备(PC、手机、打印机)

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到 Internet 上,理论上使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有IP地址只能是10、192.168 开头的或 172.16 到 172.31 开头的,这些 IP 是专门为私有 IP 保留的,永不为公网 IP,其余的都是公网 IP.

类别 地址范围 掩码 可用地址数 典型使用场景
A 类 10.0.0.0 ~ 10.255.255.255 /8 16,777,216 大型企业、数据中心内部
B 类 172.16.0.0 ~ 172.31.255.255 /12 1,048,576 中型企业、学校网络
C 类 192.168.0.0 ~ 192.168.255.255 /16 65,536 家庭、小型办公室(最常见)

NAT 技术

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

NAT 技术

NAT技术背景

之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题。到目前为止,NAT 技术解决 IP 地址不够用的最主要手段, 是路由器的一个重要功能;

  • NAT 技术能够将局域网内的多个私有 IP 对外通信时转为公网 IP(多个私有 IP 共享同一个公网 IP). 也就是就是一种将私有 IP 和全局 IP 相互转化的技术方法:
  • 公网 IP 要求唯一, 但是私有 IP 不需要; 在不同的局域网中出现相同的私有 IP 是完全不影响的,不同局域网的设备使用相同的私有 IP,从而极大缓解了 IP 地址不足问题。
  • NAT 技术不仅解决了IP 地址不够用的问题,同时为内网设备提供了一层基础的安全防护(内网设备不直接暴露在公网,增加了一层保护)

NAT 的核心原理

NAT 设备(通常是路由器)修改 IP 数据包的源 IP 地址(内网对外发送时)或目的 IP 地址(回来的数据转发给内网设备时),并维护一个转换表。NAT 设备必须记住"谁发起连接"(记录在转换表),才能把回来的数据正确转给内网设备。转换表通常形如:源 IP:源端口 - 修改后的 IP :修改后的端口 - 目的 IP:目的端口,它的意思是:从目的 IP:目的端口回来的数据,要交给源 IP:源端口。

NAT 的三种主要类型

类型 别名 映射方式 典型场景
静态 NAT 1:1 NAT 一个内网 IP 固定对应一个公网 IP 公司对外服务器
动态 NAT 池 NAT 从公网池中动态分配,用完释放 需要临时公网 IP 的设备
NAPT IP 伪装、PAT 多个内网 IP 共享一个公网 IP,用端口区分 家用路由器(最常见)

最常见的是 NAPT它不仅转换 IP 地址,还转换端口号,从而让多个设备共享一个公网 IP。它带来的好处是解决这个问题:如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的 IP 都是相同的. 那么 NAT 路由器如何判定将这个数据包转发给哪个局域网的主机? 由于 NAPT 还转换端口号,所以即使是多个主机都访问同一个外网服务器,经过 NAPT 转换后的源端口号不同。

NAT 的完整工作流程实例

  1. 内网电脑(192.168.1.100:54321)发起请求:我要访问百度(14.215.177.38:80)

  2. 路由器 NAT 处理

    • 修改源 IP:192.168.1.100 → 路由器的公网 IP 1.2.3.4

    • 分配新端口:543219999(假设)

    • 记录转换表:(192.168.1.100,54321) ↔ (1.2.3.4,9999) ↔ (14.215.177.38,80)

  3. 百度收到请求 :源 IP 1.2.3.4:9999,回复时发给 1.2.3.4:9999

  4. 路由器收到回复

    • 查转换表,发现 1.2.3.4:9999 对应内网 192.168.1.100:54321

    • 修改目的 IP:1.2.3.4:9999192.168.1.100:54321

    • 转发给内网电脑

  5. 内网电脑收到数据:整个过程对用户完全透明

NAT 技术的缺陷

由于 NAT 转换,必须是内网设备先访问外网,在路由器建立转换关系之后,外网设备的数据才能发送给内网设备。如果一个内网设备在没有访问外网,即路由器没有建立转换关系时,外网设备是无法访问内网设备的,因为路由器如果没有查询到转换关系,会直接丢弃报文。解决这个问题可以使用**内网穿透:**主动找"中转站"(一个有公网IP的云服务器)长期租一个"代收点"(一个隧道),并告诉它你的住址。当快递员想给你送快递时,他直接送到"中转站","中转站"再通过专用通道转交给你。

路由

IP数据包的传输过程也和问路一样.当 IP数据包(被封装成以太网帧), 到达路由器时, 路由器进行以太网帧的解包,得到 IP数据包,查看IP数据包的目的IP;路由器决定这个数据包是能直接发送给与它相连接的目标主机, 还是需要发送给下一个路由器;依次反复, 一直到达目标IP地址;那么如何判定这个数据包该发送到哪里呢? 这个就依靠每个路由器内部维护一个路由表

使用 route 指令可以查看本机的路由表:

本地主机也可以工作在网络层,路由表不是只有路由器才有,当本机主机

bash 复制代码
[hxh@VM-16-12-centos ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.10.0    *               255.255.255.0   U     0      0        0 eth0
192.168.56.0    *               255.255.255.0   U     0      0        0 eth1
127.0.0.1       *               255.0.0.0       U     0      0        0 lo
default         192.168.10.1    0.0.0.0         UG    0      0        0 eth0

表项解释:

  • Destination 是目的网络地址,其下的 default 是默认路由
  • Genmask 是子网掩码,
  • Gateway 是下一跳地址,
  • Iface 是发送接口,如果目的 IP 命中 Destination,则通过 Iface 所指示的发送接口发送
  • Flags 中的 U 标志表示此条目有效(可以禁用某些条目),G 标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
  • 这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到
    192.168.56.0/24网络;

路由表工作原理:

从上往下依次遍历路由表的每个条目,将产生的 IP 数据报的目的 IP 和子网掩码进行按位与操作,将得到的网络地址与 Destination 比对。通常会有两种结果:

命中 Destination,通过 Iface 所指示的发送接口发送,发送的目的地可能是就是目的 IP 所在的子网,也可能是下一个中转路由器。

没有命中任何 Destination,转入默认路由(default),默认路由通常是同子网的另一台路由器(同一个子网一般只有一个路由器)。

IP 数据报的分片和组装

由于网卡等物理硬件以及局域网通信碰撞问题的限制,数据链路层一次不能发送太多的数据,使用 ifconfig 指令可以查看发送接口一次最多可以发送的字节数:

bash 复制代码
[hxh@VM-16-12-centos ~]$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
// ...

mtu 1500 : 即 eth0 接口最多可以一次发送 1500 字节。如果 IP 数据报大于 1500 字节,就要求 IP 协议进行分片 ,要求接收端主机进行 IP 数据报的组装

IP 协议报头中有关分片和组装的字段

  • 16 位标识(id): 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片了, 那么每一个片里面的这个 id 都是相同的.
  • 3 位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0,表示该分片是最后一个分片, 其他是 1. 类似于一个结束标记.
  • 13 位分片偏移(framegament offset): 是分片相对于原始 IP 报文开始处的偏移. 其实就是在表示当前分片的前面的所有分片的总大小. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文就不连续了).

这些字段已经很可以说明如何将 IP 数据报分片,下面说明如何将分片组装起来:

先要知道如何判断一个数据报是否被分片了,因为被分片的数据报可能不会按分片的顺序依次到达接收主机。接收方只要收到一个数据报的 3 位标志字段为 001 或者是 13 位分片偏移不为 0,就判断该 id 的数据报是被分片的,要进行组装,如何组装:

要确保将所有分片聚在一起 ----> 16 位标识(id) 、13 位分片偏移、3 位标志字段:

  • 如果丢失第一个分片,那么我没有收到任何一个分片的 13 位分片偏移为 0。
  • 如果丢失最后一个分片,那么我没有收到任何一个分片的 3 位标志字段为 000.
  • 如果丢失中间某个分片,那么我在校验某个数据报前面的报文的总大小时(用13 位分片偏移校验),会发现小于数据报13 位分片偏移所指示的总大小

组装失败的场景:

场景 说明
某个分片丢失 网络传输中丢了一个分片,永远收不到
分片超时 第一个分片到达后,等待其他分片的时间超过了限制
分片重叠或错误 恶意或损坏的分片,偏移量计算错误/重叠
内存不足 接收端设备资源有限,无法缓存所有分片

无论哪种失败,IP 层会直接丢弃组装失败的分片,永远不会将不完整的数据包交给上层协议(TCP、UDP、ICMP 等)。上层只会收到要么完整的数据,要么什么都没收到。如果上层协议什么都没有收到,就不会向发送方回复 ACK,这不就是丢包问题吗?所以我们不建议分片,分片会提高丢包的概率。

分片排序 ----> 13 位分片偏移,按照分片偏移从小到大排序

数据链路层

以太网技术

"以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;

例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;

以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

以太网的标识方式:MAC 地址

  • 这是出厂时烧录在网卡上的全球唯一标识符(48位,比如 00:16:3e:12:34:56 )。

  • 作用:如果说 IP 地址是你的"收货地址",会随你搬家而改变;那么 MAC 地址就是你的"身份证号",终身不变。在同一个局域网内,设备不认 IP,只认 MAC 地址

  • 与 IP 地址的区别:MAC 地址是在一个局域网内标识唯一一台主机或者路由器,用于数据在局域网中传输,而跨局域网就要使用 IP 地址。IP 地址好比路途总体的起点和终点,而 MAC 地址好比路途的中转站。

以太网帧的报头

网络层的 IP 数据报向下交付给数据链路层,在 IP 数据报的基础之上,再加上以太网技术规定的报头,就形成了以太网帧,也叫数据帧、MAC帧。下面是 MAC 帧的报头(也叫帧头)的字段:

字段名称 长度(字节) 位置 说明
前导码(Preamble) 7 (帧头之前) 用于同步,不是正式报头
帧首定界符(SFD) 1 (帧头之前) 标志帧开始,不是正式报头
目的 MAC 地址 6 报头第 1 部分 接收方物理地址
源 MAC 地址 6 报头第 2 部分 发送方物理地址
类型 2 报头第 3 部分 标识上层协议 0x0800:IPv4 0x86DD:IPv6 0x0806:ARP
数据/载荷 46 ~ 1500 数据部分 上层协议数据(如 IP 包)
帧校验序列(FCS) 4 帧尾 CRC 校验,不属于报头

通常说的"以太网帧头" = 目的 MAC(6B)+ 源 MAC(6B)+ 类型/长度(2B)= 14 字节。以太网帧的报头采用定长报头,所以很容易将报头和有效载荷分离。报头的类型字段用于分用。

以太网通信的核心机制:MAC 地址寻址

假设你有两台电脑 A 和 B,通过交换机连接在同一个局域网内,A 想给 B 发送数据。这个过程分为两种情况:

场景一:A 知道 B 的 MAC 地址

如果 A 已经知道 B 的 MAC 地址,那就很简单:

  1. 封装:操作系统内核中的协议栈构造一个以太网帧,里面填上:

    • 源 MAC = A 的 MAC

    • 目标 MAC = B 的 MAC

    • 数据部分 = IP 数据报

  2. 发送:A 把这段二进制数据(电压信号)通过网线发出去。

  3. 接收与过滤:局域网内的交换机把信号转发给 B,B 的网卡检测到信号,解析帧头,发现目标 MAC 是自己的,于是触发中断,通知 CPU来取数据。

场景二:A 只知道 B 的 IP,不知道 MAC 地址(最常见的场景)

这是最核心的部分。当 A 想和 B 通信,但只知道 B 的 IP(比如 192.168.1.5)时,就需要 ARP协议(地址解析协议)来帮忙。

这个过程很像你在小区里找一个不认识具体房号、只知道名字的人:

  1. 广播询问 :A 在局域网内喊一嗓子(发送一个 ARP 请求 ):"各位注意,我是 A(MAC=AA:AA),谁是 192.168.1.5?请把你的 MAC 地址告诉我。"

    • 这个请求帧的目标MAC地址是 FF:FF:FF:FF:FF:FF(广播地址),意味着局域网内的所有设备都能收到。
  2. 目标应答 :B 听到有人喊自己的 IP,就回复一条信息给 A(ARP响应 ):"我是 B,IP 192.168.1.5 是我的,我的 MAC 地址是 BB:BB。"

    • 这个响应是单播的,因为 A 已经把自己的 MAC 地址告诉了大家。
  3. 缓存记录 :A收到B的MAC地址后,把它记在一张表里(ARP缓存表),下次再通信就不需要喊了。

    • 在Linux中,你可以用 arp -n 命令查看这张表。

以太网的数据碰撞问题

回到最早的以太网(同轴电缆时代),所有设备都连接在同一根物理线缆上,共享介质。这就像一个狭长的会议室,所有人都对着同一根管道说话。

碰撞的产生

  • 当设备A和设备B同时检测到线路是空闲的,于是同时开始发送数据

  • 电信号在铜线上相遇,相互叠加干扰

  • 两边的数据都变得无法辨认------这就是碰撞(Collision)

研究碰撞问题,碰撞域是一个重要的概念

  • 定义:一组设备中,任何两个设备同时发送数据都会产生碰撞的区域

  • 早期以太网:整个总线网络就是一个碰撞域,所有设备共享

  • 问题:设备越多,碰撞概率越大,网络效率越低

交换机 的发明彻底解决了碰撞问题,在交换机发明之前,CSMA/CD 协议用来解决碰撞问题。交换机的工作原理:假设 H1 向 H2 发送数据,交换机识别到 H1 和 H2 都在交换机的左侧,那么该数据在到达交换机之后,不会再扩散到交换机的右侧,有效减少了碰撞。交换机减少碰撞的原理就是划分碰撞域。

MTU 和滑动窗口的 MSS

什么是 MTU?

MTU 相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层产生的限制.

以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,ARP数据包的长度不够 46 字节,要在后面补填充位;最大值 1500 字节称为以太网的最大传输单元(MTU),不同的网络类型有不同的 MTU;

  • 由于碰撞问题,所以以太网帧的数据应该尽量较少,因为如果以太网帧的数据太多,单次发送的时间变长,与其他以太网帧的碰撞的概率就高了。这就是为什么以太网帧的有效载荷最小是 46 字节,最大是 1500 字节,也解释了为什么 IP 数据报太大应该进行分片,可是分片太多又会增加丢包概率,所以我们不建议分片,所以我们应该限制 TCP 每次发送给 IP 的数据段的大小,数据段最大为 MSS,而 MSS + TCP 报头 + IP 报头 == 1500 字节

  • 如何限制呢?既然以太网帧最大是 1500 字节,那么 IP 层发送给数据链路层的数据报就不能超过 1500 字节,即如果数据报没有 IP 报头的选项字段,那么数据报的有效载荷最大就是 1500 - 20 = 1480 字节,即 TCP 发送给 IP 的数据段最大不能超过 1480 字节,如果数据段没有 TCP 报头的选项字段,那么数据报有效载荷最大就是 1480 - 20 = 1460 字节,即滑动窗口单次发送数据最大不能超过 1460 字节
  • 既然以太网帧最大是 1500 字节,那么接收方接收到的以太网帧最大也不能超过 1500 字节,而以太网帧在数据链路层传递时,可能会经过不同的数据链路层,而不同的数据链路层一般 MTU 不同,所以TCP 在建立连接时通过 MSS 协商,告诉对方"我这边每个 TCP 段的数据部分不要超过这个值 ",目的是让TCP 段(TCP头 + 数据) → 加上 IP 头 → 整个 IP 包 ≤ 路径上的最小 MTU,从而避免 IP 分片。

数据链路层和 IP 层的合作

当 IP 数据报到达数据链路层时,如果目的 IP 是局域网之外的 IP,数据链路层的以太网协议怎么知道目的 IP 是局域网之外的 IP,然后将构建的以太网帧的目的 mac 地址设置为路由器的 mac 地址?

第一步:IP层做出路由决策

当你的应用程序(比如浏览器)要发送数据给一个目的IP地址(例如 8.8.8.8)时,数据先被封装成IP数据报.此时,主机的操作系统内核(IP层) 会做一次关键决策:查询本机的路由表

8.8.8.8 此没有命中路由表的任何 Destination,该主机决定发送给默认网关 Defualt

  • 路由表判断的逻辑是:

    1. 将目的 IP 地址(8.8.8.8)与本机的所有网卡和路由条目进行匹配。

    2. 如果发现目的 IP 与本机的子网掩码计算出网络地址相同 (比如都是 192.168.1.0/24),就判定为目标在局域网内,通信应该直接发送给对方。

    3. 如果在路由表中没有找到更精确的匹配(绝大多数访问外网的情况),就会匹配到默认路由 ,其条目通常为 0.0.0.0/0

  • 这条默认路由的"下一跳"地址 ,就是你网络配置中的默认网关 IP ,通常是你的路由器IP地址(如 192.168.1.1)。

IP层得出的结论是: 这个 IP 数据报不能直接发给 8.8.8.8,我必须先发给我的"网关"(192.168.1.1),让它帮我转发出去。所以,此时IP层的数据报已经确定了目标:下一跳 IP 地址 = 网关的 IP 地址

第二步:ARP 协议解析 MAC 地址

现在,IP 数据报需要向下传递给数据链路层,要被封装成以太网帧。但是以太网帧需要一个目的 MAC 地址才能发送。

核心逻辑来了: 主机检查自己的 ARP缓存表 ,看是否有 192.168.1.1 对应的 MAC 地址。

  • 如果缓存中有:直接取出网关的 MAC 地址。

  • 如果缓存中没有 :主机会在局域网内广播一个 ARP 请求 :"谁是 192.168.1.1?请告诉我你的 MAC 地址。只有网关(192.168.1.1)会回复这个请求,告诉主机自己的 MAC 地址。

第三步:封装以太网帧并发送

现在,数据链路层拥有了构建帧的所有信息:

  • 目的MAC地址AA:BB:CC:DD:EE:FF (网关的MAC地址)

  • 源MAC地址11:22:33:44:55:66 (本机网卡的MAC地址)

  • 类型字段0x0800 (表示上层承载的是IPv4数据报)

  • 载荷 :包含了完整IP数据报的数据(这个IP数据报的目标IP地址依然是 8.8.8.8,从未改变)。

以太网帧构建完成后,通过网卡发送到网络(通常是交换机)。交换机根据目的MAC地址(AA:BB:CC:DD:EE:FF)将这个帧从对应的端口转发给路由器。

ARP 协议

ARP(Address Resolution Protocol,地址解析协议) 是介于网络层和链路层的协议(以太网帧的上层协议,但是归属于数据链路层),负责将 IP 地址 解析为 MAC 地址,以便数据能在局域网内实际传输。

简单来说,ARP 的作用就是:给定一个 IP 地址,问"谁有这个 IP?请告诉我你的 MAC 地址"

为什么需要 ARP 协议?

在以太网中,两个设备直接通信时,底层硬件只认 MAC 地址

  • IP 数据报包含了源 IP 和目标 IP

  • 但数据链路层的以太网帧需要的是目的 MAC 地址

ARP数据报的格式

字段 长度 说明
硬件类型 2 字节 以太网 = 1
协议类型 2 字节 IPv4 = 0x0800
硬件地址长度 1 字节 MAC 地址长度 = 6
协议地址长度 1 字节 IP 地址长度 = 4
操作码 2 字节 1=请求,2=响应
发送端 MAC 6 字节 发送方 MAC
发送端 IP 4 字节 发送方 IP
目标 MAC 6 字节 请求时为 0
目标 IP 4 字节 请求时是要查询的 IP

ARP 协议的工作流程

假设 主机 A (IP: 192.168.1.10,MAC: AA:AA:AA:AA:AA:AA)想给 主机 B(IP: 192.168.1.20,MAC: BB:BB:BB:BB:BB:BB)发数据。

步骤 1:检查 ARP 缓存

主机 A 先查看自己的 ARP 缓存表,是否有 192.168.1.20 到 MAC 的映射。

  • 如果有 → 直接用

  • 如果没有 → 发起 ARP 请求

ARP 缓存表可以使用 arp -a 指令查看。缓存表中的表项有过期时间 (一般为20分钟) ,如

果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址

步骤 2:发送 ARP 请求(广播)

主机 A 先构建一个 ARP 请求:

这个请求的意思是:"谁是 192.168.1.20?请告诉我你的 MAC 地址。"

再将这个 ARP 请求向下交付给数据链路层,加上以太网帧的报头:

将这个以太网帧发送到局域网后,由于以太网帧的报头的目的以太网地址是广播地址,同一局域网的所有主机在收到该以太网帧后都会处理,解析以太网帧的报头的帧类型字段后,发现以太网帧的有效载荷是是 ARP 请求/响应,于是将报头和有效载荷分离后,就交付给上层 ARP 协议, ARP 协议再检查 ARP 请求的目的 IP 地址是否是自己,如果是,则发送一个 ARP 响应,否则丢弃。

步骤 3:目标主机响应(单播)

主机 B 收到广播后,解析以太网帧的报头的帧类型字段后,发现以太网帧的有效载荷是是 ARP 请求/响应,就交付给上层 ARP 层, ARP 层再检查 ARP 请求的目的 IP 地址是否是自己,发现是,再检查 op = 1,这是 ARP 请求,于是构建 ARP 响应:

把 ARP 响应向下交付给数据链路层,构建以太网帧:

意思是:"我就是 192.168.1.20,这是我的 MAC 地址。"

步骤 4:更新缓存并发送数据

其他主机的数据链路层收到上面的以太网帧之后,发现以太网帧的帧头的以太网目的地址不是广播地址,也不是自己,于是直接丢弃。主机 A 的数据链路层收到后,发现以太网目的地址是自己,检查帧类型是 0806,即该以太网帧的有效载荷是 ARP 请求/响应,于是将报头和有效载荷分离后,交给了上层的 ARP 协议。ARP 协议检查目的以太网地址是自己,再检查 op = 2,这是 ARP 响应,再检查发送端的 IP 地址,发现是之前请求的主机 B 的响应,于是将主机 B 的 IP 地址到主机 B 的 MAC 的对应关系存入 ARP 缓存表

ARP 协议的周边问题

  • 局域网内的主机在通信时,不是每次通信前都进行 ARP 请求获取对方的 MAC 地址,只要当 ARP 缓存表失效才会进行 ARP 请求。
  • 如果收到多个相同的 ARP 应答,会以最新的为准。ARP 欺骗 :某个主机伪装成路由器,不断的向攻击目标发送 ARP 应答, ARP 应答的 IP 地址是路由器的 IP 地址,而 MAC 地址是攻击者的 MAC 地址,被攻击主机处理了该 ARP 应答,之后它的 MAC 帧都会发送到攻击者,攻击者直接丢弃 MAC 帧,就等同于让被攻击主机断网。攻击者也可以不丢弃 MAC 帧,将篡改后的 MAC 帧(MAC 帧的发送方 MAC 地址改为攻击者的 MAC 地址)发送给路由器,路由器返回的 MAC 帧也会流经攻击者,这种攻击称为基于 ARP 欺骗的中间人攻击。攻击者不仅可以欺骗被攻击主机(告诉被攻击者我是路由器),还可以同时欺骗路由器(告诉路由器我是被攻击者)
  • RARP 协议:ARP 协议是拿着 IP 地址找 MAC 地址,RARP 协议就是反过来拿着 MAC 地址找 IP 地址。
相关推荐
我滴老baby1 小时前
智能体安全防护指南从输入校验到工具沙箱的全方位防御策略
网络·安全
上海云盾王帅1 小时前
如何有效抵御恶意IP攻击:从封禁到智能治理的进阶之路
网络·tcp/ip·安全
顶点多余1 小时前
基于tcp服务器实现远程命令操作功能
网络·网络协议·tcp/ip
xhbh6661 小时前
Windows 如何实现 IP 转发?从注册表到 netsh 命令的完整指南
网络
混迹中的咸鱼1 小时前
Unreal Engine 5 联机网络架构技术手册
网络·架构·ue5
pengyi8710151 小时前
HTTP与HTTPS代理基础区别,协议原理通俗解析
网络·爬虫·网络协议·tcp/ip·智能路由器
call me by ur name1 小时前
多模态大模型轻量化
前端·网络·人工智能
专注VB编程开发20年1 小时前
轻量级多进程消息收发模型WEBSOCKET,MQTT
网络·websocket·网络协议
计算机安禾8 小时前
【计算机网络】第13篇:传输层责任的形式化描述——复用、分用与差错控制的协议逻辑
计算机网络