Skip to content

Linux 网络模型

OSI七层模型

OSI模型是一个网络通信的概念模型,用于描述计算机网络中各个不同层次之间的通信和功能。它将网络通信分为七个不同的层次,每个层次负责不同的任务,使得网络通信的设计、开发和管理更加模块化和可维护

mermaid
graph TD
    A[应用层] -->|HTTP/FTP/SSH| B[表示层]
    B -->|数据加密/压缩| C[会话层]
    C -->|建立/管理会话| D[传输层]
    D -->|TCP/UDP| E[网络层]
    E -->|IP/ICMP| F[数据链路层]
    F -->|MAC地址| G[物理层]
    G -->|比特流传输| H[物理介质]
层级名称功能描述设备或协议
7应用层为应用程序提供网络服务接口HTTP、FTP、DNS
6表示层数据格式转换、加密/解密、压缩编码器、SSL/TLS
5会话层建立、管理和终止应用程序间的会话VPN设备、N/A
4传输层提供端到端可靠/不可靠的数据字段传输(TCP/UDP)防火墙
3网络层通过IP地址实现逻辑寻址和路由选择。数据包形式传输路由器、三层交换机
2数据链路层提供节点到节点的数据帧传输和MAC地址管理交换机、网桥
1物理层通过物理介质传输原始比特流网线、光纤、集线器

TCP/IP五层模型

TCP五层模型是将七层中的应用层、表示层、会话层合并成一层统称应用层。

mermaid
graph TD
    A[应用层] -->|HTTP/DNS/SSH| B[传输层]
    B -->|TCP/UDP| C[网络层]
    C -->|IP/ICMP| D[数据链路层]
    D -->|以太网/ARP| E[物理层]
    E -->|网线/光纤| F[物理介质]
层级名称对应OSI层核心功能典型协议
5应用层5-7应用程序通信HTTP/SSH/DNS
4传输层4端到端连接管理TCP/UDP
3网络层3数据包路由与转发IP/ICMP
2数据链路层2本地网络帧传输Ethernet/ARP
1物理层1物理信号传输IEEE 802.3

数据传输过程

  1. 同层协议对话:发送端与接收端同一层级通过头部信息通信 (如双方网络层通过IP头部中的TTL字段协调数据包生存时间)

  2. 上层控制下层:高层协议决定低层头部内容 (如应用层指定目标端口 → 传输层写入TCP头;网络层根据传输层协议类型设置IP头的Protocol字段)

  3. 下层服务透明:上层无需感知下层实现细节 (应用层不关心数据是通过以太网还是WiFi传输)

  4. 逐层封装/解封:每个层级只处理本层头部信息 (传输层不会修改IP头,网络层不会读取TCP端口号)

CAUTION

同层只能读取同层头部信息,上层可以读取下级头部信息,上层可以修改下级头部信息。

封装层次结构

tex
┌───────────────────────────────┐
│ ⑦ 应用层数据                    │ ← HTTP报文/SSH指令
├──────────┬────────────────────┤			
│ ④ TCP头  │ 源端口:443          │ ← 传输层封装数据段
│          │ 目的端口:8080       │
├─────────┬┴────────────────────┤
│ ③ IP头   │ 源IP:192.168.1.2    │ ← 网络层封装数据包
│         │ 目的IP:203.0.113.5   │
├─────────┴┬────────────────────┤
│② MAC头   │ 源MAC:00:1A:2B...   │ ← 数据链路层封装
│          │ 目的MAC:00:1C:2D... │
├────────┬─┴────────────────────┤
│① 1010101001...            	│ ← 物理层比特流
└────────┴──────────────────────┘

数据发送端封装流程

  1. 应用层 → 生成原始数据(如HTTP请求) → 传递至传输层时携带目标端口号

  2. 传输层 → 添加TCP/UDP头部(含源/目的端口) → 将数据段交给网络层

  3. 网络层 → 添加IP头部(含源/目的IP地址) → 通过路由表选择路径,生成数据包

  4. 数据链路层 → 添加MAC地址头部/尾部(含源/目标MAC) → 通过ARP协议解析下一跳MAC地址,形成数据帧

  5. 物理层 → 将二进制数据帧转换为电信号/光信号 → 通过网线/光纤传输

    NOTE

    应用数据 → TCP/UDP数据段 → IP数据包 →数据帧 ( 应用层 → 传输层 → 网络层 → 数据链路层→ 物理层的逐级转换)

