Linux wlan网络协议栈-路由框架详解
明确文章具体内容框架流程
明确文章具体内容所属框架位置
代码位置
基础流程图
ip_rcv_finish为Netfilter PRE_ROUTING 处理后的回调函数,负责路由查找和后续调度
根据PRE_ROUTING钩子点的作用,我们也可以得来ip_rcv_finish和PRE_ROUTING的关系
-
函数参数解析
struct sk_buff *skb // 数据包缓冲区
struct net_device *dev // 接收数据的网络设备
struct packet_type *pt // 包类型(对于IP协议固定)
struct net_device *orig_dev // 原始设备(用于桥接等场景) -
ip_rcv_core 的作用:确保IP包的基本合法性
检查数据包长度和完整性
验证IP头版本和校验和
处理IP选项
如果处理失败返回NULL -
ip_rcv_finish:它决定了每个数据包的最终命运:是发给本机、转发出去、还是丢弃
-
是一个函数指针,它的值由路由查找的结果决定!
-
路由查找
-
这个函数是核心,它根据数据包的目标IP地址决定数据包的命运
检查目标地址是否是IPv4组播地址
-
单播数据包的常规处理,走常规的慢速路径
基础函数内容:
1)初始化和基本检查
2)火星地址检测和过滤
3)路由表查找 (FIB)
4)根据路由类型处理
5)创建路由缓存条目 -
基础框架流程
-
源地址不能是组播或广播
地址理解:
组播地址范围:224.0.0.0 到 239.255.255.255
-
检测有限广播地址的函数
#define INADDR_BROADCAST ((unsigned long int) 0xffffffff)
static inline bool ipv4_is_lbcast(__be32 addr)
{/* limited broadcast */return addr == htonl(INADDR_BROADCAST);
}
有限广播地址的概念
1)有限广播地址:255.255.255.255
2)作用范围:只在本地网络段内广播,不会被路由器转发
3)用途:用于在不知道网络地址的情况下向本地网络所有主机发送数据
-
环回地址路由策略检查
环回地址的IP范围:127.0.0.0/8 (127.0.0.1 到 127.255.255.254)
-
核心路由查找
基础流程框架
-
路由类型处理
包含:
1)广播包处理
2)本机的包
3)是否允许转发
4)其他类型(组播、黑洞等)
fib_validate_source 的作用:
1)反向路径检查(防止IP欺骗)
2)验证源地址是否来自合理的网络接口
3)检查是否允许从该源地址接收数据
下面举例合法的应用场景:
如下是非法的广播用例:
-
local_input
local_input内容:
1)路由缓存查找(快速路径)
2)创建新路由条目(慢速路径)
3)路由缓存更新
4)数据包目标设置
疑问?
- 如果是local_input的包,是哪里更改了input函数的指针呢?
将dst的指针指向了ip_local_deliver
那走分路的make_route转发包呢?
- 为什么需要环回地址检查?
出于安全原因
1)防止地址欺骗:环回地址不应该从外部接口进入
2)协议合规:遵循TCP/IP协议规范
3)网络隔离:环回流量应该只在本地主机内循环
内容补充
- 组播地址类型区分
本地组播地址 vs 全局组播地址
- 有限广播地址的
1)有限广播地址(Limited Broadcast Address):255.255.255.255
2)作用范围:只在本地网络段内广播,不会被路由器转发
3)用途:用于在不知道网络地址的情况下向本地网络所有主机发送数据
实际网络中的应用场景
1)DHCP客户端发现: 客户端发送目标为255.255.255.255的DHCP发现包
2)网络配置: 当主机不知道网络地址时的本地通信
3)网络诊断: 向本地网络所有主机发送诊断信息