首页 > 系统相关 >从小白到大佬!入门Linux系统收发网络数据包的秘密!

从小白到大佬!入门Linux系统收发网络数据包的秘密!

时间:2023-06-02 12:00:43浏览次数:64  
标签:sk 白到 网络 网卡 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等.

2、传输层 对应于OSI参考模型的传输层,为应用层实体提供端到端的通讯功用,保证了数据包的次第传送及数据的完好性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP).

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

4、网络接口层 与OSI参考模型中的物理层和数据链路层相对应。它担任监视数据在主机和网络之间的交流。事实上,TCP/IP自身并未定义该层的协议,而由参与互连的各网络运用本人的物理层和数据链路层协议,然后与TCP/IP的网络接入层停止衔接。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。

从小白到大佬!入门Linux系统收发网络数据包的秘密!_IP

接纳网络数据包

从小白到大佬!入门Linux系统收发网络数据包的秘密!_IP_02

网络数据包抵达网卡后,依照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。

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


来源: 码农猿星球

标签:sk,白到,网络,网卡,Linux,传输层,数据包,中缀
From: https://blog.51cto.com/atomguo/6401508

相关文章

  • 远程登录Linux服务器
    目录一、所需软件二、软件安装三、Xshell远程连接Linux公网一、所需软件Xshell软件,Xshell是一个强大的安全终端模拟软件,它支持SSH1,SSH2,以及MicrosoftWindows平台的TELNET协议。从国内网搜到的一般是需要付费的版本,可以从国外网址获得free-for-home-school版本。网址:http......
  • Xfpt实现本地与远程Linux端的文件传输
    目录一、所需软件二、软件安装三、文件的远程上传和下载一、所需软件Xftp是一个功能强大的SFTP、FTP文件传输软件。使用了Xftp以后,MSWindows用户能安全地在UNIX/Linux和WindowsPC之间传输文件。网址:https://www.xshell.com/zh/free-for-home-school/我所使用的Linux......
  • linux下查看IP域名端口的网络是否相通命令
     linux查看IP、域名、端口的网络是否相通1.ping#检索当前域名对应的IP地址ping域名#查看IP是否相通pingIP2.tlenet#查看指定IP的端口是否相通,http默认端口为80,https默认端口为443telnetip/域名port3.wget#查看地址是否可以链接wgetip:端口4.nslo......
  • Linux常用命令-unzip命令详解!
    在Linux系统中命令有很多,可进行磁盘管理、文件管理、文件传输、文档编辑等,而且相同功能的命令也有很多,比如解压缩命令,常用的有:tar、gzip、bzip2、zip、unzip、rar、unrar等,本文为大家详细介绍一下unzip命令,一起来看看吧。Linuxunzip命令用于解压缩zip文件。unzip为.zi......
  • Linux环境安装maven
    下载适配Linux的maven安装包:maven官方下载地址:https://maven.apache.org/download.cgi下载二进制tar.gz存档。例如:apache-maven-x.x.x-bin.tar.gz。将下载好的安装包放到linux中的/usr/local/中,具体步骤如下:切换到/usr/local文件夹下:cd/usr/local创建文件夹maven,并......
  • Linux(Ubuntu) 安装 Qt 环境 转载的文章
    Linux(Ubuntu)安装Qt环境 操作系统使用Ubuntu20.01双系统为例,Qt版本为5.12.9再讲解之前,先检查一下以下的有无安装,没有的安装:建议安装有关xcb的库sudoapt-getinstalllibxcb*可以查看QtDoc的详细内容,根据里面的安装所需http://doc.qt.io/qt-5/li......
  • linux docker 创建postgregis
    地址:https://www.cnblogs.com/haolb123/p/16628464.html创建:postgredockerpullpostgres:14.5dockerrun--namepostgres--restart=always-ePOSTGRES_PASSWORD=postgres-p5432:25432-v/docker/postgres-14.5:/var/lib/postgresql/data-dpostgres:14.5dockerexec......
  • linux | CentOS 发送邮件附件
    如图:  配置内容[email protected][email protected]=授权码#在邮箱后台申请setsmtp-auth=login 发送内容:#格式:echo邮件正文mail-s"邮件标题"-a附件地址收件邮箱echohelloword!m......
  • linux上杀死进程命令:kill、pkill、killall杀死进程
    1kill:根据进程号(PID)杀死进程在linux上,一般常用的杀死进程的命令是kill,但是也有缺陷,下面说1、查看指定名称的进程,如下我查看运行python程序的进程pythonaux|greppython2、根据进程号(PID)杀死进程:第二列显示的就是进程号killPID3、强制杀死进程,有些进程可能杀不死,就加个-9参数......
  • Linux 进程管理
    不管在测试的时候、在实际的生产环境中,还是自己的使用过程中,难免会遇到一些进程异常的情况,所以Linux为我们提供了一些工具来查看进程的状态信息。我们可以通过top实时的查看进程的状态,以及系统的一些信息(如CPU、内存信息等),我们还可以通过ps来静态查看当前的进程信息,同时我......