mermaid
sequenceDiagram
    participant 应用层
    participant 传输层
    participant 网络层
    participant 数据链路层
    participant 物理层

    应用层->>传输层: 原始数据(HTTP请求)
    传输层->>传输层: 添加TCP头(源/目的端口)
    传输层->>网络层: TCP段
    网络层->>网络层: 添加IP头(源/目的IP)
    网络层->>数据链路层: IP数据包
    数据链路层->>数据链路层: 添加帧头/尾(MAC地址)
    数据链路层->>物理层: 以太网帧
    物理层->>物理介质: 比特流(电/光信号)

数据接收端解封流程

  1. 物理层 → 将电信号转换为二进制数据 → 提交完整数据帧至数据链路层

  2. 数据链路层 → 校验MAC地址和帧完整性 → 剥离帧头/尾,将IP数据包递交给网络层

  3. 网络层 → 校验IP地址是否匹配 → 剥离IP头部,将TCP/UDP数据段转交给传输层

  4. 传输层 → 根据端口号定位具体应用 → 重组数据流并验证完整性,提交原始数据至应用层

  5. 应用层 → 接收最终处理后的原始数据 → 执行业务逻辑(如渲染网页)

    NOTE

    数据帧 → IP数据包 → TCP/UDP数据段 → 应用数据 (物理层 → 数据链路层 → 网络层 → 传输层 → 应用层的逐级转换)

mermaid
sequenceDiagram
    participant 物理层
    participant 数据链路层
    participant 网络层
    participant 传输层
    participant 应用层

    物理层->>数据链路层: 接收比特流
    数据链路层->>数据链路层: 去除帧头/尾(校验MAC)
    数据链路层->>网络层: IP数据包
    网络层->>网络层: 解析IP头(路由判断)
    网络层->>传输层: TCP段
    传输层->>传输层: 解析TCP头(端口分配)
    传输层->>应用层: 原始数据

Linux 网络协议

通信模式解析

通信模式传输方向原理说明典型应用场景关键技术特征
单工模式(Simplex)单向固定(A→B)数据只能单向传输,接收方无法回传数据。通信信道为单向物理线路设计广播系统、传感器数据采集无反馈机制
固定发射端与接收端
半双工(Half-Duplex)双向交替一个时间点只能由一方进行数据传输,不能同时传输传统以太网(HUB环境)
对讲机通信
载波侦听多路访问
冲突检测重传机制
全双工Full-Duplex双向同时使用独立物理信道实现双向并发传输,无需状态切换现代交换式以太网
光纤通信
全双工交换机支持
流量控制(PAUSE帧)
mermaid
graph TD
    A{需要双向通信?} -->|否| B[使用单工模式]
    A -->|是| C{是否要求同时传输?}
    C -->|否| D[选择半双工]
    C -->|是| E[全双工]
    D --> F{网络设备类型?}
    F -->|HUB| G[强制半双工]
    F -->|交换机| H[自动协商检测]
    E --> I[确保物理线路支持]

网络协议分类

mermaid
pie
    title 协议层级分布
    "应用层(HTTP/DNS)" : 35
    "传输层(TCP/UDP)" : 25
    "网络层(IP/ICMP)" : 20
    "数据链路层(ARP)" : 15
    "物理层" : 5
典型协议协议类型关键特征
TCP面向连接稳定的安全可靠的双工协议,使用场景是重要数据传输
UDP无连接不可靠的单工协议,特点传输效率高
OSPF/BGP路由协议维护路由表
TCP/QUIC传输协议端到端数据传输
ARP/NDP地址转换协议IP-MAC地址映射

TCP协议

mermaid
sequenceDiagram
    participant Client
    participant Server

    %% 三次握手
    rect rgb(245, 245, 245)
    note over Client,Server: 三次握手(连接建立)
    Client->>Server: SYN=1 seq=x (SYN_SENT)
    note right of Server: 初始序列号 y = ISN
    Server->>Client: SYN=1 ACK=1 seq=y ack=x+1 (SYN_RCVD)
    Client->>Server: ACK=1 seq=x+1 ack=y+1 (ESTABLISHED)
    note left of Client: 双方进入连接状态
    end

    %% 数据传输
    rect rgb(230, 240, 250)
    note over Client,Server: 数据传输(双向通信)
    Client->>Server: seq=x+1, ack=y+1, len=100 (发送数据)
    note right of Server: 收到 100 字节数据<br/>期望下次 seq=x+1+100=x+101
    Server->>Client: ACK=1 seq=y+1 ack=x+101 (确认接收)
    Server->>Client: seq=y+1, ack=x+101, len=80 (响应数据)
    Client->>Server: ACK=1 seq=x+101 ack=y+1+80=y+81 (确认接收)
    end

    %% 四次挥手
    rect rgb(245, 245, 245)
    note over Client,Server: 四次挥手断开连接
    Client->>Server: FIN seq=x+2 seq=u(FIN_WAIT_1)
    Server->>Client: ACK=1 ack=u+1 (CLOSE_WAIT)
    Server->>Client: FIN seq=v (LAST_ACK)
    Client->>Server: ACK=1 ack=v+1 (TIME_WAIT)
    end

