【一】IP 协议
在 Linux 的网络栈里,IP 协议处在一个很关键的位置:上面接传输层的 TCP、UDP,下面承接数据链路层。它既负责给数据包补上源地址、目的地址,也负责让数据包沿着合适的路径转发出去。可以把它理解成网络中的'调度层'——数据从应用层出来之后,先被 TCP/UDP 封装,再进入 IP 层打上地址标签,随后根据路由表选择下一跳,最终交给网卡发往外部网络。
对于运维来说,很多丢包、延迟、访问异常的问题,最后都能回到 IP、路由和分片这些基础机制上;对开发来说,弄清这些细节,也更容易理解程序在 Linux 上为什么会有不同的网络表现。
【二】IP 报文格式
IP 报文头里最核心的字段,决定了一个数据包怎么被识别、怎么被转发,以及在必要时如何被拆分和重组。
1. 4 位版本号
IPv4 的版本号就是 4。
2. 4 位首部长度
用于描述 IP 首部的长度,单位是 4 字节。它告诉接收方,报头到底占了多少空间。
3. 8 位服务类型
用于描述报文的服务偏好,比如更低延迟、更高吞吐量或更高可靠性。实际场景中通常不会同时满足多个目标,而是按需要做取舍。
4. 16 位总长度
表示整个 IP 报文的大小,单位是字节,包括首部和数据部分。
5. 16 位标识
这个字段主要在分片时使用,用来标记同一个原始报文的所有分片。
6. 3 位标志
同样与分片相关,用于表示报文是否允许分片、是否还有后续分片。
7. 13 位片偏移
表示当前分片在原始报文中的位置,便于接收端按顺序重组。
8. 8 位生存时间
TTL,表示数据包还能经过多少跳路由器。每经过一台路由器,TTL 就减 1,减到 0 时数据包会被丢弃。这个设计的目的很直接:避免报文在网络中无限循环。
9. 8 位协议
标识上层承载的是哪种协议,比如 TCP、UDP 等。
10. 16 位首部检验和
用于校验 IP 首部是否损坏。这里校验的是首部本身,不包括数据部分。
【三】网段划分
1. 什么是网段划分
网段划分的本质,是把一个大的网络拆成多个更小的子网。这样做的好处很明显:管理更清晰,广播范围更小,路由查找也更高效。可以把它类比成城市里的分区、楼栋和房间号——先确定区域,再在区域里定位到具体主机。
2. 如何划分网络位和主机位
这里有两个概念要先分清:
- 网络位:标识不同的网段。
- 主机位:标识同一网段中的具体主机。
决定这两部分如何切分的,就是子网掩码。例如 255.255.255.0。
3. 如何计算网段
假设有一个 IPv4 地址:192.168.1.100,它的二进制形式是:
11000000.10101000.00000001.01100100
如果子网掩码是 255.255.255.0,也就是:
11111111.11111111.11111111.00000000
那么前 24 位是网络位,后 8 位是主机位。计算网段时,网络位保持不变,主机位全部置 0:
11000000.10101000.00000001.01100100
11000000.10101000.00000001.00000000
因此,这个地址所在的网段就是 192.168.1.0。像 192.168.1.5、192.168.1.200 这样的地址,如果掩码相同,也都属于这个网段。


