入门Linux系统收发网络数据包的秘密!

linux 服务器收到网络数据包,需求经过哪些处置,一步步将数据传给应用进程的呢?应用进程发送数据包时,Linux 又是如何操作将数据包发送进来的呢?今天我们就来聊聊这个话题 。
在准备好接纳网络数据包之前,Linux需求做很多准备工作,例如:网络子系统的初始化、协议栈的注册、网卡驱动的初始化、启动网卡等等,只要这些都准备好了之后,才敢真正开端接纳网络包 。
网络协议栈在引见Linux收发网络数据包之前,我们先来理解一下Linux网络协议栈 。
国际规范化组织制定了开放式系统互联通讯参考模型(Open System Interconnection Reference Model),也就是 OSI 网络模型,该模型主要有 7 层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层 。
由于 OSI 模型太复杂,提出的只是存在于概念和理论上的一种模型,分层太多,增加了网络工作的复杂性,所以没有大范围应用 。
我们比拟常见是TCP/IP 网络模型,Linux 系统正是依照这套网络模型来完成网络协议栈的 。
TCP/IP 网络模型共有 4 层,分别是应用层、传输层、网络层和网络接口层,每一层担任的职能如下:
1、应用层 对应于OSI参考模型的高层,为用户提供所需求的各种效劳,例如:FTP、Te.NET、DNS、SMTP等.
2、传输层 对应于OSI参考模型的传输层,为应用层实体提供端到端的通讯功用,保证了数据包的次第传送及数据的完好性 。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP).
3、网络层 对应于OSI参考模型的网络层,主要处理主机到主机的通讯问题 。它所包含的协议设计数据包在整个网络上的逻辑传输 。注重重新赋予主机一个IP地址来完成对主机的寻址,它还担任数据包在多种网络中的路由 。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP) 。
4、网络接口层 与OSI参考模型中的物理层和数据链路层相对应 。它担任监视数据在主机和网络之间的交流 。事实上,TCP/IP自身并未定义该层的协议,而由参与互连的各网络运用本人的物理层和数据链路层协议,然后与TCP/IP的网络接入层停止衔接 。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层 。

入门Linux系统收发网络数据包的秘密!

文章插图
接纳网络数据包
入门Linux系统收发网络数据包的秘密!

文章插图
网络数据包抵达网卡后,依照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 的接纳缓冲区 。


推荐阅读