Linux 网络(5)

1.网络层

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

1. 4 位版本号
  • 作用:指定 IP 协议版本
  • IPv4 固定为 4,IPv6 为 6
2. 4 位头部长度
  • 作用:表示 IP 头部包含多少个 32bit(4 字节)的 "字"
  • 计算:头部字节数 = 该字段值 × 4
  • 范围:字段值 5~15 → 头部长度 20~60 字节
    • 无选项时:字段值 = 5 → 20 字节(固定头部)
    • 最大头部:字段值 = 15 → 60 字节
3. 8 位服务类型
  • 作用:指示传输优先级(现在多被 DSCP 替代)
  • 4 位可选目标(互斥,只能选一个):
    • 最小延时:适合 ssh/telnet
    • 最大吞吐量:适合 ftp
    • 最高可靠性:适合关键数据
    • 最小成本:适合普通数据
4. 16 位总长度
  • 作用:表示整个 IP 数据报(头部 + 数据)的总字节数
  • 最大:65535 字节
5. 16 位标识
  • 作用:唯一标识一个原始 IP 报文
  • 分片时:同一个原始报文的所有分片,ID 完全相同,用于接收端重组
6. 3 位标志字段
  • 第 1 位:保留,必须为 0
  • 第 2 位(DF,Don't Fragment):
    • 1:禁止分片,报文超过 MTU 直接丢弃
    • 0:允许分片
  • 第 3 位(MF,More Fragments):
    • 1:还有后续分片
    • 0:这是最后一个分片
7. 13 位分片偏移
  • 作用:表示当前分片在原始报文中的位置
  • 计算:实际偏移字节数 = 该字段值 × 8
  • 约束:除最后一个分片外,其他分片长度必须是 8 的倍数,保证报文连续
8. 8 位 TTL(生存时间)
  • 作用:限制报文在网络中的最大跳数,防止路由循环
  • 规则:初始值一般 64,每经过一个路由器 TTL -= 1,减到 0 则丢弃
9. 8 位协议(Protocol)
  • 作用:标识上层协议类型
  • 常见值:
    • TCP:6
    • UDP:17
    • ICMP:1
10. 16 位头部校验和
  • 作用:仅校验 IP 头部是否损坏,不校验数据部分
  • 原理:通过 CRC 类算法计算,接收端重新校验,不一致则丢弃
11. 32 位源地址 / 目标地址
  • 作用:标识发送端和接收端的 IP 地址
12. 选项字段
  • 长度:0~40 字节,用于扩展功能(如时间戳、安全选项)
  • 特点:一般很少使用,常规通信可忽略

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

  • 同一网段内:网络标识相同,主机标识不同 → 可以直接通信,不需要经过路由器。
  • 不同网段间 :网络标识不同 → 必须通过路由器转发才能通信,路由器的作用就是连接不同网段,实现跨网段数据转发。
    那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.
    有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
    一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.
    过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示(该图出 自[TCPIP]

早期 IPv4 按 A/B/C 类固定划分网络号和主机号,存在严重问题:

  • 地址浪费:B 类地址理论上可容纳 6 万 + 主机,A 类更多,但实际子网很少需要这么多主机,大量地址闲置。
  • 分配失衡:B 类地址很快耗尽,A 类却大量浪费

为解决地址浪费,提出 CIDR,核心是灵活划分网络号与主机号

  1. 子网掩码 :32 位正整数,用一串 0 结尾,用于区分网络位和主机位。
  2. 按位与运算 :将 IP 地址与子网掩码逐位做 "与" 运算,结果即为网络号
  3. 无类别限制:网络号 / 主机号的划分不再受 A/B/C 类约束,可按需调整子网大小。

|-------|---------------------------------|---------------|
| IP 地址 | 140.252.20.68 | 8C FC 14 44 |
| 子网掩码 | 255.255.255.0 | FF FF FF 00 |
| 网络号 | 140.252.20.0 | 8C FC 14 00 |
| 子网范围 | 140.252.20.0 ~ 140.252.20.255 | --- |

计算过程

  • 子网掩码 255.255.255.0 表示前 24 位为网络位,后 8 位为主机位。
  • 按位与:IP 地址后 8 位(68)与掩码后 8 位(0)运算,结果为 0,因此网络号为 140.252.20.0
  • 子网范围:主机位(后 8 位)从全 0 到全 1,即 0 ~ 255,对应地址范围 140.252.20.0 ~ 140.252.20.255
项目 十进制表示 十六进制表示
IP 地址 140.252.20.68 8C FC 14 44
子网掩码 255.255.255.240 FF FF FF F0
网络号 140.252.20.64 8C FC 14 40
子网范围 140.252.20.64 ~ 140.252.20.79 ---

计算过程

  • 子网掩码 255.255.255.240(二进制 11110000)表示前 28 位为网络位,后 4 位为主机位。
  • 按位与:IP 最后一字节 68(二进制 01000100)与掩码最后一字节 24011110000)运算,结果为 01000000(即 64),因此网络号为 140.252.20.64
  • 子网范围:主机位(后 4 位)从全 00)到全 115),即 64 + 0 = 6464 + 15 = 79,对应地址范围 140.252.20.64 ~ 140.252.20.79

