泉源:码农猿星球
Linux服务器收到网络数据包,必要颠末哪些处理惩罚,一步步将数据传给应用进程的呢?应用进程发送数据包时,Linux又是怎样操纵将数据包发送出去的呢?本日我们就来聊聊这个话题。
在预备好吸取网络数据包之前,Linux必要做很多预备工作,比方:网络子体系的初始化、协议栈的注册、网卡驱动的初始化、启动网卡等等,只有这些都预备好了之后,才华真正开始吸取网络包。
网络协议栈
在先容Linux收发网络数据包之前,我们先来相识一下Linux网络协议栈。
国际标准化构造订定了开放式体系互联通讯参考模子(OpenSystemInterconnectionReferenceModel),也就是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技能,将网络包写入到指定的内存地点(RingBuffer)。
RingBuffer是在网卡驱动程序启动时创建和初始化的,存储的是sk_buff缓冲区的形貌符(物理地点和巨细等)。
当网络包到达时,从RingBuffer获取指向的sk_buff形貌符,通过DMA将数据写入该地点。等sk_buff中的数据交由上层协议栈处理惩罚后,RingBuffer中的形貌更新为新分配的sk_buff。
接着网卡向CPU发起硬件停止,当CPU收到硬件停止哀求后,根据停止注册表,找到注册的停止处理惩罚函数。
硬件停止处理惩罚函数会做如下的事变:
1、屏蔽网卡的停止
目标是克制CPU被频仍停止而无法处理惩罚其他任务,屏蔽停止是告诉网卡已经知道内存中有数据了,下次再收到数据包直接写内存就可以了,不要再关照CPU了。
2、发起软停止,规复刚才屏蔽的停止
内核中的ksoftirqd线程收到软停止后,就会调用相应软停止的处理惩罚函数来轮询处理惩罚数据,即:从RingBuffer中获取一个数据帧,用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
(新群,火热加群中……)
我要评论