网络访问层仍受到传输介质的性质和相关适配器的设备驱动程序的影响很大。网络层与网络适配器的硬件性质几乎是完全分离的。为什么是几乎呢?该层不仅负责发送和接受网络数据,还负责在彼此不直接连接的系统之间转发和路由分组。查找最佳路由并选择适当的网络设备来发送分组,也涉及对底层地址簇的处理(比如特定硬件的 MAC 地址)。
ip_rcv
函数是网络层的入口点,分组向上穿过内核的过程如下:
接收分组
接收分组
在分组转发到 ip_rcv
之后,必须检查接收到的信息确保它是正确的。主要检查计算的校验和与首部中存储的校验和是否一致。其他检查包括分组是否到达了 IP 首部的最小长度,分组协议是否确实是 IPv4。
在进行检查之后,内核并不立即继续对分组的处理,而是调用一个 netfilter
挂钩,使得用户空间可以对分组数据进行操作。netfilter
挂钩插入到内核源码中定义好各个位置,使得分组能够被外部动态操作。
分组转发
IP 分组可能如上所述交付给本地计算机处理,他们也可能离开互联网路层,转发到另一个计算机,而不牵涉本地计算机的高层协议实例。分组的目标地址可分为以下两类。
- 目标计算机在某个本地网络中,发送计算机与该网络有连接。
- 目标计算机在地理上属于远程计算机,不连接到本地网络,只能通过网关访问。
第二种场景要复杂得多。首先必须找到剩余路由中的第一个站点,将分组转发到该站点,这是向最终目标地址的第一步传输。因此,不仅需要计算机所属本地网络结构的相关信息,还需要相邻网络结构的相关的外出路径的信息。
发送分组
转移到网络访问层:ip_output 函数代码流程,其中根据分组是否需要分片。
调用流程
参考资料:https://github.com/0voice