linux假造 机和linux体系 (假造 机和linux安装总结)〔linux伪设备〕

泉源 :码农猿星球

Linux 服务器收到网络数据包 ,必要 颠末 哪些处理 惩罚 ,一步步将数据传给应用进程 的呢?应用进程 发送数据包时,Linux 又是怎样 操纵 将数据包发送出去的呢?本日 我们就来聊聊这个话题 。

在预备 好吸取 网络数据包之前 ,Linux必要 做很多 预备 工作,比方 :网络子体系 的初始化、协议栈的注册 、网卡驱动的初始化、启动网卡等等,只有这些都预备 好了之后,才华 真正开始吸取 网络包。

网络协议栈

在先容 Linux收发网络数据包之前,我们先来相识 一下Linux网络协议栈。

国际标准 化构造 订定 了开放式体系 互联通讯 参考模子 (Open System Interconnection Reference Model) ,也就是 OSI 网络模子 ,该模子 重要 有 7 层,分别是应用层、表现 层 、会话层、传输层、网络层、数据链路层以及物理层 。

由于 OSI 模子 太复杂 ,提出的只是存在于概念和理论上的一种模子 ,分层太多,增长 了网络工作的复杂性 ,以是 没有大规模应用。

我们比力 常见是TCP/IP 网络模子 ,Linux 体系 正是按照这套网络模子 来实现网络协议栈的。

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

1、 应用层对应于OSI参考模子 的高层,为用户提供所必要 的各种服务,比方 :FTP 、Telnet、DNS、SMTP等.

linux虚拟机和linux系统(虚拟机和linux安装总结) linux假造
机和linux体系
(假造
机和linux安装总结)〔linux伪设备〕 新闻资讯

2 、 传输层对应于OSI参考模子 的传输层 ,为应用层实体提供端到端的通讯 功能,包管 了数据包的次序 传送及数据的完备 性。该层界说 了两个重要 的协议:传输控制协议(TCP)和用户数据报协议(UDP).

3、 网络层对应于OSI参考模子 的网络层,重要 办理 主机到主机的通讯 题目 。它所包罗 的协议计划 数据包在整个网络上的逻辑传输。注意 重新赋予主机一个IP地点 来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有三个重要 协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP) 。

4 、 网络接口层与OSI参考模子 中的物理层和数据链路层相对应。它负责监督 数据在主机和网络之间的互换 。究竟 上 ,TCP/IP本身 并未界说 该层的协议,而由参加 互连的各网络利用 本身 的物理层和数据链路层协议,然后与TCP/IP的网络接入层举行 毗连 。地点 分析 协议(ARP)工作在此层 ,即OSI参考模子 的数据链路层。

吸取 网络数据包

网络数据包到达网卡后,按照FIFO次序 被存入网卡的吸取 队列,网卡通过 DMA 技能 ,将网络包写入到指定的内存地点 (Ring Buffer)。

Ring Buffer是在网卡驱动程序启动时创建和初始化的,存储的是sk_buff缓冲区的形貌 符(物理地点 和巨细 等) 。

当网络包到达时,从Ring Buffer获取指向的sk_buff形貌 符 ,通过DMA将数据写入该地点 。等sk_buff中的数据交由上层协议栈处理 惩罚 后,Ring Buffer中的形貌 更新为新分配的sk_buff。

接着网卡向 CPU 发起硬件停止 ,当 CPU 收到硬件停止 哀求 后 ,根据停止 注册表,找到注册的停止 处理 惩罚 函数 。

硬件停止 处理 惩罚 函数会做如下的事变 :

1、屏蔽网卡的停止

目标 是克制 CPU被频仍 停止 而无法处理 惩罚 其他任务 ,屏蔽停止 是告诉网卡已经知道内存中有数据了,下次再收到数据包直接写内存就可以了 ,不要再关照 CPU 了。

2、发起软停止 ,规复 刚才屏蔽的停止

linux虚拟机和linux系统(虚拟机和linux安装总结) linux假造
机和linux体系
(假造
机和linux安装总结)〔linux伪设备〕 新闻资讯

