一、操作系统关于网络部分的分层处理

操作系统完成用户和物理链路之间的转换,这种转换可简单分为三个层面,如下图所示:

插口层,直接对应用户的系统调用,完成用户调用参数校验等等,它不设计任何网络协议相关的工作;

协议层,完成协议相关的操作,例如将插口层交过来的数据加上tcp/udp和ip层的头部等等。

网络接口层,完成与物理传输媒介的交互,它包括数据链路层和网卡驱动,它一端对接协议层,一端对接物理链路。

图1

在用户进程发送数据的过程如下:

(1)用户进程调用系统函数sendto,并在参数中指定自己要发送的数据,以及发送的目标地址,这时用户要发送的数据还在用户空间;

(2)在插口层的sendto函数中,做参数校验,并在系统空间申请一块内存,把用户空间的数据复制到内核空间,然后将内核空间的数据转交给下一层协议层。

(3)协议层在拿到内核数据之后,在数据头部加上UDP的首部和IP层的首部,然后将数据交给下面的网络接口层;

(4)网络接口层再加上mac地址,然后通过网卡驱动把数据从网卡发送出去。

用户进程接收数据的过程如下:

(1)网卡驱动通过中断方式从网卡上获取一个数据分组(即来数据时产生一个中断,中断函数由网卡驱动实现,网卡驱动知道怎么从网卡把数据读进来),并将从这个数据分组存储在内核的一个缓冲区中,然后网卡驱动将这个内核缓冲区交给数据链路层来处理;

(2)数据链路层将根据数据帧中的字段判断该数据分组属于哪个协议层,并将内核缓存区交付它对应的队列中,需要注意:[1]数据链路层和上面的网卡驱动都对应上图中的网络接口层;[2]。将数据交给协议层是通过中断来完成的,而不是系统调用。

(3)IP通过中断对一个底层传上来的数据进行IP协议的处理,例如:处理IP层的首部、校验和、IP选项等等;如果当前的主机是路由器,且当前的数据报的地址是非本机地址,则转发这个数据报。IP层通过检查首部的协议字段就可确认当前的数据属于哪个上层协议:1:ICMP协议、2:IGMP协议、6:TCP、17UDP。

(4)TCP/UDP也要进行相应的校验和、协议检查,数据到这里已经知道是属于TCP还是UDP;在《unixt文件描述符——socket》一文中提到,TCP和UDP都有一个属于自己的协议控制块的双向链表,当接收到数据包时,就检查这个协议控制块的双向链表,通过对比数据包的源IP地址、源端口号、目的IP地址和目的端口号这四项与哪个协议控制块对应上,就可以确定当前这个数据是属于哪个协议控制块的。

(5)协议控制块中有个指针指向它所属的socket,数据处理到这里就知道应该交付到哪个socket的接收缓存了,此时,只需要把包含数据的内核缓冲区挂到socket接收缓存链表中既可,不需要进行数据拷贝。

(6)唤醒等待的应用进程;

(7)应用进程读取数据是再将数据从内核缓冲区复制到应用进程指定的用户空间的缓存中。

通过上面收发数据的过程可以看到,在发送数据时,是通过系统调用层层处理将数据发送出去;在接收数据时,是通过层层的中断来处理的,下一层产生一个中断,由上一层来处理这个中断。

二、中断处理

在操作系统对网络数据包进行自底向上传递过程中,需要经历一系列的中断,在操作系统中也是通过中断完成数据的互斥操作。下表是《TCP/IP协议卷2》中提供的8个中断函数和对应的优先级,每个中断处理期间只能被更高优先级的中断打断,不会被同级别或者比自己低级别的中断打断,通过这种方式即可完成中断处理时的互斥操作。

表1

如下图是中断在处理网络数据时的过程,图中每种颜色代表一个执行过程。

图2

(1)插口层正在以spl0级别的执行一个中断处理(对应数据A),此时,网络上有新数据过来,接口层产生一个splimp级别的中断,由于splimp优先级高于spl0,因此插口层的执行被打断,接口层的splimp级别的中断处理程序开始执行。