TCP特点

  1. TCP是面向连接的,可靠的进程到进程通信的协议
  2. TCP提供全双工服务,即数据可在同一时间双向传输
  3. TCP将若干个字节构成一个分组,此分组称为报文段

报文类型

报文类型含义状态
SYN发起一个新连接1表示发起连接
FIN释放一个连接1表示结束连接
seq随机序号随机数
ACK确认序号有效1表示序号有效
ack随机号回复ack=seq+1

NOTE

**TCP 标志位的显式要求:**在 TCP 协议中,SYN、ACK、FIN 等标志位必须显式设置,不存在默认值为 1 的情况。每个标志位的状态(0 或 1)需根据协议规范明确指定,否则报文会被视为无效或不符合流程要求。若省略 SYN=1,接收方无法识别这是连接请求。

TCP三次握手

mermaid
sequenceDiagram
participant Client
participant Server

Client->>Server: SYN=1, seq=x (SYN-SENT 同步已发状态)
  Note right of Server: 分配资源<br>进入SYN_RCVD状态
Server->>Client: SYN=1, ACK=1, ack=x+1, seq=y (SYN-RCVD 同步收到)
Note left of Client: 验证确认号
Client->>Server: ACK=1, ack=y+1,seq=x+1 (ESTABLISHED 已建立连接)
 Note right of Server: 进入ESTABLISHED状态

第一次握手 - SYN 请求

Client客户端Server服务端发送一个 SYN=1 标志的数据包:

  • 随机生成初始序列号 seq = x
  • 状态变为 SYN-SENT(同步已发送)
  • 示例数据包:[SYN] seq=x

第二次握手 - SYN-ACK 响应

Server服务端收到 SYN 后回复 SYN=1ACK=1 标志的数据包:

  • 随机生成自己的初始序列号 seq = y
  • 确认号设为 ack = x+1(表示已收到客户端的 x)
  • 状态变为 SYN-RECEIVED(同步已接收)
  • 示例数据包:[SYN, ACK] seq=y, ack=x+1

第三次握手 - ACK 确认

Client客户端验证Server服务端的 ack=x+1 后,发送 ACK=1 标志的数据包:

  • 序列号更新为 seq = x+1(表示已占用一个序列号)
  • 确认号设为 ack = y+1(表示已收到服务端的 y)
  • 双方状态变为 ESTABLISHED(连接已建立)
  • 示例数据包:[ACK] seq=x+1, ack=y+1

为什么需要三次握手

历史连接去重

防止旧SYN包因网络延迟导致资源占用

双向信道验证

确保双方收发能力均有效:

  • Client验证:Server能收(SYN)能发(SYN-ACK)
  • Server验证:Client能收(SYN-ACK)能发(ACK)
举例:已失效的连接请求报文段。

client发送了第一个连接的请求报文,但是由于网络不好,这个请求没有立即到达服务端,而是在某个网络节点中滞留了,直到某个时间才到达server本来这已经是一个失效的报文,但是server端接收到这个请求报文后,还是会想client发出确认的报文,表示同意连接。

假如不采用三次握手,那么只要server发出确认,新的建立就连接了,但其实这个请求是失效的请求,client是不会理睬server的确认信息,也不会向服务端发送确认的请求但是server认为新的连接已经建立起来了,并一直等待client发来数据,这样,server的很多资源就没白白浪费掉了,采用三次握手就是为了防止这种情况的发生,server会因为收不到确认的报文,就知道client并没有建立连接。这就是三次握手的作用。

TCP四次挥手

mermaid
sequenceDiagram
    participant Active as 主动关闭方
    participant Passive as 被动关闭方

    %% 第一次挥手(FIN)
    rect rgb(245, 245, 245)
    note over Active,Passive: 第一次挥手(主动关闭)
    Active->>Passive: FIN=1 seq=u, ack=v (FIN_WAIT_1)
    note left of Active: 状态:FIN-WAIT-1<br>停止发送数据
    end

    %% 第二次挥手(ACK)
    rect rgb(230, 240, 250)
    note over Active,Passive: 第二次挥手(确认关闭)
    Passive->>Active: ACK=1 seq=v, ack=u+1 (CLOSE_WAIT)
    note right of Passive: 状态:CLOSE-WAIT<br>继续接收剩余数据
    note left of Active: 状态:FIN-WAIT-2
    end

    %% 第三次挥手(FIN)
    rect rgb(245, 245, 245)
    note over Active,Passive: 第三次挥手(被动关闭)
    Passive->>Active: FIN=1, ACK=1 seq=v, ack=u+1 (LAST_ACK)
    note right of Passive: 状态:LAST-ACK<br>等待最终确认
    end

    %% 第四次挥手(ACK)
    rect rgb(230, 240, 250)
    note over Active,Passive: 第四次挥手(最终确认)
    Active->>Passive: ACK=1 seq=u+1, ack=v+1 (TIME_WAIT)
    note left of Active: 状态:TIME-WAIT<br>等待 2MSL(60秒)
    note right of Passive: 状态:CLOSED
    end