子网掩码的二进制表示中,从右往左数,连续有多少个 0,就有多少位是主机位,这些位就是参与 "网络号计算" 和 "子网范围划分" 的部分。

  1. 子网掩码 255.255.255.0

    • 最后一字节二进制:00000000
    • 从右往左连续 0 的个数:8 位
    • 所以:后 8 位是主机位,计算网络号时这 8 位会被置为 0,子网范围就是这 8 位从全 0(0)到全 1(255)。
  2. 子网掩码 255.255.255.240

    • 最后一字节二进制:11110000
    • 从右往左连续 0 的个数:4 位
    • 所以:后 4 位是主机位,计算网络号时这 4 位会被置为 0,子网范围就是这 4 位从全 0(0)到全 1(15)。
  3. 基础上限

IPv4 是4 字节(32 位) 的正整数,总地址数为 232,约 43 亿个,TCP/IP 协议要求每个主机(实际按网卡)需配置 IP。

  1. 实际可用远不足 43 亿的关键原因
  • 存在特殊预留 IP 地址(不可用于普通主机);

  • 分配粒度:按网卡配置(一个主机可多网卡,一个网卡可配多 IP),并非按主机台数分配。

  1. CIDR 的局限性

CIDR 仅能提升地址利用率、减少浪费不会增加 IPv4 地址的绝对上限,仍无法解决地址短缺问题。

  1. 三大核心解决方式(细节完整)

  2. 动态分配 IP:仅为接入网络的设备分配 IP,同一设备(同一 MAC)每次接入互联网,获取的 IP 可能不同;

  3. NAT 技术:核心解决方案,后续重点讲解;

  4. IPv6 :用16 字节(128 位) 表示地址,与 IPv4互不兼容、非简单升级,目前尚未普及。

13.私有 IP与公网 IP
  1. 私有 IP 地址

    • 定义:仅用于局域网内部通信,不直接接入互联网;RFC 1918 规定了专用的私有 IP 地址段,用于组建局域网。

    • 三个标准私有网段(含地址数量):

      • 10.*:前 8 位为网络号,共 16,777,216 个地址;

      • 172.16.0.0 ~ 172.31.255.255:前 12 位为网络号,共 1,048,576 个地址;

      • 192.168.*:前 16 位为网络号,共 65,536 个地址。

  2. 公网 IP 地址

    • 定义:除上述私有 IP 段外的所有 IP 地址,用于互联网全局通信,可直接被外网访问。

