- 1、本文档共45页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ipv6初始化和处理流程分析
Ipv6初始化和处理流程分析一.Ipv6的初始化1.网络子系统概述Linux 内核中,与网络相关的代码是一个相对独立的子系统,称为网络子系统。网络子系统是一个层次化的结构,可分为以下几个层次:1)Socket 层Linux 在发展过程中,采用 BSD socket APIs 作为自己的网络相关的 API 接口。同时,Linux 的目标又要能支持各种不同的协议族,而且这些协议族都可以使用 BSD socket APIs 作为应用层的编程接口。因此,在 socket APIs 与协议族层之间抽象出一个 socket 层,用于将 user space 的 socket API 调用,转给具体的协议族做处理。2)协议族层(INET协议族、INET6协议族等)Linux 网络子系统功能上相当完备,它不仅支持 INET 协议族(也就是通常所说的 TCP/IP stack),而且还支持其它很多种协议族,如 DECnet, ROSE, NETBEUI 等。INET6 就是一种新增加的协议族。对于 INET、INET6 协议族来说,又进一步划分为传输层和网络层。?3)设备驱动层设备驱动层则主要将协议族层与物理的网络设备隔离开。它不在本文的讨论范围之内。下图是 Linux 网络系统层次结构图。2.网络子系统的初始化1)Socket 层的初始化:Init()-do_basic_setup()-sock_init()Sock_init():对 sock 和 skbuff 结构进行 SLAB 内存的初始化工作2)各种网络协议族的初始化:Do_initcalls():对于编译到内核中的功能模块(而不是以模块的形式动态加载),它的初始化函数会在这个地方被调用到。?内核映象中专门有一个初始化段,所有编译到内核中的功能模块的初始化函数都会加入到这个段中;而 do_initcalls() 就是依次执行初始化段中的这些函数。INET 协议族通常是被编译进内核的;它的模块初始化函数是 net/ipv4/af_inet.c 中的 inet_init() 而INET6 是作为一个模块编译的。它的模块初始化函数是 net/ipv6/af_inet6.c 中的 inet6_init()3.协议族Linux 网络子系统可以支持不同的协议族,Linux 所支持的协议族定义在 include/linux/socket.h1)协议族数据结构协议族数据结构是 struct net_proto_family。struct?net_proto_family?{????????????int?????????????????????family;????????????int?????????????????????(*create)(struct?socket?*sock,?int?protocol);????????????short?????????????????authentication;????????????short?????????????????encryption;????????????short?????????????????encrypt_net;????????????struct?module????*owner;};这个结构中,最重要的是create 函数,一个新的协议族,必须提供此函数的实现。这是因为:???? 不同的网络协议族,从user space的使用方法来说,都是一样的,都是先调用socket()来创建一个 socket fd,然后通过这个fd发送/接收数据。在user space 通过 socket() 系统调用进入内核后,根据第一个参数协议族类型,来调用相应协议族create()函数。对INET6来说,这个函数inet6_create()。因此,要实现一个新的协议族,首先需要提供一个create() 的实现。关于 create() 里面具体做了什么,后面再叙述。Linux 系统通过这种方式,可以很方便的支持新的网络协议族,而不用修改已有的代码。这很好的符合了“开-闭原则”,对扩展开放,对修改封闭。2)协议族注册Linux 维护一个struct net_proto_family ?的数组net_families[]如果要支持一个新的网络协议族,那么需要定义自己的struct net_proto_family,并且通过调用sock_register 将它注册到 net_families[] 中。4.sock层socket 层又叫 “socket access protocol layer”。它处于 BSD socket APIs 与底层具体的协议族之间。这是一个抽象层,它起着承上启下的作用。在这一层的数据结构也有着这种特点1)数据结构在 us
文档评论(0)