📌 核心结论(TL;DR):
IP 核心字段:
TTL防止路由环路,标识/标志/片偏移用于大包分片。CIDR 划分:
IP / 掩码,掩码为 1 的是网络号,为 0 的是主机号。私有 IP:
10.x、172.16.x~172.31.x、192.168.x用于局域网,不能直接上公网。NAT 技术:路由器通过替换私有 IP 和端口为公网 IP,实现多设备共享上网,拯救了 IPv4。
路由表:通过
ip route查看,default指向默认网关,负责跨网段转发。
一、 IP 协议头部
IP 报文头部最少 20 字节,最关键的有:
8 位协议:表示上层是 TCP(6) 还是 UDP(17)。
8 位 TTL(生存时间):每过一个路由器减 1,减为 0 则丢弃。防止数据包在网络中死循环。
分片字段:因为以太网 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。
四、 实战:网络排查命令
ip addr:查看网卡、IP、MAC 地址。云服务器通常只显示内网 IP。ip route:查看路由表。重点是default via xxx,这是数据包出局域网必经的默认网关。ping -c 4 baidu.com:查看 TTL,大致推算经过了多少个路由器。traceroute baidu.com:追踪数据包的每一跳路由。
自我实战操作
网络层的配置不需要写 C 代码,而是熟练使用 Linux 的网络排查命令。
cd ~/linux_study/network_test实战 1:查看你的网卡与 CIDR
# 查看网卡配置 (看 inet 后面的 IP 和 netmask) ip addr # 或者用老命令 ifconfig👉现象:在你的云服务器上,你大概率会看到一个eth0网卡,IP 可能是10.x.x.x或者172.x.x.x(这说明你的云服务器用的是私有 IP,并通过阿里云/腾讯云的 NAT 转发访问外网)。
实战 2:查看路由表与网关
ip route # 或者用老命令 route -n👉现象:你会看到一行default via 10.0.0.1 dev eth0。这代表默认路由。当你访问百度(不在你的局域网网段时),数据包会默认扔给10.0.0.1这个网关(也就是路由器),由它替你转交。
实战 3:验证 TTL 与路由追踪
# 使用 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。