泉源 :码农猿星球
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等.
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、发起软停止 ,规复 刚才屏蔽的停止
内核中的 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
(新群,火热加群中……)