二、路由器的 IP 配置与子网规则(细节完整)

  1. 双 IP 配置:一个路由器可配置两个 IP 地址

    • WAN 口 IP:连接上级网络(或公网)的 IP,可能是公网 IP 或上级子网 IP;

    • LAN 口 IP:作为当前子网的网关 IP,通常为私有 IP(如常见的192.168.1.1)。

  2. 子网归属:路由器 LAN 口连接的所有主机,都属于该路由器的子网。

  3. IP 复用规则

    • 同一子网内:私有 IP 地址不能重复(避免冲突);

    • 不同子网间:私有 IP 地址可以重复 (如多个家用路由器的 LAN 口都可使用192.168.1.1)。

  4. 层级结构 :家用路由器是运营商路由器子网的一个节点,运营商路由器可有多级,最外层运营商路由器的 WAN 口 IP 即为公网 IP


三、NAT(网络地址转换)核心机制

  1. 触发场景:子网内的主机需要与外网(互联网)通信时。

  2. 操作过程 :路由器将数据包 IP 首部中的私有 IP 地址替换为自身 WAN 口 IP,并逐级向上替换,最终数据包以公网 IP 的身份在互联网中传输。

  3. 核心作用:让多个私有 IP 主机共享少量公网 IP 访问外网,大幅缓解 IPv4 地址短缺问题。


四、公网访问服务的要求

如果希望自己实现的服务器程序能够在公网上被访问,必须将程序部署在具有公网 IP的服务器上(如阿里云、腾讯云等云服务器)。

私有 IP 访问公网的 "一去一回",核心是靠 NAT(网络地址转换,实际多用 NAPT 端口转换) 完成 "身份转换" 和 "身份还原":

去程:私有 IP "变身" 公网 IP

  • 发起请求 :内网主机(如 192.168.1.100:12345)向公网服务器(如 223.5.5.5)发送请求,数据包先到网关路由器。
  • NAT 转换 :路由器将数据包的源 IP 从私有 IP(192.168.1.100)替换为自身 WAN 口公网 IP(如 122.77.241.3),同时将源端口替换为临时端口(如 54321),并在本地维护一张 NAT 映射表
  • 公网传输:转换后的数据包以公网 IP 身份在互联网中传输,顺利到达目标服务器。

回程:公网 IP "还原" 私有 IP

  1. 响应返回 :公网服务器处理完请求后,响应包的目标 IP 是路由器的公网 IP(122.77.241.3),目标端口是 NAT 转换时分配的临时端口(54321),因此包会先路由到路由器。
  2. 查表还原 :路由器收到响应包后,查询 NAT 映射表,发现端口 54321 对应内网主机 192.168.1.100:12345,于是将响应包的目标 IP 和端口换回私有 IP 和原端口。
  3. 内网转发:路由器将还原后的数据包转发到对应的内网主机,完成通信
  • 去程:靠 NAT 把私有 IP "翻译" 成公网 IP,让数据包能在公网路由。
  • 回程:靠 NAT 映射表把公网 IP "翻译" 回私有 IP,让响应包精准回到内网主机。
  • NAPT 关键:同时转换 IP 和端口,让多个私有 IP 主机共享同一个公网 IP 访问公网,路由器靠端口号区分不同连接。

LAN IP(局域网 IP)的作用

LAN IP 是路由器在内网侧 的 IP 地址(通常是私有 IP,如 192.168.1.1),它的核心作用是:

  1. 作为内网主机的默认网关

    • 内网主机(如 192.168.1.100)要访问公网时,会先将数据包发送到 LAN IP,因为它是内网与外网通信的 "出口"。

    • 回程时,路由器从公网收到响应包后,会通过 LAN IP 将数据包转发到对应的内网主机。

  2. 标识子网归属

    • 所有连接到路由器 LAN 口的主机,都属于以 LAN IP 为网关的子网,内网通信直接通过 LAN IP 所在的子网完成。

WAN IP(广域网 IP)的作用

