[图解linux][Network stack系列]:网络设备的数据结构介绍

在这里插入图片描述

net_device网络设备结构

网络接口模块的核心数据结构为网络设备结构 struct net_device,该结构与实际的物理网卡对应,用来记录和描述网卡的相关信息和动作。具体定义如
下。

struct net_device
{
    
    
	char name[IFNAMSIZ]; 	/*网卡名称*/
	int s; 				 	/*建立的 PACKET 套接字描述符*/
	struct sockaddr_ll to;  /*目的网卡地址结构*/
	int index 				/*网络设备的索引*/
	int mtu; 				/*网卡最大传输单元*/
	__u8 hwaddr_len; 		/*硬件地址长度*/
	__u8 hwaddr[ETH_ALEN];  /*硬件地址,MAC*/
	sem_t recv_sem; 		/*接收信号量*/
	sem_t send_sem; 		/*发送信号量*/
	struct queue *recv_queue; /*接收队列*/
	struct queue *send_queue; /*发送队列*/
	__u8 (* input)(struct skbuff **skb,struct net_device *dev); /*从网络设备获取数据帧*/
	__u8 (* output)(struct skbuff *skb,struct net_device *dev); /*从网络设备发送数据帧*/
	__u8 (* filter)(unsigned char *frame, struct net_device *dev); /*用户注册的过滤函数*/
};

初始化阶段,网络接口模块为每一块参与转发的物理网卡申请一个该结构的
管理对象,并绑定PACKET 类型的套接字用于底层数据帧的收发。运行期间,网络接口模块为每一块网卡维护接收线程和发送线程,待发送和待处理的数据帧分别挂载在发送队列和接收队列,其中,接收线程和发送线程调用 input()output()函数从网卡收发单个数据帧,input()output()函数内部通过读写PACKET套接字实现。

sk_buff数据包管理结构

sk_buff结构体的定义如下,其中,next 指针用于构造 sk_buff 结构的链表,
sdev记录数据帧接收自哪个网卡设备,ddev记录处理后数据帧从哪些网卡设备发出,nhphy分别是网络层和物理层首部指针的枚举变量,分别指向网络层和物理层数据的起始位置,tot_len 记录 sk_buff结构中数据帧的总长度,len记录当前协议层的数据长度。head 指针指向实际数据帧的首部,data指向当前层网络数据的首部,tail 指向当前层网络数据的尾部,end指向实际数据帧的尾部。

struct skbuff
{
    
    
	struct skbuff *next; 		/*指向下一个 skbuff 结构*/
	struct net_device *sdev; 	/*接收设备*/
	struct net_device *ddev; 	/*发送设备*/
	/*网络层枚举变量*/
	union{
    
     
		struct iphdr *iph;
		struct arph *arph;
		__u8 *raw;
	} nh;
	/*物理层枚举变量*/
	union{
    
    
		struct ethhdr *ethh;
		__u8 *raw;
	} phy;
	__u32 tot_len; 	/*skbuff 中网络数据的总长度*/
	__u32 len; 		/*skbuff 中当前协议层的数据长度*/
	__u8 *head, 	/*实际网络数据的头部指针*/
	*data, 			/*当前层网络数据的头部指针*/
	*tail, 			/*当前层数据的尾部指针*/
	*end; 			/*实际网络数据的尾部指针*/
};

おすすめ

転載: blog.csdn.net/qq_33487044/article/details/108230187