内核中的 ksoftirqd 线程收到软停止 后,就会调用相应软停止 的处理 惩罚 函数来轮询处理 惩罚 数据 ,即:从Ring Buffer 中获取一个数据帧,用 sk_buff 表现 ,作为一个网络包交给网络协议栈从下到上举行 逐层处理 惩罚 。

网络协议栈对网络包的处理 惩罚 流程如下:

1 、网络接口层

起首 ,网络接口层查抄 报文的合法 性和精确 性,假如 不合法 或报文校验不精确 则扬弃 ,否则找出上层协议的范例 (IPv4还是 IPv6) ,去掉帧头、帧尾,然后交给上层即网络层处理 惩罚 。

2、网络层

网络层取出IP头,判定 网络包下一步的走向 ,是转发还是 交给上层 。当确认网络包是要发送给本机后,就取出上层协议的范例 (比如 TCP或UDP),去掉IP头,然后交给传输层处理 惩罚 。

3、传输层

传输层取出 TCP 头大概 UDP 头后 ,根据四元组【 源 IP 、源端口、目标 IP、目标 端口 】,找出对应的 Socket,并把数据拷贝到 Socket 的吸取 缓冲区。

4 、应用层

末了 ,应用层程序调用 Socket 接口,将内核的 Socket 吸取 缓冲区的数据拷贝到应用层的缓冲区 。

到这里,一个网络包的吸取 过程就竣事 了。

发送网络数据包

我们相识 了网络包的吸取 流程后 ,就很轻易 明白 网络包的发送流程了。网络包的发送方向,恰好 跟吸取 方向相反 。

起首 ,应用程序调用 Socket 发送网络包的接口。这是一个体系 调用 ,会从用户态陷入到内核态的套接字层中。

套接字层会申请一个内核态的 sk_buff 内存,将用户待发送的数据拷贝到 sk_buff 内存,并将其参加 到Socket发送缓冲区等待 网络协议栈的处理 惩罚 。

由于网络数据包从应用程序传到内核时是原始数据 ,协议栈要在原始数据中参加 通讯 约定才华 包管 数据到达服务端能被精确 辨认 。网络协议栈从 Socket 发送缓冲区中,取出数据包,然后按照 TCP/IP 栈的分层(传输层、网络层、网络接口层),从上到下逐层举行 处理 惩罚 ,各层将协议的头信息不绝 插入到数据包中。

协议栈对发送数据包的处理 惩罚 流程如下:

1 、传输层

在传输层,会为器添加TCP头,同时拷贝一个新的 sk_buff 副本 ,这是由于 sk_buff 在到达网卡发送完成的时间 ,会被开释 掉,而TCP 协议是支持重传的 ,为确保网络包可靠传输,在收到对方的 ACK 之前,这个 sk_buff 不能被删除 。

2、网络层

在网络层 ,重要 会做这些工作:选取路由(确认下一跳的 IP)、添补 IP 头 、netfilter 过滤、对高出 MTU 巨细 的数据包举行 分片。处理 惩罚 完这些工作后会交给网络接口层处理 惩罚 。

3、网络接口层

网络接口层会举行 物理地点 寻址,以找到下一跳的 MAC 地点 ,添补 帧头和帧尾 ,将其放到发送队列中。然后触发软停止 告诉网卡驱动程序:队列中有新的网络包必要 发送 。驱动程序收到关照 会通过 DMA ,从发送包队列中读出网络帧,并通过DMA将数据写入网卡的FIFO发送队列。

4 、网卡装备

网卡装备 从FIFO发送队列中取出数据包,将其发送到网络;当发送完成的时间 ,网卡装备 会触发一个硬停止 来开释 内存,重要 是开释 sk_buff内存和整理 RingBuffer 内存。末了 ,当收到这个 TCP 报文的 ACK 应答时 ,传输层就会开释 原始的 sk_buff 。

至此,一个网络包的发送流程就竣事 了。

END

官方站点:www.linuxprobe.com

Linux下令 大全:www.linuxcool.com

(新群,火热加群中……)