WAN IP 是路由器在公网侧 的 IP 地址(通常是公网 IP 或上级子网 IP,如 122.77.241.3),它的核心作用是:

  1. 作为 NAT 转换后的 "公网身份"

    • 去程时,路由器将内网数据包的源 IP(私有 IP)替换为 WAN IP,让数据包能在公网中被路由和识别(公网只认 WAN IP)。

    • 回程时,公网服务器的响应包会以 WAN IP 为目标地址,确保数据包能准确路由到路由器。

  2. 在公网中唯一标识路由器

    • WAN IP 是路由器在公网中的 "身份证",公网中的其他设备通过这个 IP 与路由器通信,再由路由器转发到内网主机。

|---------------|----------------------|-----------------------|
| 步骤 | LAN IP 的作用 | WAN IP 的作用 |
| 去程(内网→公网) | 接收内网主机的数据包,作为内网通信的网关 | 替换源 IP,作为数据包在公网中的身份标识 |
| 回程(公网→内网) | 作为转发入口,将响应包送到内网主机 | 作为响应包的目标地址,确保包能回到路由器 |

你可以把路由器当成:

  • 在家里的大门(LAN)

  • 在外面互联网的对外地址(WAN)


一、LAN IP 是啥?

就是路由器在家里局域网的门牌号 比如:192.168.1.1

作用只有一个:管家里 → 所有内网设备(手机、电脑)要上网,都先找这个 LAN IP 出门。


二、WAN IP 是啥?

就是路由器在互联网上的真实门牌号外面只认这个,不认你家里的私有 IP。


三、在「一去一回」里到底干啥?

1)去的时候(内网 → 公网)

  • 你的手机 / 电脑:先把包交给 LAN IP(交给家里大门)

  • 路由器拿到包:把发件人改成 WAN IP

  • 这样包才能在外面正常跑

一句话: LAN IP 负责收家里的包;WAN IP 负责让包能出去见人。


2)回来的时候(公网 → 内网)

  • 外面服务器回包:只发给 WAN IP(只认识你家对外地址)

  • 路由器收到:查一下表里对应哪个内网设备

  • 再通过 LAN IP 把包送到你手机 / 电脑

一句话: WAN IP 负责把包领回家;LAN IP 负责把包送到你手里

  • 去的时候 数据包:先找 LAN IP 出门 → 路由器换成 WAN IP 去公网顺序:内网 IP → LAN IP → WAN IP → 公网

  • 回来的时候 数据包:先找 WAN IP 回家 → 路由器换回内网 IP,通过 LAN IP 发给你顺序:公网 → WAN IP → LAN IP → 内网 IP

LAN/WAN 是路,映射表是「家里谁发的请求」的花名册。没有映射表,包能回到你家,但不知道给你手机、还是你电脑、还是你电视。

我给你举个例子

你家:

  • 大门 = LAN IP

  • 对外地址 = WAN IP

  • 家里有 3 个人:你手机、你电脑、你平板

去的时候(发请求)

  • 你手机:我要上网 → 走大门(LAN)

  • 你电脑:我也要上网 → 走大门(LAN)

  • 你平板:我也要 → 走大门(LAN)

路由器统一换成 WAN IP 发出去。

问题来了:

外面服务器回包时,只知道发到你家 WAN IP家里 3 台设备,包该给谁?


映射表就是干这个的

路由器在「去的时候」,偷偷记了一张表:

  • 手机:12345 → 公网端口:54321

  • 电脑:67890 → 公网端口:54322

  • 平板:11111 → 公网端口:54323

这张表,就叫 NAT 映射表

回来的时候:

  • 包到 WAN → 看一眼目标端口是 54321

  • 查映射表 → 哦!是手机

  • 再通过 LAN 发给手机

14.路由

一、路由的核心概念:Hop by Hop(一跳一跳)

  1. 路由本质 :在复杂网络中,找到一条通往终点的路径,过程是一跳一跳地 "问路"。

  2. "一跳" 的定义:数据链路层中的一个区间,在以太网中,指从源 MAC 地址到目的 MAC 地址之间的帧传输区间。

  3. 两层分工

    • 数据链路层:实现 ** 某一跳(区间)** 内的通信。

    • IP 层:实现直至最终目标地址的端到端(点到点)通信。


