应用层:

套接字将Unix一切都是内核的概念应用到网络连接中,内核跟用户空间套接字之间的接口实现在c的标准库中,使用了socketcall系统调用.
socketcall充当了一个多路分解器,将各种任务分配到不同的过程执行,比如打开一个套接字,绑定或发送数据.
对于程序使用的套接字来说,都对应一个socket结构和sock的实例,二者充当向下(内核)跟向上(用户)接口

socket定义:
  1. struct socket{
  2. socket_state state;//套接字连接状态
  3. unsigned long flags;
  4. const struct proto_ops *ops; //具体协议类型
  5. struct file *file; //指向一个伪文件的file实例,用于跟套接字通信(描述符)
  6. struct sock *sk;
  7. short type; //所用协议类型的数字标识符
  8. };
ops包含处理套接字的特定于协议函数
  1. struct proto_ops
  2. {
  3. int family;
  4. .....
  5. int (*bind)(.............);
  6. int (*connect)(...........);
  7. .......等等
  8. };
这里跟c标准库的对应函数同名,因为c库函数会通过syscall系统调用来调用上面的函数指针

套接字与文件
在连接建立后,用户进程使用普通的文件操作来访问套接字,每个套接字都分配了一个该类型的inode,inode又管理到另外一个普通文件相关的结构.用于操作文件的函数保存到一个单独的指针表中
  1. struct inode{
  2. .....
  3. struct file_operations *i_fop;
  4. ....
  5. }

因此,对套接字文件描述符的文件操作,可以透明的定向到网络子系统的代码,套接字使用的file_operations如下:
  1. struct file_operations socket_file_ops={
  2. .owner=THIS_MODULE,
  3. .poll=sock_poll
  4. .aio_read=sock_aio_read;
  5. .mmap
  6. .....
  7. };

前缀为sock_的函数都是简单的包装器函数,他们会调用sock_operations.比如sock_mmap所示
  1. static int sock_mmap(struct file*file,struct vm_area_struct *vma)
  2. {
  3. struct socket*sock=file->private_data; //socket指向 文件实例
  4. return sock->ops->ops->mmap(file,sock,vma);
  5. }

inode跟套接字的关联,是通过以下辅助结构完成的
  1. struct socket_alloc{
  2. struct socket socket;
  3. struct inode vfs_inode;
  4. }

内核提供了两个宏进行必要的指针运算,根据inode找到相关套接字实例(socket_i)或者反过来(sock_inode)
socketcall系统调用
文件功能中的读写操作可以通过虚拟文件系统相关调用进入内核,然后重定向到socket_file_ops的函数指针,除此之外,还要对套接字执行其他任务
Linux提供了socketcall系统调用,它实现在sys_socketcall中,17个套接字操作对应一个系统调用,由于所要处理的任务不同,参数列表有很大差别.
  1. sys_socketcall(int call,unsigned long _user*args)
  2. {
  3. switch(call)
  4.     { case sys_socket:
  5. err=sys_socket(a0,a1,a[2]);
  6. break;
  7.      case SYS_bind:
  8. err=sys_bind(a0,(struct sockaddr __user*)a1,a[2]);
  9. ........
  10.     }
  11. }









Linux内核之网络的更多相关文章

  1. Linux内核分析 - 网络[十四]:IP选项

    Linux内核分析 - 网络[十四]:IP选项 标签: linux内核网络structsocketdst 2012-04-25 17:14 5639人阅读 评论(1) 收藏 举报  分类: 内核协议栈 ...

  2. Linux内核中网络数据包的接收-第一部分 概念和框架

    与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事:1.数据包到来后的通知2.收到通知并从数据包中获取数据这两件事发生在协 ...

  3. Linux内核中网络数据包的接收-第二部分 select/poll/epoll

    和前面文章的第一部分一样,这些文字是为了帮别人或者自己理清思路的.而不是所谓的源代码分析.想分析源代码的,还是直接debug源代码最好,看不论什么文档以及书都是下策. 因此这类帮人理清思路的文章尽可能 ...

  4. Linux内核笔记--网络子系统初探

    内核版本:linux-2.6.11 本文对Linux网络子系统的收发包的流程进行一个大致梳理,以流水账的形式记录从应用层write一个socket开始到这些数据被应用层read出来的这个过程中linu ...

  5. LINUX内核参数网络相关

    有助于提高网络性能和吞吐量的参数 net.core.somaxconn = 128 已完成连接队列(completed connection queue) (1)三次握手已经完成,但还未被应用层接收( ...

  6. linux内核中网络文件系统的注册初始化

    针对内核3.9 系统开启时,会使用init/main.c,然后再里面调用kernel_init(),在里面会再调用do_basic_setup(),调用do_initcalls(),调用do_one_ ...

  7. linux内核之网络协议栈

    https://www.ibm.com/developerworks/cn/linux/l-ntflt/

  8. Linux内核分析 - 网络

    http://blog.csdn.net/column/details/network-kernel-yoyo.html

  9. Linux内核--网络栈实现分析(二)--数据包的传递过程(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7492423 更多请看专栏,地址 ...

随机推荐

  1. (转发)IOS动画中的枚举UIViewAnimationOptions

    若本帖转自(博客园·小八究):http://www.cnblogs.com/xiaobajiu/p/4084747.html 可怜目前天朝搜不到什么有价值的东西方便学习,在这里方便初学者. 首先这个枚 ...

  2. ios sinaweibo 客户端(一)

    上一篇sina微博Demo已经完成的认证,下面就开始进入微博相关内容的加载及显示.其实主要的工作就是调用微博API 加载相关的json数据,然后进行解析,然后在界面中进行组织好在tableview中进 ...

  3. iOS中的数据存储方式_SQLite3

    优点: 1) SQLite是一款轻型的嵌入式数据库; 2) 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 3) 它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还 ...

  4. 【转】Matlab的regionprops详解

    matlab函数_连通区域 1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下 ...

  5. Codevs1081 线段树练习 2

    题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n ...

  6. NOIP2016——一个逗号引发的血案

    今年江西省报名人数一下子增起来了 隔壁中学来了80+人(虽然都是来给我们垫底的...临时被老师抓来上战场 总之我们赛区参赛人数总算多起来了(起码没再减50%...连续4年减50%真不是随便说说的... ...

  7. MySQL查询显示连续的结果

    #mysql中 对于查询结果只显示n条连续行的问题# 在领扣上碰到的一个题目:求满足条件的连续3行结果的显示 X city built a new stadium, each day many peo ...

  8. R,RJAVA 安装配置 详细版

    准备工作 系统必须已经安装JDK 并配置好了环境变量. 注:安装的jdk  r  以及系统 尽量保持位数一致   1.下载 R https://mirrors.tuna.tsinghua.edu.cn ...

  9. 《Spring源码深度解析》第三章 默认标签的解析

    上一章提到了,默认标签和自定义标签要分开解析.本章重点介绍默认标签的解析.在 DefaultBeanDefinitionDocumentReader 中: private void parseDefa ...

  10. SSAS——MDX基础

    一.基本概念 MDX:一种查询语言,从多维的数据集单元格中检索数据.支持两种不同的模式: 1.表达式语言:定义和操纵Analysis Services对象和数据以计算值 2.查询语言:从Analysi ...