(2)splimp级别的接口层开始进行中断处理(对应数据B),它将完成数据的必要处理,并将数据交给协议层的队列中,并且产生一个splnet级别的中断,此时,接口层继续本层的其他处理直至本层处理完成,因为新产生的splnet中断级别没有当前的中断级别splimp高,因此本层的中断处理不会被打断;

(3)接口层的splimp中断处理完成之后,系统现在还有两个中断要处理:[1]被打断的spl0级别的中断;[2]新产生的splnet中断;由于splnet中断级别高于spl0,因此,先执行splnet中断,在该中断处理过程中将会对接口层传过来的数据进行协议层处理(对应数据B)。

(4)假如协议层的splnet级别中断正在执行过程中,系统又产生了一个spltty级别的中断——终端输入,由于spltty的优先级高于splnet,因此系统就打断splnet级别的中断处理,开始进行spltty的中断处理(对应数据C);

(5)spltty级别的中断程序完成终端输入的处理之后,系统现在还有两个中断要处理:[1]被打断的spl0级别的中断;[2]被打断的splnet级别的中断;由于splnet中断级别高于spl0,因此,系统还是先执行splnet中断完成数据的协议层处理(对应数据B),协议层处理完之后将会为数据B产生一个spl0级别的中断。

(6)splnet将数据处理完成之后,系统还有两个spl0的中断:[1]被打断的spl0中断(对应数据A);[2]新产生的spl0中断(对应数据B),此时,系统将先执行完成被打断的spl0中断,处理数据A;

(7)系统此时还剩下一个新产生的spl0,直接进行该中断的操作,完成数据B的接口层处理。

三、数据同步与互斥

通过图1可以看到,网络数据需要自底向上经过三个层次才能传递到应用进程,在这三次传递过程中都是通过中断异步来完成,每一层都有自己的进程来完成处理,因此在向上传递过程中保证进程间数据同步是非常重要的。网络数据自底向上传递过程是通过队列完成,每层进程只关心自己需要操作的队列即可,因此数据同步实质上就是对这些分层之间的队列的同步,即自己读队列的时候另一个层级的进程就不要进行插入队列的操作,如下图3所示:当协议层的处理进程正在从队列读取数据时,网络层接口的进程就不能向同一队列中放数据。

图3

各层的进程主要通过splnet、splimp与splx配对完成这种同步操作的,在对应上图3中的示例图中,可由下面的代码段1完成操作:

代码段1

代码段1是用于协议层与其下面的接口层进行数据共享的操作,其中,ipintrq就是图3中的层间共享数据队列,在协议层执行代码段1时,首先执行splimp,这就屏蔽了下面的接口层产生splimp级别的网络中断,由于接口层的网络中断会频繁发生,因此这里协议层屏蔽接口层的时间不能太长,在代码段1中,只从链表中摘取一个数据节点就立刻取消了屏蔽。

