深入理解 Linux 网络层
网络层在复杂的网络环境中确定一个合适的路径,将数据发送到指定的网络中。
一、网络层的概念
1. 为什么要有网络层?
IP 协议的本质工作就是提供一种能力,将数据跨网络从主机 A 送到主机 B。而 TCP 协议提供策略保证这个过程的可靠性。用户需要的是一种可以将数据可靠地跨网络从 A 主机送到 B 主机的能力。
2. 数据是如何通过 IP 层发送的?
找到主机后将数据交给具体进程是传输层的事情,而找到主机是 IP 层的事情。因此需要对所有的主机进行标识,通过源 IP 和目的 IP 来标识源主机和目的主机。
要找到该主机,还需要确认他在哪个局域网里面。IP 地址的设计遵循'目标网络 + 目标主机'的方式,以便在构建网络的时候为将来快速定位一台主机提供基础保证。
IP 层会先找到目标网络(通过路由器转发),等找到了之后,再在该网络里用 MAC 地址去定位具体的主机,然后将数据传给他。
3. 如何理解'目标网络 + 目标主机'可以快速定位?
这种分层结构类似于学校学号:前三位标识学院(网络),后三位标识学生序号(主机)。如果只知道目标编号的前缀,可以通过层级查询快速排除其他网络,从而提高查找效率。同理,优先定位到目标网络,就可以排除一大堆其他网络,因此 IP 在设计时遵循这种方式。
二、IP 协议的报头
- 主机:配有 IP 地址,但是不进行路由控制的设备。
- 路由器:即配有 IP 地址,又能进行路由控制。
- 节点:主机和路由器的统称。
IP 头部字段详解
- 4 位版本号 (version):指定 IP 协议的版本,对于 IPv4 来说,就是 4。
- 4 位头部长度 (header length):IP 头部的长度是多少个 32bit,也就是 length * 4 的字节数。最大长度为 60 字节。通过头部长度 -20 可以知道是否携带选项。
- 8 位服务类型 (Type Of Service):包含优先权字段、TOS 字段和保留字段。TOS 分别表示最小延时、最大吞吐量、最高可靠性、最小成本。服务类型是一个自主策略,因为 IP 的路径选择是有多种方案的,可以根据具体需求给路由器提供转发策略。
- 16 位总长度 (total length):IP 数据报整体占多少个字节。说明 IP 也是面向数据报形式一块块发送的。
- 16 位标识 (id):唯一标识主机发送的报文。如果 IP 报文在数据链路层被分片了,那么每一个片里面的这个 id 都是相同的。
- 3 位标志字段:第一位保留;第二位置为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文;第三位表示'更多分片',最后一个分片置为 1,其他是 0。
- 13 位分片偏移 (fragment offset):是分片相对于原始 IP 报文开始处的偏移。实际偏移的字节数是这个值 * 8 得到的。除了最后一个报文之外,其他报文的长度必须是 8 的整数倍。
- 8 位生存时间 (Time To Live, TTL):数据报到达目的地的最大报文跳数。一般是 64。每次经过一个路由,TTL -= 1,一直减到 0 还没到达,那么就丢弃了。主要是用来防止出现路由循环。
- 8 位协议:表示上层协议的类型。得知我们要 IP 层的有效载荷交付给上层的哪个协议。
- 16 位头部校验和:使用 CRC 进行校验,来鉴别头部是否损坏。
- 32 位源地址和 32 位目标地址:表示发送端和接收端。根据这个来让路由器进行路径选择。
- 选项字段 (不定长,最多 40 字节)。
关键问题解答:
- IP 层如何将报头和有效载荷分离? 固定长度(20 字节)+ 自描述字段(首部长度 + 总长度)。
- 如何将有效载荷交付给上层? 32 位源 IP 和目的 IP 是用来定位 IP 地址的,而其中 8 位协议字段是用来定位该主机的上层协议的。