二、IP 数据包的传输流程

  1. 当 IP 数据包到达路由器时,路由器先查看目的 IP 地址

  2. 路由器判断:数据包是可以直接发送给目标主机 ,还是需要转发给下一个路由器

  3. 重复上述步骤,直到数据包到达目标 IP 地址。

  4. 转发依据 :每个节点(主机 / 路由器)内部维护一张路由表,用来决定数据包的下一跳去向。


三、路由表的作用与结构

  1. 路由表的作用

像 "问路指南",记录了 "到某个网络该走哪条路、下一跳是谁"。

  1. 路由表字段详解(以示例表为例)
字段 含义
Destination 目的网络地址(要去的网络)
Gateway 下一跳地址(下一个要交给的设备 IP)
Genmask 子网掩码(用于判断目的 IP 所属网络)
Flags 标志位:- U:此条目有效(Up)- G:下一跳是路由器(Gateway),无 G 表示直连网络
Metric 路由度量值(优先级,值越小越优先)
Iface 发送接口(数据包从本机哪个网口发出去)

示例路由表解读:

  • 192.168.10.0192.168.56.0 是直连网络(无 G 标志),分别通过 eth0eth1 接口直接通信。
  • default 是缺省路由(有 G 标志),所有不匹配其他条目的数据包,都交给网关 192.168.10.1,从 eth0 发出。

例子 1:目的地址 192.168.56.3

  1. 与第一行子网掩码 255.255.255.0 做 "按位与" 运算:192.168.56.3 & 255.255.255.0 = 192.168.56.0,与第一行目的网络 192.168.10.0 不匹配。
  2. 与第二行子网掩码 255.255.255.0 做 "按位与" 运算:192.168.56.3 & 255.255.255.0 = 192.168.56.0,与第二行目的网络 192.168.56.0 匹配。
  3. 转发决策:该网络是与 eth1 直连的网络,因此直接从 eth1 接口发送,无需经过路由器转发。

例子 2:目的地址 202.10.1.2

  1. 依次与路由表前几项(192.168.10.0192.168.56.0127.0.0.0)对比,均不匹配。
  2. 匹配缺省路由 default,从 eth0 接口发出,交给下一跳路由器 192.168.10.1
  3. 后续由 192.168.10.1 路由器根据自身路由表,继续决定下一跳地址。
  • 直连网络 :路由表中无 G 标志的条目,数据包可直接从对应接口发送,无需路由器转发。
  • 缺省路由:路由表最后一行,当目的地址与其他条目都不匹配时,按缺省路由转发。
  • 路由表查看 :可使用 route 命令查看本机路由表。

一句话总结:路由表是网络中的 "导航地图",通过 "按位与" 判断目的网络所属条目,直连网络直接发,非直连找下一跳,找不到就走缺省路由。

相关推荐
S-码农2 小时前
Linux——线程
linux
刘孬孬沉迷学习2 小时前
路由算法学习( Dijkstra 算法 Bellman-Ford方程算法)
网络·学习·智能路由器·信息与通信·dijkstra算法·路由算法·bellman-ford算法
i建模2 小时前
通过Hyprland事件查看器(如`wev`)修改物理按键的扫描码
linux·运维
2501_918126912 小时前
stm32能做次声波发射器吗?
linux·stm32·嵌入式硬件·学习·个人开发
_OP_CHEN2 小时前
【Linux系统编程】(三十八)进程信号拓展:可重入函数 /volatile/SIGCHLD 全解析
linux·运维·进程·c/c++·信号·可重入函数·volatile
2501_918126912 小时前
stm32能做哪些程序?
linux·stm32·单片机·嵌入式硬件·个人开发
楼田莉子2 小时前
CMake学习:CMake在二进制工程场景上应用
linux·c++·vscode·学习·软件构建
『往事』&白驹过隙;2 小时前
瑞芯微(RK平台)调试指令常用整理
linux·arm开发·驱动开发
papaofdoudou2 小时前
Linux内核任务调度时机总结
linux·运维·网络