首页 > 系统相关 >linux 内核五大模块:网络通信

linux 内核五大模块:网络通信

时间:2023-10-09 12:55:24浏览次数:48  
标签:网络通信 IP 网络 TCP 网卡 内核 linux 传输层 应用层

网络通信

网络通信是一种把不同计算机或网络设备连接到一起的技术,本质上是跨系统的进程间通信,必须要通过网络(硬件)才能进行。随着高并发、分布式、云计算、微服务等技术的普及,网络的性能也变得越来越重要。

一、网络模型


1.1 OSI模型
为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,OSI 模型把网络互联的框架分为应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层等七层,每个层负责不同的功能。其中,

  1. 应用层,负责为应用程序提供统一的接口。
  2. 表示层,负责把数据转换成兼容接收系统的格式。
  3. 会话层,负责维护计算机之间的通信连接。
  4. 传输层,负责为数据加上传输表头,形成数据包。
  5. 网络层,负责数据的路由和转发。
  6. 数据链路层,负责 MAC 寻址、错误侦测和改错。
  7. 物理层,负责在物理网络中传输数据帧。
    1.2 TCP/IP 模型
    TCP/IP 模型把网络互联的框架分为应用层、传输层、网络层、网络接口层等四层,其中,
  8. 应用层,负责向用户提供一组应用程序,比如 HTTP、FTP、DNS 等。
  9. 传输层,负责端到端的通信,比如 TCP、UDP 等。
  10. 网络层,负责网络包的封装、寻址和路由,比如 IP、ICMP 等。
  11. 网络接口层,负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等。

虽说 Linux 实际按照 TCP/IP 模型,实现了网络协议栈,但在平时的学习交流中,我们习惯上还是用 OSI 七层模型来描述。比如,说到七层和四层负载均衡,对应的分别是 OSI 模型中的应用层和传输层(而它们对应到 TCP/IP 模型中,实际上是四层和三层)。

二、linux 网络栈

2.1 基础知识

TCP/IP 模型中,需要进行网络传输时,数据包就会按照协议栈,对上一层发来的数据进行逐层处理;然后封装上该层的协议头,再发送给下一层。
当然,网络包在每一层的处理逻辑,都取决于各层采用的网络协议。比如在应用层,一个提供 REST API 的应用,可以使用 HTTP 协议,把它需要传输的 JSON 数据封装到 HTTP 协议中,然后向下传递给 TCP 层。
而封装做的事情就很简单了,只是在原来的负载前后,增加固定格式的元数据,原始的负载数据并不会被修改。
比如,以通过 TCP 协议通信的网络包为例,通过下面这张图,我们可以看到,应用程序数据在每个层的封装格式。

其中:

  1. 传输层在应用程序数据前面增加了 TCP 头;
  2. 网络层在 TCP 数据包前增加了 IP 头;
  3. 而网络接口层,又在 IP 数据包前后分别增加了帧头和帧尾。
    这些新增的头部和尾部,都按照特定的协议格式填充,想了解具体格式,你可以查看协议的文档。

这些新增的头部和尾部,增加了网络包的大小,但我们都知道,物理链路中并不能传输任意大小的数据包。网络接口配置的最大传输单元(MTU),就规定了最大的 IP 包大小。在我们最常用的以太网中,MTU 默认值是 1500(这也是 Linux 的默认值)。

一旦网络包超过 MTU 的大小,就会在网络层分片,以保证分片后的 IP 包不大于 MTU 值。显然,MTU 越大,需要的分包也就越少,自然,网络吞吐能力就越好。

理解了 TCP/IP 网络模型和网络包的封装原理后,你很容易能想到,Linux 内核中的网络栈,其实也类似于 TCP/IP 的四层结构。如下图所示,就是 Linux 通用 IP 网络栈的示意图:

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

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

套接字(socket) = IP + 端口号。IP是网络层协议报头包含的字段,标识着网络传输时应该将数据传输给哪个主机。端口号是传输层协议报头包含的字段,对应着传输层报文中的数据应该交付给主机上哪个进程。然后该进程收到传输层的数据后,根据应用层协议将应用层报文中的提取数据。