第一次挥手 - FIN 请求

主动关闭方(如客户端)发送 FIN=1 标志的数据包:

  • 序列号为当前值 seq = u(基于之前传输的最后序列号)
  • 状态变为 FIN-WAIT-1(等待确认)
  • 示例数据包:FIN=1 seq=u, ack=v

第二次挥手 - ACK 确认

被动关闭方(如服务端)收到 FIN 后回复 ACK=1 标志的数据包:

  • 确认号设为 ack = u+1(表示已收到 FIN)
  • 状态变为 CLOSE-WAIT(等待关闭)
  • 示例数据包:ACK=1 seq=v, ack=u+1

第三次挥手 - FIN 响应

被动关闭方处理完剩余数据后,发送 FIN=1 标志的数据包:

  • 序列号为当前值 seq = v(基于之前传输的序列号)
  • 状态变为 LAST-ACK(最终确认等待)
  • 示例数据包:FIN=1, ACK=1 seq=v, ack=u+1

第四次挥手 - ACK 确认

主动关闭方收到 FIN 后回复 ACK=1 标志的数据包:

  • 确认号设为 ack = v+1(表示已收到 FIN)
  • 状态变为 TIME-WAIT(等待 2MSL 时间,默认 60 秒)
  • 示例数据包:ACK=1 seq=u+1, ack=v+1

UDP协议

特点

无连接,不可靠的单工协议,特点传输效率高。 对于传输效率有要求,对数据完整性无要求的应用

Linux MAC地址

以太网

以太网是一种局域网技术,主要用于设备间的数据传输。以太网通信,用的是mac地址,mac地址又叫物理地址,又叫网卡地址

以太网的应用‌

  • 现已广泛应用于家庭网络、企业网络以及互联网服务提供商的网络中。
  • 让我们能够轻松地上网冲浪、观看视频、传输文件等。

MAC地址

MAC地址(Media Access Control Address)是网络设备制造商在生产时分配给网络接口的唯一标识符,也称为物理地址或硬件地址。

NOTE

交换机有个mac地址表,mac地址表记录了源mac地址和对应接口标识。

定义与作用‌

MAC地址是用于在网络中唯一标识设备的物理地址。它由48位二进制数字组成,通常表示为12位十六进制数,分为6组,每组2个数字,中间用冒号或连字符分隔(例如:00:1A:C2:7B:00:47)。

MAC地址的前6位十六进制数代表网络硬件制造商的编号,后6位代表该设备在制造商生产的编号。这种结构确保了MAC地址的全球唯一性。

  • 48位二进制:00:1A:C2:7B:00:47(16进制表示)

  • OUI标识:前24位(00:1A:C2)表示制造商

  • 设备编号:后24位(7B:00:47)设备唯一码

    NOTE

    十进制:0-9 八进制: 0-7 16进制:由0-9和a-f 16个字符构成的记数方式

    单播:一对一通信

    广播:一对多通信

    组播:多对多通信

工作原理‌

在数据传输过程中,MAC地址用于在数据链路层标识设备。当一个数据报文发送时,会添加源和目的MAC地址。接收设备会先检查MAC地址,再根据IP地址决定是否接收或转发数据。

帧传输过程

mermaid
flowchart LR
    subgraph 发送端
    A[应用层数据] --> B[IP封装]
    B --> C[ARP解析目标MAC]
    C --> D[构建以太网帧]
    end
    
    subgraph 接收端
    D -->|物理传输| E[校验MAC地址]
    E -->|地址匹配| F[拆解数据帧]
    F --> G[上传网络层]
    end

Mac地址表动态学习

