TCP/IP协议栈之一----------系统调用层

来源:互联网 发布:自学黑帽seo 编辑:程序博客网 时间:2024/05/17 23:36

                                                前言

说明:本系列文章来源于主要来源于网络方面的两本书籍:

1.Linux内核协议栈源码分析
2.linux网络体系结构--linux内核中网络协议的设计与实现
   文章中的页数都是来源于Linux内核协议栈源码分析


1.1系统调用 

send 

    sys_send(int fd, void __user * buff)  

       sys_sendto 

sendto 

    sys_sendto (intfd, void __user * buff

       sock_sendmsg 

sendmsg 

    sys_sendmsg 

       sock_sendmsg 

write 

    sys_write 

       vfs_write 

           file->f_op->write = do_sync_write (read_write.c/fs)

               filp->f_op->aio_write = sock_aio_write socket.c

                   do_sock_write 

                       __sock_sendmsg 

writev 

    sys_writev 

       vfs_writev 

           do_readv_writev 

               do_sync_readv_writev 

                   sock_aio_write 

                       do_sock_write 

                           __sock_sendmsg 

recv 

    sys_recv 

       sys_recvfrom 

recvfrom 

    sys_recvfrom 

       sock_recvmsg 

recvmsg 

    sys_recvmsg 

       sock_recvmsg 

read 

    sys_read 

       vfs_read 

           file->f_op->read= do_sync_read 

               filp->f_op->aio_read= sock_aio_read 

                   do_sock_read 

                       __sock_recvmsg 

readv 

    sys_readv 

       vfs_readv 

           do_readv_readv 

               do_sync_readv_readv 

                   sock_aio_read 

                       do_sock_read 

                           __sock_recvmsg 

socket 

listen 

connect 

bind 

select 

close 

shutdown 

ioctl 

getsockname 

getpeername 

setsockopt 

getsockopt 


1.2内部实现函数 

sock_sendmsg (struct socket*, struct msghdr*

    __sock_sendmsg(struct kiocb *, struct socket *,

                 struct msghdr*

       

重要:在sock_sendmsg的上层函数中,会把用户数据拷贝到内核,构造成msghdr结构体。

 

__sock_sendmsg (socket.c

    sock->ops->sendmsg 

对于TCP就是tcp_sendmsg(tcp.c/ipv4),否则就是inet_sendmsg(af_inet.c/ipv4)。后者调用sk->sk_prot->sendmsg,会继续分用为udp_sendmsg(udp.c/ipv4)或raw_sendmsg(raw.c/ipv4)函数 

(2.6.10内核都是被inet_sendmsg调用)

 

 

sock_recvmsg 

    __sock_recvmsg 

 

__sock_recvmsg 

    sock->ops->recvmsg =sock_common_recvmsg(sock.c/core) 

sock_common_recvmsg对于不同协议,是tcp_recvmsg,udp_sendmsg或raw_sendmsg函数。 

重要:在sock_recvmsg的上层函数中,会把内核中的msghdr结构体信息赋值到用户态空间


0 0