- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
深入分析原始套接口作者:noble noble_shi@21日期:2003-06-03深入分析原始套接口1.约定1.1 其中涉及到的内核代码都源自于linux kernel 2.4.7。1.2 没有其他说明情况下,我们用sk表示struct sock类型变量,用sock表示struct socket{}类型变量。1.3本文涉及到数据包在协议栈上的流程。1.4 由于作者水平有限,难免有错误指出,请联系指导。1.4联系方式:noble_shi@212.套接口简介????为了执行网络I/O,一个进程必须做的第一件事情就是调用socket函数,创建套接口。一个套接口在逻辑上有三个特征,或者说三个要素,那就是网域、类型和规程。????????首先是网域,它表明一个插口用于那一种类型的网络,如AF_INET表示互联网套接口,而AF_IPX则为Novell网的IPX套接口,AF_X25为X.25网套接口,等等。其中有个特例,那就是什么网也不是,只是在一台计算机上用于进程间通信,BSD为这种特例定义的域名为AF_UNIX。后来,在POSIX标准里又定义了一个AF_LOCAL,以示对别的操作系统也一视同仁。????????其次为类型,它表明在网络中通信所遵循的模式。网络通信有两种主要模式,一种称为有连接或面向连接(connection oriented)的通信。另一种称为无连接(connectionless)通信,也常常称为数据包(datagram)模式,也称面向报文(message oriented)的通信模式。????????最后是规程,它表明具体的网络规程。一般说来,网域和类型结合在一起大体上就确定了使用的规程。例如,要是网域为AF_INET,而类型为无连接,则规程基本上就是UDP了。但是有些情况下还可能会有别的选择,此时就由它来进一步明确具体的规程。????????总之,套接口的三个特性是互相联系的,归根结底就是反映了一个套接口所运行的网络规程。由于在每个套接口的后面都隐藏着网络规程,对套接口的比较详尽的讨论就势必设计到计算机网络协议和协议栈具体实现。3.原始套接口简介????当类型是SOCK_RAW时,调用socket函数创建一个原始套接口。第三个参数(协议)一般不应为0。例如,为创建一个IPv4原始套接口,我们可以这样写:????int sockfd;????sockfd = socket(AF_INET, SOCK_RAW, protocol);????其中protocol参数为形如IPPROTO_xxx的常值,由netinet/in.h头文件定义,如IPPROTO_IGMP。但是要注意,头文件里定义了一个协议名,如IPPROTO_EGP,并不意味着内核肯定支持它。(后面附有所有的协议类型)????为了防止普通用户向网络上写自己的IP数据包,只有超级用户才有权限创建原始套接口。????4.原始套接口的协议栈实现――原始套接口的创建????当我们调用:socket(AF_INET, SOCK_RAW, protocol)该函数会返回一个套接口描述符,linux下每个文件描述符都用一个非负整数来描述(包括套接口描述符),在内核都有一个对应的struct file{}结构。创建一个原始套接口时,其函数调用过程如图一所示:????????图一套接口创建流程图????创建后的套接口在内核中的结构如图二所示:????图二???? 套接口在系统内核中的结构图其中socket{}结构是在sock_create()函数中分配,该结构是inode{}结构的一部分,sock-type(注意,变量sock是socket{}类型,见前面约定,下同)被设置为用户指定的类型,这里为SOCK_RAW,sock-sk指向一个struct sock{}结构,sock-ops(图中未画出该成员)被指定为inet_dgram_ops。该结构定义于/net/ipv4/af_inet.c,如下所示:struct proto_ops inet_dgram_ops = {????family:????????PF_INET,????release:????????inet_release,????bind:????????inet_bind,????connect:????????inet_dgram_connect,????socketpair:????sock_no_socketpair,????accept:????????sock_no_accept,????getname:????????inet_getname, ????poll:???
文档评论(0)