[架构之路-44]:目标系统 – 系统软件 – Linux下的网络通信-4-Linux内核网络协议栈、网络配置命令、网络服务启动

目录

前言:

第1章 Linux网络概述

1.1 TCP/IP网络协议栈架构

1.2 Linux网络协议栈

1.3 Linux 网络收发流程

1.4 Linux网络用户空间应用程序与Linux内核网络协议栈

第2章 如何通过用户空间命令来配置Linux网络

2.1 IP层命令

2.2 TCP/UDP层相关命令

2.3 应用层相关命令

2.4 它山之石

第3章 配置Linux的网络服务

3.1 Linux 启动、关闭、重启网络服务的两种方式

3.2 显示网络服务

3.3 常见的网络服务


前言:

Linux提供了TCP/IP全套的协议栈的代码实现,但我们还是需要知道:如何配置、使能、监控这些协议栈,使之能够正常工作。

第1章 Linux网络概述

1.1 TCP/IP网络协议栈架构

[架构之路-44]:目标系统 - 系统软件 - Linux下的网络通信-4-Linux内核网络协议栈、网络配置命令、网络服务启动

我们从上到下来看这个网络栈,可以发现:

  • 最上层的应用程序,需要通过系统调用,来跟套接字接口进行交互;
  • 套接字的下面,就是我们前面提到的传输层、网络层和网络接口层;
  • 最底层,则是网卡驱动程序以及物理网卡设备。网卡是发送和接收网络包的基本设备。在系统启动过程中,网卡通过内核中的网卡驱动程序注册到系统中。
  • 网络包的处理非常复杂,网卡驱动程序在网络收发过程中,内核通过中断跟网卡进行交互。网卡硬中断只处理最核心的网卡数据读取或发送,而协议栈中的大部分逻辑,都会放到软中断中处理。

1.2 Linux网络协议栈

在进行网络传输时,数据包就会按照协议栈,对上一层发来的数据进行逐层处理;然后封装上该层的协议头,再发送给下一层。

当然,网络包在每一层的处理逻辑,都取决于各层采用的网络协议。比如在应用层,一个提供 REST API 的应用,可以使用 HTTP 协议,把它需要传输的 JSON 数据封装到 HTTP 协议中,然后向下传递给 TCP 层。

而封装做的事情就很简单了,只是在原来的负载前后,增加固定格式的元数据,原始的负载数据并不会被修改。

比如,以通过 TCP 协议通信的网络包为例,通过下面这张图,我们可以看到,应用程序数据在每个层的封装格式。

[架构之路-44]:目标系统 - 系统软件 - Linux下的网络通信-4-Linux内核网络协议栈、网络配置命令、网络服务启动

1.3 Linux 网络收发流程

(1)网络包的接收流程

  • 当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;
  • 然后通过硬中断,告诉中断处理程序已经收到了网络包。
  • 接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;
  • 然后再通过软中断,通知内核收到了新的网络帧。
  • 接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。
  • 在链路层检查报文的合法性,找出上层协议的类型(比如 IPv4 还是 IPv6),再去掉帧头、帧尾,然后交给网络层。
  • 网络层取出 IP 头,判断网络包下一步的走向,比如是交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。
  • 传输层取出 TCP 头或者 UDP 头后,根据 四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中。
  • 最后,应用程序就可以使用 Socket 接口,读取到新接收到的数据了。

下面这张图的左半部分表示接收流程,而图中的粉色箭头则表示网络包的处理路径。

[架构之路-44]:目标系统 - 系统软件 - Linux下的网络通信-4-Linux内核网络协议栈、网络配置命令、网络服务启动

(2)网络包的发送流程

了解网络包的接收流程后,就很容易理解网络包的发送流程。

网络包的发送流程就是上图的右半部分,很容易发现,网络包的发送方向,正好跟接收方向相反

  • 首先,应用程序调用 Socket API(比如 sendmsg)发送网络包。
  • 由于这是一个系统调用,所以会陷入到内核态的套接字层中。套接字层会把数据包放到 Socket 发送缓冲区中。
  • 接下来,网络协议栈从 Socket 发送缓冲区中,取出数据包;再按照 TCP/IP 栈,从上到下逐层处理。比如,传输层和网络层,分别为其增加 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片。
  • 分片后的网络包,再送到网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。然后添加帧头和帧尾,放到发包队列中。这一切完成后,会有软中断通知驱动程序:发包队列中有新的网络帧需要发送。
  • 最后,驱动程序通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去。

1.4 Linux网络用户空间应用程序与Linux内核网络协议栈

(1)Linux内核空间程序负责:驱动程序(物理层、MAC层)、IP层、TCP/UDP层、Socket接口

(2)Linux用户空间程序负责:应用程序层,如HTTP, SSH。

(3)网络:多台服务器通过网卡、交换机、路由器等网络设备连接到一起,构成了相互连接的网络。

(4)socket接口:应用程序通过套接字接口发送数据包,先要在网络协议栈中从上到下进行逐层处理,最终再送到网卡发送出去。而接收时,同样先经过网络栈从下到上的逐层处理,最终才会送到应用程序。

1.5 Linux网络通信的问题

第2章 如何通过用户空间命令来配置Linux网络

2.1 IP层命令

(1)ifconfig

ifconfig命令用于显示或设置网络设备,来源于 net-tools 工具包

格式:

参数说明:

示例:

(2)ip

ip 命令和 ifconfig 类似,但前者功能更强大,并旨在取代后者。使用 ip 命令,只需一个命令,你就能很轻松地执行一些网络管理任务。ifconfig 是 net-tools 中已被废弃使用的一个命令,许多年前就已经没有维护了。iproute2 套件里提供了许多增强功能的命令,ip 命令即是其中之一。

[架构之路-44]:目标系统 - 系统软件 - Linux下的网络通信-4-Linux内核网络协议栈、网络配置命令、网络服务启动

 示例:

(3)ping

Linux ping 命令用于检测主机,执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。

格式:

参数 含义
-c 设置完成要求回应的次数
-i 指定收发信息的间隔时间
-s 设置数据包的大小
-w 在设定的秒后退出

示例:

(4)route

route 命令用于显示和操作 IP 路由表。

格式:

来源:文火冰糖的硅基工坊

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年9月11日
下一篇 2022年9月11日

相关推荐