linux内核网络分析-通用字段“每日读书”

这一讨论sk_buff主要字段这些字段都与特定内核功能无关

struct timeval stamp;

通常只对一个已经封包才有意义这是一个时间戳用于避哦啊是封包何时接收或者有时候用于表示封包预定传输时间字段netif_rx 函数net_timestamp设置函数接收每个封包之后设备驱动程序调用对比第二十一给出描述

struct net_device *dev;

此段描述一个网络设备类型net_device 本章稍后做出详细说明dev所代表设备角色依赖于存储缓冲区内封包即将传输还是刚被而定

接收到一个封包设备驱动程序会代表接收接口数据结构指针更新字段下列取自vortex_rx代码片段所示接收到一帧3c95x系列以太网卡驱动程序就会调用函数(在 drivers/net/3c59x.c中)

static int vortex_rx(struct net_device *dev)

{

skb->dev = dev;

skb->protocol = eth_type_trans(skb, dev);

netif_rx(skb);//封包传到较高分层

}

传输一个封包参数代表发送封包设备设置代码要比接收封包更为复杂所以相关讨论推迟二十一三十五进行

有些网络功能允许一些设备集合起来代表转移虚拟借口一个虚拟设备驱动程序提供接口服务当该设备驱动程序调用dev参数指向虚拟设备的net_device 数据结构驱动程序群组选择一个特定设备然后dev参数改为指向设备net_devoce数据结构因此在这些情况下封包处理期间传输设备指针可能会变化

struct net_device *input_dev

这是已经接收封包源自设备封包是由本地产生NULL指针Ethernet 设备而言字段eth_type_trans初始化字段主要流量控制traffic control使用

struct net_device *real_dev

字段只对虚拟设备有意义代表虚拟设备关联真实设备例如BondingVLAN接口使用字段用以记下真实设备输入流量什么地方接收来的

union {...} h

union {...} nh

union {...} mac

这些指向TCP/IP协议栈报头指针h针对L4, nh针对L3 mac针对L2每个字段都指向一个各种结构组成联合每个协议结构都是内核解析例如h一个联合内核解释每个L4协议报头h都有一个字段每个联合都有一个名为raw成员用于初始化后续所有访问都是通过协议指定成员

接收一个数据封包负责处理n报头函数n-1接收一个缓冲区缓冲区skb->data 指向n报头开端处理n函数初始化适当指针skb->nh 用以保存skb->data 字段因为下一层进行处理skb->data 设成缓冲区另一个不同偏移量这个指针内容就会丢失接着函数完成n处理封包传给n+1处理函数更新skb->data, 使指向n报头尾端也就是n + 1报头开始

传送一个封包就是过程逆过程所增加复杂度就是每一个层增加一个新的报头

struct dst_entry dst

这个结构路由子系统使用由于这个数据结构相当复杂需要了解其他子系统如何工作知识因此推迟第七部分予以描述

char cb[40]

这是一个控制缓冲区control buffer, 或者私有信息存储空间每一个内部使用维护作用字段sk_buff结构静态分配(目前的大小是40个字节)而且容量足以容纳每个层所需要私有数据每一个层代码都是通过进行访问这样使得代码更具有可读性例如tcp使用这个空间存储一个tcp_skb_cb数据结构数据结构定义在include /net/tcp.h

struct tcp_skb_cb {

__u32 seq;//起始序列号编号

__u32 end_seq; //SEQ + FIN +SYN + datalen

__u32 wlen;//用于计算rtt's

__u8 flags;//TCP报头标志

  }

以下TCP代码用于访问结构一些简单的指针组成

#define TCP_SKB_CB(__skb) ((struct tcp_skb_cb*)& ((__skb))->cb[0])

以下TCP子系统收条填写结构案例

int tcp_v4_rcv(struct sk_buff *skb)

{

th = skb->h.th;

TCP_SKB_CB(skb)->seq = ntohl(th->seq);

TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin + skb->len - th->doff * 4);

TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);

TCP_SKB_CB(skb)->wlen = 0;

TCP_SKB_CB(skb)->flags = skb->nh.iph->tos;

TCP_SKB_CB(skb)->sacked = 0;

}

为了了解cb缓冲区参数如何找回可以看一下net/ipv4/tcp_output.ctcp_transmit_skb tcp函数一个数据压入IP以便于传输

二十二章你还了解IPV4如何采用cb存储有关IP分片信息

unsigned incsum

unsigned char ip_sumed

这些代表校验和(checksum)以及相关联状态标识用法将在十九章予以描述

unsigned char cloned

一个boolean 标识置位表示结构另一个sk_buff 缓冲区克隆参见稍后 缓冲区克隆拷贝一节

unsigned chapkt_type

字段根据L2目的地址进行类型划分可能取值列于include/linux/if_packet.h Ethernet 设备而言参数函数eth_type_trans 进行初始化十三章予以描述

PACKET_HOST

已经收帧目的地址接收接口换句话说, 封包已经达到目的地

PACKET_MULTICAST

已接收目的地址是该接口已经注册多播地址之一

PACKET_BRODCAST

目的地址接收接口广播地址

PACKET_OTHERHOST

已经接收目的地址不属于接口相匹配地址多播以及广播因此如果转发机制使能不得不转发否则就会丢弃

PACKET_OUTGOING

封包正被发送标识用户Decnet 协议并且每个分流器一个输出封包副本函数

PACKET_LOOPBACK

封包传送回环设备由于标识处理回环设备内核可以跳过一些真实设备所需要操作

PACKET_FASTROUTE

fastroute 功能路由封包

十三章详细描述了这些如何根据L2目的地址设置

__u32 priority

字段表示传输或者转发封包Qos 登记如果封包本地产生套接字定义优先级相反如果封包正被转发函数rt_tos2priority 根据IP报头本身Tos 字段定义字段函数十八章所描述DSCP 无关二十六ip_forward 函数一节讨论角色

unsigned shorprotocol

L2设备驱动程序角度就是用在下一个较高协议典型协议IPIPV6以及ARP完整列表可以include/linux/if_ether.h找到由于每种协议都有自己函数处理例程处理输入封包因此驱动程序使用这个字段通知上层使用哪个处理例程每个驱动程序调用netif_rx启动上面网络 分层处理例程所以函数调用protocol字段必须初始化更多细节参见十章十三章

unsigned short security

这是封包安全级最初引入这个字段是为了IPsec, 现在已经不再使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值