mermaid
sequenceDiagram
    participant 设备A
    participant 交换机
    participant 设备B

    设备A->>交换机: 发送数据帧<br>源MAC: 00:11:22:33:44:55<br>目的MAC:AA:BB:CC:DD:EE:FF
    Note right of 交换机: 学习阶段<br>记录IP地址、MAC与端口映射
    交换机->>交换机: 更新MAC地址表<br>Port1 ↔ 00:11:22:33:44:55
    
    设备B->>交换机: 发送响应帧<br>源MAC: AA:BB:CC:DD:EE:FF
    交换机->>交换机: 新增表项<br>Port2 ↔ AA:BB:CC:DD:EE:FF
  1. 初试状态下,交换机未转发数据,MAC地址表为空;
  2. 设备A向设备B发送数据,封装数据帧(封装TCP头部、IP头部、MAC头部);
  3. 交换机查询数据帧中的源MAC和目的MAC,先查询自己的MAC地址表,发现没有对应表项,会执行泛洪操作;
  4. 交换机将收到的数据帧的源MAC地址和对应接口记录到MAC地址表中;
  5. 广播网络中的所有主机均会收到该数据帧,但是只有设备B会处理。因为目的MAC地址是设备B;
  6. 交换机收到该单播数据帧后,会查看自己的MAC地址表,发现有对应的表项,则将数据从对应的端口转发出去;
  7. 同时,交换机将收到的数据帧的源MAC地址和对应接口记录到MAC地址表中;

NOTE

设备A和设备B数据通信,设备A产生数据,数据中封装TCP头部、IP头部、MAC头部。交换机属于2级设备,只能读取MAC头部信息。

地址表维护机制

  • 动态学习:自动记录首个数据帧源MAC
  • 老化时间:默认300秒无通信自动清除
  • 静态绑定:手动配置永久条目(防欺骗)
  • 容量限制:芯片级存储(8K-128K条目)

NOTE

  1. 由于交换机MAC地址条目是动态的,所以它不会永远存在MAC地址表中,而是在300s(老化时间)后会自动消失
  2. 但是如果在此期间,交换机又收到对应该条目MAC地址的数据帧,老化时间将重新开计时(重置300s)

Linux IPv4地址

IP地址的概念

IP地址是一个逻辑地址,是由网络号与主机号组成的32位二进制数。IP地址通常用“点分十进制”表示成(x.x.x.x)的形式,其中,x.x.x.x都是0~255之间的整数。

二进制11111111
指数2⁷2⁶2⁵2⁴
十进制1286432168421

例如:IP地址(111.153.27.48)

二进制数:01101111.10011001.00011011.00110000

mermaid
flowchart LR
    二进制格式["32位二进制数字<br>例: 11000000 10101000 00000001 00000001"] 
    --> 分段处理["按8位分段→4个字节"]
    --> 十进制转换["每段转为十进制(0-255)"]
    --> 最终格式["点分十进制格式<br>例: 192.168.1.1"]

IPv4地址分类

类别首字节范围地址范围默认子网掩码CIDR表示可用网络数每网络主机数
A1-1261.0.0.0-126.0.0.0255.0.0.0/812616,777,214
B128-191128.0.0.0-191.255.0.0255.255.0.0/1616,38465,534
C192-223192.0.0.0-223.255.255.0255.255.255.0/242,097,152254
D224-239224.0.0.0-239.255.255.255N/AN/AN/AN/A
E240-255240.0.0.0-255.255.255.255N/AN/AN/AN/A

每个类别的IP地址的网络部分和主机部分都有相应的规则

NOTE

其中A类取值范围1-127,127是保留地址不可用,范围变成1-126,127.0.0.1是设备本身。

mermaid
block-beta
  columns 4
  block:group0:5
    title["网络部分和主机部分"]
  end
  block:group1:5
    id0["A类"]
    id1["NETWORK"]
    id2["HOST"]
    id3["HOST"]
    id4["HOST"]
  end
  block:group2:5
    id5["B类"]
    id6["NETWORK"]
    id7["NETWORK"]
    id8["HOST"]
    id9["HOST"]
  end
  block:group3:5
    id10["C类"]
    id11["NETWORK"]
    id12["NETWORK"]
    id13["NETWORK"]
    id14["HOST"]
  end
  
  style title fill:#70db92,stroke:#70db92,stroke-width:2px
  
  style id0 fill:#f66,stroke:#f66
  style id5 fill:#f66,stroke:#f66
  style id10 fill:#f66,stroke:#f66
  
  style id1 fill:#ffeb3b,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
  style id6 fill:#ffeb3b,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
  style id7 fill:#ffeb3b,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
  style id11 fill:#ffeb3b,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
  style id13 fill:#ffeb3b,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
  style id12 fill:#ffeb3b,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
  
  style id2 fill:#bb7c68,stroke:#bb7c68,stroke-width:2px,color:#fff
  style id3 fill:#bb7c68,stroke:#bb7c68,stroke-width:2px,color:#fff
  style id4 fill:#bb7c68,stroke:#bb7c68,stroke-width:2px,color:#fff
  style id8 fill:#bb7c68,stroke:#bb7c68,stroke-width:2px,color:#fff
  style id9 fill:#bb7c68,stroke:#bb7c68,stroke-width:2px,color:#fff
  style id14 fill:#bb7c68,stroke:#bb7c68,stroke-width:2px,color:#fff