2.2 UDP

2.3 TCP

资料:
https://zhuanlan.zhihu.com/p/634994085
https://www.cnblogs.com/linguoguo/p/16248620.html
https://blog.csdn.net/i777777777777777/article/details/130086733

标签:网络通信,IP,网络,TCP,网卡,内核,linux,传输层,应用层
From: https://www.cnblogs.com/xiaohaigegede/p/17751458.html

相关文章

  • 【2023年10月09日】STF61_LINUX_SHELL
     STF61_LINUX_SHELL(上午)1. 什么是shell?shell就是一个用C语言编写的程序,是用户使用linux的桥梁。shell既是一种命令语言,也是一种程序设计语言2. 什么是shellscript?利用shell的功能所写的一个“程序”,这个程序是使用纯文本文档,将一些shell的语法与命令写在命令。搭......
  • Linux中使用虚拟路由器进行不同命名空间之间的通信测试
    一个学习研究的案例ipnetnsaddns1#创建命名空间ns1ipnetnsaddns2#创建命名空间ns2创建虚拟路由器设备ipnetnsaddrouter#创建虚拟路由器命名空间iplinkaddveth1typevethpeernameveth1-router......
  • 成功解决WARNING: You do not appear to have an NVIDIA GPU supported by the 430.34
     https://blog.csdn.net/qq_41185868/article/details/97521492?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169682165516800215061872%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=169682165516800215061872&......
  • STF61_LINUX_SHELL(上午)
     STF61_LINUX_SHELL(上午)1. 什么是shell?shell就是一个用C语言编写的程序,是用户使用linux的桥梁。shell既是一种命令语言,也是一种程序设计语言2. 什么是shellscript?利用shell的功能所写的一个“程序”,这个程序是使用纯文本文档,将一些shell的语法与命令写在命令。搭......
  • Linux网盘程序——服务器端(完整注释版)
    服务器 #include<cstdio>//C++标准库的头文件 #include<unistd.h>//Unix标准头文件 #include<sys/types.h>//这个头文件定义了各种系统相关的数据类型 #include<sys/socket.h>//这个头文件用于网络编程,包含了与套接字(socket)相关的函数和数据结构的声明 #include<arpa/in......
  • Linux网盘程序——客户端(完整注释版)
    客户端#include<cstdio>//C++标准库的头文件#include<unistd.h>//Unix标准头文件#include<arpa/inet.h>//通常用于处理IP地址和套接字地址的转换#include<string.h>//字符串头文件#include<stdlib.h>//包含了一些标准库函数,用于内存分配、释放以及其他一些通用的实用功能#in......
  • linux如何查看操作系统版本信息
    linux查看版本信息,命令更全面。一、linux下如何查看已安装的centos版本信息:1.Linux查看当前操作系统版本信息 cat/proc/versionLinuxversion2.6.32-696.el6.x86_64([email protected])(gccversion4.4.720120313(RedHat4.4.7-18)(GCC))#1SMPTueMa......
  • Linux Bridge与veth
    创建一对veth(VirtualEthernet)接口,并将它们连接到不同的网络命名空间,然后通过LinuxBridge相连#创建第一个veth对ipnetnsaddns1#创建命名空间ns1ipnetnsexecns1iplinksetloup#在ns1中启用loopback接口iplinkaddveth1typevethpe......
  • Linux------微内核和宏内核以及混合型内核
    宏内核(MonolithicKernel)单一内核,宏内核将大多数操作系统功能集成在一个单一的内核中。性能:由于所有的功能都在内核空间运行,所以宏内核通常具有较高的性能,因为它可以直接访问内核数据结构和函数复杂性:宏内核的复杂性较高,容易导致内核变的庞大和难以维护。Linux......
  • Linux Centos7 安装Docker环境
    一、Docker介绍Docker是一个开源的容器引擎,基于Go语言开发,同时基于Apache2.0协议开发。对Docker简单的理解就是使用Docker可以把一台服务器隔离成一个个独立的容器,我们可以把这地方描述的容器理解成一个沙盒。在每个容器中运行一个程序,不同的容器之间相互隔离,容器的创建,停止,以及......