Linux 学习笔记(五十):网络层——IP 协议、子网划分与 NAT 魔法

📌 核心结论(TL;DR):

  1. IP 核心字段 :TTL 防止路由环路,标识/标志/片偏移 用于大包分片。

  2. CIDR 划分 :IP / 掩码,掩码为 1 的是网络号,为 0 的是主机号。

  3. 私有 IP :10.x、172.16.x~172.31.x、192.168.x 用于局域网,不能直接上公网。

  4. NAT 技术:路由器通过替换私有 IP 和端口为公网 IP,实现多设备共享上网,拯救了 IPv4。

  5. 路由表 :通过 ip route 查看,default 指向默认网关,负责跨网段转发。

一、 IP 协议头部

IP 报文头部最少 20 字节,最关键的有:

  1. 8 位协议:表示上层是 TCP(6) 还是 UDP(17)。

  2. 8 位 TTL(生存时间):每过一个路由器减 1,减为 0 则丢弃。防止数据包在网络中死循环。

  3. 分片字段 :因为以太网 MTU(最大传输单元)通常为 1500 字节,如果 IP 包过大,必须依靠 16位标识、3位标志 和 13位片偏移 进行分片和重组。

二、 CIDR 与子网掩码

过去把 IP 分为 A/B/C 类太浪费,现在全部使用 CIDR(无类别域间路由)。

  • 比如 192.168.1.10/24:

    • /24 代表子网掩码前 24 位全为 1(即 255.255.255.0)。

    • 将 IP 和掩码按位与,得到网络号 192.168.1.0。

    • 剩下 8 位是主机号,可以分配 28−2=25428−2=254 台主机。

    • 全 0 是网络地址,全 1 是广播地址,不能分配给主机。

三、 公网 IP、私有 IP 与 NAT

IPv4 只有 43 亿个地址,根本不够用。

  • 私有 IP :10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。只能在局域网内通信。

  • NAT(网络地址转换) :你的电脑是私有 IP,家庭路由器拥有公网 IP。你上网时,路由器把你的私有 IP 和端口替换成公网 IP 和随机端口,并在本地记录映射表。回包时再反向替换回去。NAT 让几十亿台设备共享了极少的公网 IP。

四、 实战:网络排查命令

  1. ip addr:查看网卡、IP、MAC 地址。云服务器通常只显示内网 IP。

  2. ip route:查看路由表。重点是 default via xxx,这是数据包出局域网必经的默认网关。

  3. ping -c 4 baidu.com:查看 TTL,大致推算经过了多少个路由器。

  4. traceroute baidu.com:追踪数据包的每一跳路由。

自我实战操作

网络层的配置不需要写 C 代码,而是熟练使用 Linux 的网络排查命令。

bash 复制代码
cd ~/linux_study/network_test
实战 1:查看你的网卡与 CIDR
bash 复制代码
# 查看网卡配置 (看 inet 后面的 IP 和 netmask)
ip addr
# 或者用老命令
ifconfig

👉 现象 :在你的云服务器上,你大概率会看到一个 eth0 网卡,IP 可能是 10.x.x.x 或者 172.x.x.x(这说明你的云服务器用的是私有 IP,并通过阿里云/腾讯云的 NAT 转发访问外网)。

实战 2:查看路由表与网关
bash 复制代码
ip route
# 或者用老命令
route -n

👉 现象 :你会看到一行 default via 10.0.0.1 dev eth0。这代表默认路由 。当你访问百度(不在你的局域网网段时),数据包会默认扔给 10.0.0.1 这个网关(也就是路由器),由它替你转交。

实战 3:验证 TTL 与路由追踪
bash 复制代码
# 使用 ping 查看目的主机的 TTL
ping -c 4 baidu.com

# 使用 traceroute 查看数据包经过了多少个路由器
# 需要先安装:sudo apt install traceroute -y
traceroute baidu.com

👉 现象:

  • ping 的结果里有一项 ttl=52。这是因为百度服务器的 Linux 默认 TTL 是 64,中间经过了 12 个路由器(64 - 12 = 52)。

  • traceroute 会打印出 1 跳、2 跳、3 跳... 的 IP 地址。这就是 IP 协议"一问一答"找路的过程。

现象 :执行 apt install 安装软件时,终端突然变成了紫红色背景,提示 Daemons using outdated libraries(使用过时库的守护进程),列出了一大堆服务。

原因 :Ubuntu 的安全机制。在更新了系统核心动态库后,为了让正在后台运行的服务(如 dbus、ssh 等)立刻应用新版本的安全补丁,系统会弹窗询问是否重启它们。

解决 :千万不要按 Ctrl+C 强制退出! 保持默认的 <Ok> 选项,直接敲击回车键 。系统会自动重启服务并完成后续的安装流程。如果强行中断,很可能会导致 apt 锁死,后续安装报错。

实战 4:体验 NAT(内网穿透的前提)

如果你是云服务器,在云控制台看看你的公网 IP ,然后再看 ip addr 里的内网 IP 。你会发现它们完全不一样。这就证明了云厂商在机房出口做了一层巨大的 NAT 网关。这也是为什么我们在写服务器代码 bind 的时候,必须写 INADDR_ANY,而不能写死公网 IP。

相关推荐
叼烟扛炮13 分钟前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
AR-26710-30 分钟前
Linux Day32——实操五类资源告急排查
linux·运维
StarsGreen1 小时前
libva中的图像格式说明
linux
H.莓飛2 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla2 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
叼烟扛炮2 小时前
[LangChain] 学习笔记(03):打破失忆症——对话机制与上下文管理
java·前端·javascript·笔记·学习·langchain
景煜拾年3 小时前
InnoAI SQL 助手
运维·数据库·笔记·sql
旖旎夜光3 小时前
【C++ 基础入门】类和对象(下):初始化列表、static 成员、友元与内部类
c++·笔记·学习
无人生还别怕3 小时前
如何搭建docker仓库(轻量级)registry
linux·运维·docker·云原生·容器·registry·openanolisos