特殊地址类型

地址类型典型地址功能说明
环回地址127.0.0.0/8本地协议栈测试
链路本地地址169.254.0.0/16DHCP失效时自动配置
广播地址255.255.255.255受限广播(仅本网段)
测试网络地址192.0.2.0/24文档示例专用

特殊的IP地址包括:直接广播地址、受限广播地址、主机号与回送地址

直接广播地址

例如:115.255.255.255(主机位全为1)

  1. 直接广播地址是IP地址网络号不变,主机号全为1的地址。
  2. 用来使路由器将一个来自其它网络的分组以广播方式发送给特定网络上的所有主机。

受限广播地址

  1. 32位全为1 的IP地址(255.255.255.255)
  2. 此地址用来将一个分组以广播方式发送本网络中的所有主机,路由器会阻挡该分组通过。

主机号(网络上特定主机地址)

  1. 网络位全为0,主机位不变的地址。
  2. 主机号用于同一网络内部某个主机或某个路由器向另一个主机发送分组。

回送地址

A类IP地址中的127.0.0.0是一个保留地址,即回送地址。

用于网络软件测试和本地进程间通信使用。

私有地址特殊掩码

目前在Internet上只使用A,B,C这三类地址,而且为了满足企业用户在Internet上使用的需求,从A,B,C这三类地址中分别划出一部分地址供企业内部网络使用。这部分地址称为私有地址,私有地址是不能在Internet上使用的。私有地址包括以下三组。

  • A类私有地址:10.0.0.0/8(掩码255.0.0.0)
  • B类私有地址:172.16.0.0/12(掩码255.240.0.0)
  • C类私有地址:192.168.0.0/16(掩码255.255.0.0)

子网掩码

子网掩码是用来与目标地址做与运算的判断目标IP与自己是不是同网段。

子网掩码(Subnet Mask)是用于划分IP地址中网络标识主机标识的32位二进制数值,采用与IP地址相同的点分十进制格式表示。其核心特征是连续的1后接连续的0,其中:

  • 1的位:对应IP地址中的网络位(包含网络地址和子网地址)
  • 0的位:对应IP地址中的主机位

示例: 对于IP地址 192.168.1.100/24,子网掩码为 255.255.255.0,二进制表示为: 11111111.11111111.11111111.00000000

地址类别默认子网掩码CIDR表示二进制特征示例地址
A类255.0.0.0/8前8位1,后24位010.0.0.5/8
B类255.255.0.0/16前16位1,后16位0172.16.3.9/16
C类255.255.255.0/24前24位1,后8位0192.168.1.100/24
mermaid
flowchart TB
    subgraph 32位掩码结构
        direction LR
        A[网络位] --> B[主机位]
        A -->|A类:8位| A1["11111111"]
        A -->|B类:16位| A2["11111111 11111111"]
        A -->|C类:24位| A3["11111111 11111111 11111111"]
        B -->|A类:24位| B1["00000000 00000000 00000000"]
        B -->|B类:16位| B2["00000000 00000000"]
        B -->|C类:8位| B3["00000000"]
    end

二进制转十进制

01101111.10011001.00011011.00110000

= (2⁷+2⁶+2⁵+2⁴+2³+2²+2¹+2º).(2⁷+2⁶+2⁵+2⁴+2³+2²+2¹+2º).(2⁷+2⁶+2⁵+2⁴+2³+2²+2¹+2º).(2⁷+2⁶+2⁵+2⁴+2³+2²+2¹+2º)

= (0+64+32+0+8+4+2+1) . (128+0+0+16+8+0+0+1) . (0+0+0+16+8+0+2+1) . (0+0+32+16+0+0+0+0)

= 111.153.27.48

十进制转二进制

111.153.27.48

= (111-64-32-8-2-1) . (153-128-16-8-1) . (27-16-8-2-1) . (48-32-16)

= 47.25.11.16

= (64+32+8+4+2+1) . (128+16+8+1) . (16+8+2+1) . (48+16)

= (2⁶+2⁵+2³+2²+2¹+2º) . (2⁷+2⁴+2³+2º) . (2⁴+2³+2¹+2º) . (2⁵+2⁴)

= 01101111.10011001.00011011.00110000

Linux ARP协议

概述

地址解析协议ARP(Address Resolution Protocol)是用于实现从 IP 地址到 MAC 地址映射的链路层协议,工作于 OSI 模型的第二层。主要解决局域网内设备通信时的物理地址寻址问题。

ARP协议作用

将一个已知的IP地址解析成目标设备mac地址。