TCPIP协议卷2之io中断相关推荐

  1. 单片机tcp ip协议c语言,单片机上简单TCPIP协议的实现.PDF

    单片机上简单TCPIP协议的实现.PDF 年第 卷第 期 微电子学与计算机 HH !""! " # " %&'()% #$%&'% #$*+, ...

  2. 深入学习TCPIP协议

    下决心深入学习TCPIP协议 认真理解阅读<TCP-IP详解卷1 协议> 加油! 目      录 译者序 前言 第1章   概述 1 1.1   引言 1 1.2   分层 1 1.3 ...

  3. java io中断_JDK源码阅读:InterruptibleChannel 与可中断 IO

    来源:木杉的博客 , imushan.com/2018/08/01/java/language/JDK源码阅读-InterruptibleChannel与可中断IO/ Java传统IO是不支持中断的, ...

  4. 服务器win7internet协议议,主编细说win7系统internet协议在哪、添加TCPIP协议的操作方法...

    想必大家都遇到过win7系统internet协议在哪.添加TCPIP协议的问题吧,大多数朋友还不知道怎么处理因此我就在电脑上汇集整顿出win7系统internet协议在哪.添加TCPIP协议的少许解决 ...

  5. 计算机网络协议ppt,计算机网络基础——TCP-IP协议.ppt

    计算机网络基础--TCP-IP协议.ppt (50页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 第 4 章 TCP/IP协议栈*1069 ...

  6. linux中tcp/ip协议实现及嵌入式应用 下载,LINU中TCPIP协议实现及嵌入式应用

    好文网为大家准备了关于LINU中TCPIP协议实现及嵌入式应用范文,好文网里面收集了五十多篇关于好LINU中TCPIP协议实现及嵌入式应用好文,希望可以帮助大家.更多关于LINU中TCPIP协议实现及 ...

  7. xp系统简单tcpip服务器,xp系统没有tcpip协议怎么办,xp安装tcpip协议的方法

    用户在使用ghost xp sp3 装机版系统的时候发现少了tcpip协议,xp系统没有tcpip协议怎么办?那就只能自己安装了,具体该怎么安装的话,大家可以尝试以下的方法. xp安装tcpip协议的 ...

  8. TCPIP协议分层模型

    前言 TCP,Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协 ...

  9. MATLAB使用TCPIP协议传输矩阵

    MATLAB使用TCPIP协议传输矩阵 1. 简单介绍 2. 代码示例 3. 使用说明 4. 结果展示 5. 多多点赞评论哦! 1. 简单介绍 其实以前的博文已经介绍了TCPIP通信的基本方法,但是还 ...

最新文章

  1. (C++)堆排序的3个关键函数
  2. 心学 禅宗_禅宗宣言,用于有效的代码审查
  3. jdk1.8对synchronized锁的优化
  4. C语言中Uint8_t数据类型
  5. 长沙城南学院的计算机科学,长沙理工大学城南学院计算机科学与技术专业2016年在云南理科高考录取最低分数线...
  6. mysql数据库合并游戏合服_浅谈滚服游戏如果实现一键合服
  7. ideal 本地jar依赖_通过 YARN 的资源本地化技术减少 Flink 在 YARN 上的部署时间
  8. 卡巴微软趋势科技等多款流行的反恶意软件产品被曝多个漏洞,可导致提权等后果...
  9. 在vue中使用html表格
  10. osm地图数据 mysql_GIS 地图数据的来源?
  11. A Game of Thrones(8)
  12. bind智能DNS + bindUI管理系统(postgresql + bind dlz)
  13. Matlab在一张图上画多条曲线或分别画
  14. 传统与深度学习遥感变化监测遥感技术路线与方法
  15. Android开发 入门篇(二) - 常用UI控件
  16. matlab中亚像素坐标位置,MATLAB+7.X生物信息工具箱的应用——序列比对(二)
  17. 软件测试思想者 - 高效的测试执行
  18. GitHub 从零开始的保姆级使用教程
  19. 基于javaweb的校园运动会管理系统(java+jsp+servlet+javabean+mysql)
  20. 去中心化与无平台成员:与 Nasheq.eth、Ivan Manchev和Rob Edwards开启 “智能钱包”系列对话!

热门文章

  1. android sdk根目录,Android SDK根目录中的SDK Manager.exe双击打不开,为什么?
  2. tinypng 批量处理插件_分享六款逆天的Excel插件,高效处理数据必备!低调使用...
  3. 【SpringBoot基础知识】如何在springboot中使用多线程
  4. 2020 Oracle JDK下载
  5. Nodejs服务器端处理POST提交的数据_note
  6. chart控件删除最左边点_常见功能测试点的测试用例大全
  7. 文件管理器android开源,寻找优秀的安卓文件管理器 五款文件管理器大评比
  8. matlab std函数_如何利用Matlab进行小波分析
  9. select函数fdwrite用法_NumPy 分段函数
  10. 子进程中获取父进程id_进程全家桶,看这一篇就够了 | 原力计划