套接字的内核实现原理以及对数据的处理流程简述

来源:互联网 发布:义乌淘宝店铺装修服务 编辑:程序博客网 时间:2024/06/06 10:50

套接字的内核实现以及对数据的处理流程简述

 

  总的的来说,对内核协议栈的学习和研究,应将重点放在层间接口上,也就是数据是怎么在层间传递的,这其中又可分为两大部分,第一部分是:链路层<-->网络层;其他层间的传递(eg:IP-->TCP,TCP->IP);其中每部分又分为收发两部分。第一部分的发送和接收都是通过软中断来实现,尤其注意网络层的接收函数是注册在链路层的链表中的,通过dev_add_pack()实现;第二部分的收发都是通过函数指针具体指向的函数来实现,尤其注意接收函数是通过专门的结构体中的函数指针来表示的,与第一步分的接收函数注册方式并不相同,接收函数的组织结构也不相同。

1,创建套接字

Socketàsys_socketàsock_createàinet_createà得到套接字描述符。其中inet_create是创建INET协议族套接字是调用的函数。这个函数在sock_register()中北赋值给struct net_proto_family中的create函数指针,这个结构是描述协议族类型的,并根据协议族类型对create指针赋相应的创建函数。

2,协议族类型操作集

Linux通过Struct proto_ops结构统一定义操作接口,上层应用程序通常调用的都是这里的函数指针指向的函数,而这些函数再根据传输层具体的传输协议(如tcpudp)调用相应的发送或其他函数,具体的传输层的操作集用结构struct_proto结构表示,而这两个结构(Struct proto_opsstruct_proto)又是通过struct inet_protosw联系起来的。那应用程序是如何调用套接字中的相关接口函数呢,见下面。

 

3,struct socket结构。

以发送函数send为例说明,当应用程序调用send(其中含有套接字描述符为参数)函数时,其实会陷入系统调用sys_send(),该函数接着调用函数sys_sendto(同样含有套接字描述符为参数),在该函数中会根据该描述符找到套接字socket的数据结构。然后调用sock_sendmsg(含struct socket为参数)函数,该函数再调用__sock_sendmsg(含struct socket为参数),在这个函数中最终通过语句sock->ops->sendmsg()调用inet_sendmsg.注意这里的inet_sendmsg实质上是Struct proto_ops中的函数接口,那么如何通过此抽象接口调用到具体的传输层协议(如tcpudp)函数接口呢?原来在struct socket结构中有一个sock*类型的sk指针,这个指针指向具体的传输层套接字结构(指:struct sock),这样在inet_sendmsg函数中通过调用sk->sk_prot->sendmsg()就调用到了具体的传输层协议的发送函数tcp_sendmsg.

 

 

 

 

到这里就要问了,那么这些函数指针又是在何处赋值的呢?其实在套接字被创建的时候根据套接字协议族类型和具体的套接字决定的。

 

4,套接字协议族操作集struct proto_ops和具体套接字操作集struct proto所含函数指针的初始化。

 

 

 

 

待续... ...

 

转载请注明出处... ...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击