核心功能

  1. ARP广播地址

    FF:FF:FF:FF:FF:FF

  2. 地址解析

    IP地址 ➔ MAC地址的动态映射

  3. 缓存维护

    维护 ARP 缓存表(arp -n 可查看)

  4. 地址冲突检测

    通过免费 ARP(Gratuitous ARP)检测 IP 冲突

  5. 协议透明化 对上层协议隐藏物理网络细节

ARP 缓存表

存储的是目的IP和对应目的mac地址的映射关系。

ARP 协议工作流程

设备进行通信前会查询本地的arp 缓存表是否记录目标设备mac址,如果本地没有,会对局域网内的设备发送要给arp广播,arp收到单播回复后转发arp响应,然后更新本地ARP缓存。

mermaid
sequenceDiagram
    participant HostA as Host A
    participant Switch as 网络交换机
    participant HostB as Host B

    Note over HostA: 需要与 192.168.1.3 通信
    HostA->>HostA: 检查本地 ARP 缓存
    alt 缓存存在
        HostA-->>HostB: 直接发送数据帧
    else 缓存不存在
        HostA->>Switch: ARP Request 广播
        Note right of HostA: 目标MAC: FF:FF:FF:FF:FF:FF<br/>目标IP: 192.168.1.3
        Switch->>HostB: 转发 ARP 请求
        HostB->>HostB: 验证目标IP是否匹配
        HostB->>Switch: ARP Reply 单播
        Note right of HostB: 包含本机MAC地址
        Switch->>HostA: 转发 ARP 响应
        HostA->>HostA: 更新ARP缓存
    end
    HostA->>HostB: 正式通信开始
  1. 初始化检查
    • 当 Host A 需要与 192.168.1.3 通信时
    • Host A 在发送数据前先查询本地 ARP 缓存表
  2. 广播请求阶段
    • 目标 MAC 为 FF:FF:FF:FF:FF:FF
  3. 单播响应阶段
    • Host B 收到广播后
    • 验证目标IP是否匹配
  4. 缓存更新机制
    • 将映射关系存入 ARP 缓存
    • 默认缓存有效期 1200 秒

路由

路由器工作在OSI参考模型的网络层,它的重要作用是用于在不同网络间选择最佳路径传输数据包

路由类型

类型配置方式更新机制适用场景典型协议/命令
静态路由手动配置永不自动更新小型网络/固定路径ip route add
默认路由特殊静态路由同静态路由边界网络出口0.0.0.0/0
动态路由自动学习协议定期更新大型复杂网络OSPF/BGP/RIP

NOTE

  • 静态路由:由网络工程师手动配置的路由规则

  • 默认路由:当所有静态路由规则不满足条件时做出的路由选择(特殊静态路由)

路由表

记录在路由器里,记录的是路由规则。存储目标网络与下一跳的映射关系

字段说明示例值
目标网络数据包要到达的IP网络地址192.168.1.0/24
子网掩码定义目标网络的范围(CIDR表示法)255.255.255.0
网关/下一跳数据包转发的下一节点IP地址192.168.1.1
接口本地发送数据包的网络接口eth0/ens33
Metric(度量值)路由优先级(值越小优先级越高)100
协议类型路由来源标识(直连/静态/动态协议)kernel/static/ospf

路由表工作流程

mermaid
graph TD
    A[数据包到达网络层] --> B{目标IP是否直连网络?}
    B -->|是| C[通过ARP获取目标MAC地址]
    B -->|否| D[查询路由表]
    D --> E{匹配到路由条目?}
    E -->|是| F[选择最长前缀匹配条目]
    E -->|否| G[使用默认路由]
    F --> H{存在网关?}
    H -->|是| I[转发到网关IP]
    H -->|否| J[直连发送]
    G --> K[转发到默认网关]
    I/J/K --> L[更新TTL值]
    L --> M{TTL > 0?}
    M -->|是| N[封装帧头并发送]
    M -->|否| O[丢弃包并发送ICMP超时]
  1. 目标网络判定 首先检查目标IP是否属于本地接口直连网络(通过子网掩码计算)。如果是直连网络,直接通过ARP获取目标MAC地址发送。
  2. 路由表查询 对非直连网络流量,按优先级匹配路由条目:
    • 最长前缀原则:优先匹配子网掩码最长的条目(如/24优先于/16)
    • 协议优先级:直连路由 > 静态路由 > 动态路由
    • Metric值:相同前缀时选择Metric值更小的路径
  3. 转发决策
    • 直连发送:无网关条目直接通过本地接口发送
    • 网关转发:将数据包发往指定下一跳IP
    • 默认路由:未匹配任何条目时使用0.0.0.0/0路由
  4. 数据包处理
    • TTL更新:每经过一个路由节点TTL减1,为0时丢弃并发送ICMP超时报文(Type 11)
    • 帧头封装:根据下一跳IP查询ARP缓存获取MAC地址,重组数据帧
  5. 异常处理
    • 无可用路由时返回Network unreachable错误
    • 网关不可达时触发ICMP重定向(Type 5)

