Linux内核TCPIP协议栈V1.1(2015-5-3011.0.37)规范.docx

Linux内核TCPIP协议栈V1.1(2015-5-3011.0.37)规范.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux内核TCPIP协议栈分析 Linux-2.6.20 第一部分 数据结构、概述及其他 架构 系统调用接口 两种调用接口: 1、用户进程进行网络调用,通过系统特有的网络调用接口进入内核,在内核中,进一步调用sys_socketcall()结束该过程,在sys_socketcall()中会根据网络系统调用号调用具体的功能。 2、另一种系统调用接口是通过普通文件操作来访问网络子系统。虽然有很多操作是网络专用的,但套接口的输入输出可以被当成典型的文件读写操作来进行。 2、协议无关接口 Linux使用socket来描述套接口,代表通信链路的一端,存储与该链路有关的所有信息。 什么叫代表通信链路的一端? 每一个进程都会实例化一个socket。 Socket结构:/include/linux/net.h sk指向与该套接口相关的传输控制块,传输层使用传输控制块存放套接口需要的信息。比如各种协议相关函数的指针。TCP、UDP、RAW ops指向特定的传输协议的操作集接口,不同协议族不同。proto_ops结构中定义的接口函数是从套接口系统调用到传输层调用的入口,因此其成员与socket系统调用基本上是一一对应的。整个proto_ops结构就是一张套接口系统调用的跳转表,其中的某些操作会继续调用proto结构跳转表中的函数,从而进入具体的传输层或网络层的处理。 套接口缓存 保存在进程和网络接口之间相互传递的用户数据,以及其他的一些信息。 SKB定义:include/linux/skbuff.h SKB操作函数:net/core/skbuff.c 1、SKB的组织 struct sk_buff *next; struct sk_buff *prev; 内核把sk_buff组织成为双向链表,为了每个SKB能被头部快速找到,在第一个SKB节点的前面会插入另一个辅助的sk_buff_head结构的头结点。 struct sk_buff_head { /* These two members must be first. */ struct sk_buff *next; struct sk_buff *prev; __u32 qlen;//SKB链表的节点数,队列长度 spinlock_t lock;//对链表并发操作需要自旋锁 }; 数据存储相关 struct sock *sk; SKB的宿主传输控制块。SKB在由本地产生或者本地接收的时候才有效。当SKB在2层或者3层转发的时候,没有意义,NULL。 unsigned int len,mac_len,data_len len:SKB中数据部分的长度。Mac_len:以太帧首部长度 data_len:SG类型和FRAGLIST类型聚合分散I/O存储区中的数据长度。 atomic_t users; 引用计数,标识有多少个实体在使用SKB,以此来确定释放SKB的时机。 unsigned int truesize; SKB的实际长度,包括SKB描述符和数据缓存区的长度。如果申请了一个len字节的缓存区,alloc_skb()会将truesize初始化成len+sizeof(sk_buff) unsigned char *head,*data,*tail,*end; 发送数据时,每一层协议会在head与data之间填充协议首部。 通用的成员变量 struct skb_timeval tstamp; 接收时间戳或者发送时间戳,一般在网络设备收到数据包以后通过netif_receive_skb()调用net_timestamp()进行设置 struct net_device *dev; 网络设备指针,该字段的设置与SKB是发送包还是接收包有关。在初始化网络设备驱动的时候会分配接受缓存队列,将该指针指向接收到数据包的网络设备。 发送数据包时这个字段的设置要复杂的多,见后面。 Linux支持虚拟网络设备,dev可能会指向虚拟网络设备。数据包在输入或者输出的时候dev的指针可能会在包处理过程中被改变。 struct net_device *input_dev; 接收报文最原始的设备,本地生成为NULL。 Union{}h、union{}nh、union{}mac 分别指向四层、三层、二层协议的首部,联合体内表示能解析的协议。 报文从二层向三层传递时指针的变化: 发送报文的时候需要为报文加上首部。 struct dst_entry *dst; 目的路由缓存项。不管是输入还是输出的数据包,都需要经过路由子系统的查询得到目的路由缓存项之后,才能确定数据包的流向。 char cb[48]; SKB信息控制块,用于每层协议私有信息存储空间,T

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档