您当前的位置: 首页 >  网络

庄小焱

暂无认证

  • 2浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

操作系统——网络系统

庄小焱 发布时间:2021-08-16 23:14:41 ,浏览量:2

摘要

在操作系统中的,网络是操作系统的中啊哟的数据传输通道。也是单个计算机与其他计算机进行的数据交换的重要的手段。所以在操作系统层面大家还是需要了解的基本的网络知识。帮助大家更好的理解系统与系统之间的联系。

一、网络系统模型 1.1 网络系统模型

为了使得多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联中的兼容性问题,国际标准化组织制定了开放式系统互联通信参考模型(pen System Interconnection Reference Model),也就是OSI 网络模型,该模型主要有 7 层,分别是应⽤层、表示层、会话层、传输层、网络层、数据链路层以及物理层。

每⼀层负责的职能都不同,如下:

  • 应⽤层,负责给应⽤程序提供统⼀的接⼝。
  • 表示层,负责把数据转换成兼容另⼀个系统能识别的格式。
  • 会话层,负责建⽴、管理和终⽌表示层实体之间的通信会话。
  • 传输层,负责端到端的数据传输。
  • ⽹络层,负责数据的路由、转发、分⽚。
  • 数据链路层,负责数据的封帧和差错检测,以及 MAC 寻址。
  • 物理层,负责在物理⽹络中传输数据帧。

由于OSI模型实在太复杂,提出的也只是概念理论上的分层,并没有提供具体的实现方案。事实上,我们比较常见,比较实⽤的是四层模型,即 TCP/IP ⽹络模型,Linux 系统正是按照这套⽹络模型来实现⽹络协议栈的。

TCP/IP⽹络模型共有4层,分别是应⽤层、传输层、⽹络层和网络接口层,每⼀层负责的职能如下:

  • 应用层,负责向⽤户提供⼀组应⽤程序,比如 HTTP、DNS、FTP 等。
  • 传输层,负责端到端的通信,比如 TCP、UDP 等。
  • 网络层,负责网络包的封装、分发、路由、转发,比如IP、ICMP 等。
  • 网络接口层,负责网络包在物理⽹络中的传输,⽐如⽹络包的封帧、 MAC 寻址、差错检测,以及通 过网卡传输网络帧等。

1.2、Linux 网络协议栈

TCP 协议通信的⽹络包发出去的时候,会把应⽤层的数据按照网络协议栈层层封装和处理应⽤层数据在每⼀层的封装格式。

其中:

  • 传输层,给应⽤数据前⾯增加了 TCP 头;
  • 网络层,给TCP数据包前⾯增加了IP头;
  • 网络接口层,给IP数据包前后分别增加了帧头和帧尾;

这些新增和头部和尾部,都有各⾃的作⽤,也都是按照特定的协议格式填充,这每⼀层都增加了各⾃的协议头,那⾃然网络包的⼤⼩就增⼤了,但物理链路并不能传输任意大小的数据包,所以在以太网中,规定 了最⼤传输单元(MTU)是 1500 字节,也就是规定了单次传输的最⼤IP包大小。

当网络包超过MTU的大小,就会在网络层分片,以确保分片后的IP包不会超过MTU大小,如果 MTU越小,需要的分包就越多,那么网络吞吐能⼒就越差,相反的,如果 MTU 越⼤,需要的分包就越小,那么网络吞吐能力就越好。

  • 应⽤程序需要通过系统调⽤,来跟Socket层进⾏数据交互;
  • Socket 层的下⾯就是传输层、⽹络层和网络接口层;
  • 最下面的⼀层,则是网卡驱动程序和硬件网卡设备;
1.3、Linux 接收网络包的流程

网卡是计算机⾥的⼀个硬件,专⻔负责接收和发送⽹络包,当⽹卡接收到⼀个⽹络包后,会通过 DMA 技 术,将⽹络包放⼊到 Ring Buffer,这个是⼀个环形缓冲区。

最简单的⼀种⽅式就是触发中断,也就是每当⽹卡收到⼀个⽹络包,就触发⼀个中断告诉操作系统。

但是,这存在⼀个问题,在⾼性能⽹络场景下,⽹络包的数量会⾮常多,那么就会触发⾮常多的中断,要 知道当 CPU 收到了中断,就会停下⼿⾥的事情,而去处理这些⽹络包,处理完毕后,才会回去继续其他 事情,那么频繁地触发中断,则会导致CPU⼀直没玩没了的处理中断,⽽导致其他任务可能⽆法继续前 进,从⽽影响系统的整体效率。

所以为了解决频繁中断带来的性能开销,Linux 内核在 2.6 版本中引⼊了NAPI 机制,它是混合中断和轮询的⽅式来接收⽹络包,它的核⼼概念就是不采⽤中断的⽅式读取数据,⽽是⾸先采⽤中断唤醒数据接 收的服务程序,然后 poll 的⽅法来轮询数据

⽐如,当有⽹络包到达时,⽹卡发起硬件中断,于是会执⾏⽹卡硬件中断处理函数,中断处理函数处理完 需要暂时屏蔽中断,然后唤醒软中断来轮询处理数据,直到没有新数据时才恢复中断,这样⼀次 中断处理多个⽹络包,于是就可以降低⽹卡中断带来的性能开销

那软中断是怎么处理⽹络包的呢?它会从 Ring Buffer 中拷⻉数据到内核 struct sk_buff 缓冲区中,从⽽可以作为⼀个⽹络包交给⽹络协议栈进⾏逐层处理。

⾸先,会先进⼊到网络接口,在这⼀层会检查报⽂的合法性,如果不合法则丢弃,合法则会找出该网络包的上层协议的类型,比如是 IPv4,还是 IPv6,接着再去掉帧头和帧尾,然后交给网络层。 到了网络层,则取出 IP 包,判断网络包下⼀步的⾛向,⽐如是交给上层处理还是转发出去。当确认这个⽹ 络包要发送给本机后,就会从IP头⾥看看上⼀层协议的类型是 TCP 还是 UDP,接着去掉 IP 头,然后交 给传输层。 传输层取出 TCP 头或 UDP 头,根据四元组源 IP、源端⼝、⽬的 IP、⽬的端⼝作为标识,找出对应的Socket,并把数据拷⻉到Socket 的接收缓冲区。 最后,应⽤层程序调用Socket 接⼝,从内核的 Socket 接收缓冲区读取新到来的数据到应⽤层。 

二、I/O 多路复用:select/poll/epoll

博文参考
关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.0459s