网络通信小结

mermaid
graph TD
    N0[N0]
    SW0[SW0]
    R0[R0]
    R1[R1]
    SW1[SW1]
    N3[N3]
    
    N0 -->|N0接口: 1<br>SW0接口:1| SW0
    SW0 -->|SW0接口:3<br>R0接口:f0/0| R0
    R0 -->|R0接口: f0/1<br>R1接口: f0/1>| R1
    R1 -->|R1接口: f0/0<br>SW1接口:1| SW1
    SW1 -->|SW1接口: 3<br>N3接口:1| N3
   
    R0 -->|源MAC:R0的f0/1<br>目标MAC:R1的f0/1| R1
  
    N0 -->|ARP请求| SW0
    SW0 -->|ARP广播| R0
    R0 -->|ARP回应| SW0
    SW0 -->|ARP缓存更新| N0
    N0 -->|数据帧| SW0
    SW0 -->|数据帧| R0
    R0 -->|IP转发| R1
    R1 -->|数据帧| SW1
    SW1 -->|数据帧| N3

N0与N1通信

  1. 网段判断:首先N0会通过IP地址与子网掩码计算网络ID,判断出和N1是同一网段,属于局域网通信。
  2. ARP请求:N0会查看本地的arp缓存表,查看本地是否有目标IP和它对应的mac地址。如有直接封装MAC头部,如没有N0发送ARP协议广播,N0将ARP请求帧发送给直连的交换机SW0。
  3. 交换机MAC地址学习:当SW0收到N0发送的ARP请求帧时,会提取源MAC地址(N0),并将其与接收端口(端口1)关联,写入MAC地址表,由于目标MAC地址为广播地址,SW0将帧广播到所有其他端口。
  4. N1的ARP响应:N1检查ARP请求中的目标IP地址,确认与自身IP匹配后,生成ARP响应报文,N1将ARP响应帧通过SW0的端口2发送给N0,
  5. 交换机SW0的二次MAC学习:SW0收到N1的响应帧后,提取源MAC地址(N1),并将其与端口2关联,更新MAC地址表。此时SW0的MAC地址表已包含N0(端口1)和N1(端口2)的映射关系。后续N0与N1的通信将直接通过端口1和端口2转发,无需广播
  6. 数据通信流程
    1. N0发送数据帧:封装目标MAC地址(N1)、源MAC地址(N0)及IP数据包。
    2. 交换机查表转发:SW0根据目标MAC地址(N1)查询MAC表,找到对应端口2,直接转发数据
    3. N1接收数据:N1验证目标MAC地址与自身一致后,处理数据包。

N0和N3的通信

  1. 网段判断:首先N0会通过IP地址与子网掩码计算网络ID,判断出和N3不是同一网段,属于跨区通信。N0将数据包发送至默认网关(即R0的f0/0接口IP)
  2. ARP请求:N0会查看本地的arp缓存表,查看本地是否有目标IP和它对应的mac地址。如有直接封装MAC头部,如没有N0发送ARP协议广播,N0将ARP请求帧发送给直连的交换机SW0
  3. 交换机MAC地址学习:当SW0收到N0发送的ARP请求帧时,会提取源MAC地址(N0),并将其与接收端口(端口1)关联,写入MAC地址表,由于目标MAC地址为广播地址,SW0将帧广播到所有其他端口。
  4. 路由器R0响应ARP请求:R0的f0/0接口收到ARP请求后,生成单播ARP响应,SW0记录R0的f0/0接口MAC与上行端口的映射
  5. SW0处理数据帧:源MAC地址为SW0的MAC地址,目标MAC地址为R0的F0/0接口的MAC地址,数据帧通过SW0的端口发送到R0
  6. 路由器R0的路由与转发:R0根据目标IP查询路由表,确定下一跳为R1的f0/1接口,数据封装目标MAC是R1的f0/1接口MAC,源MAC是R0的f0/1接口MAC,IP层不变,R0通过f0/1接口将数据包发送至R1
  7. 路由器R1向目标子网转发:R1确认目标IP属于其直连子网,若R1的ARP缓存中无N3的MAC地址,则向SW1广播ARP请求,记录R1的f0/0接口MAC与SW1端口映射,转发ARP请求至N3所在的端口
  8. N3响应数据包:N3返回单播ARP响应,告知其MAC地址,目标MAC是R1的f0/0接口MAC,目标IP是N0的IP地址,数据包经R1→R0→SW0→N0,完成双向通信