摘要:内核协议栈,这是一个搞网络方面的同志们都必不可少的,必须学习的一个东西,那内核协议栈到底是什么玄乎的东西呢?接下来我会对内核协议栈做一些相关介绍。

1、简介

自从网络诞生以来,咱们的网络协议栈和内核都有着很紧密的关系,Linux内核作为操作系统的心脏,承担着很多的工作,比如最重要的系统内存管理,因为内存的使用是否合理,会直接关系到我们系统的效率如何;除此之外还有软件程序管理、硬件设备管理、以及我们的文件系统管理等部分。它的作用主要就是将我们的应用层的数据传输给硬件,并在底层充当驱动的角色,对系统的各种设备和组件进行寻址等。

总之Linux内核的任务可以有不同的解释,比如从技术层面讲,内核就是沟通硬件和软件的一个中间人角色;而从应用程序的层面来说,应用程序只会和咱们的内核进行交互,而不会直接和硬件进行交互;再者,内核还是一个资源管理的程序,负责将可用的资源分配给我们的系统进程使用;最后,内核就像一个库文件,提供了面向系统的命令,对应用程序来说,就像是普通函数调用一样。

2、内核的体系架构

Linux,是基于Unix操作系统的一种自由、开源的操作系统,遵循GPL协定,有着很多的基本功能,它负责系统的进程、内存、设备驱动程序、文件和网络系统等的管理,也保证了系统的稳定性,它主要由五个部分组成,内核每个部分的组成关系如图1所示:

网络协议栈代码(内核网络协议栈)(1)

图1 内核各部分的关系

如图2的内核架构所示,最上面的是用户空间,是用户应用程序执行的地方,下面则是内核空间,Linux内核就在这一个层面内,在这一层面又可以细分为另外几层,第一个是最上面的系统调用接口层,改层实现了一些基本的功能,比如socket使用的那些接口函数;接下来则是文件子系统和设备模块,这两部分构成了我们Linux中使用的文件系统以及我们的硬件设备访问内核所需要的文件描述符等,然后则是进程控制子系统部分,该部分的功能则主要是负责不同进程间的通信以及我们的调度,最重要的当然就是内存管理部分了;最后则是负责对硬件进行控制的内核部分。

网络协议栈代码(内核网络协议栈)(2)

图2 内核系统架构

在内核系统架构中,我们最重要的几个组件是:系统调用接口、进程管理、内存管理、虚拟文件系统、网络堆栈、设备驱动程序和硬件控制几部分。

(1)系统调用接口:提供了某些机制执行从用户空间到内核的函数调用,这个接口是依赖于体系结构的;

(2)进程管理:重点则是进程的执行,比如进程使用常见的一些操作,fork、exec、kill等,从而实现进程的调度、创建、停止以及进程间的通信等;

(3)内存管理:内存作为操作系统最重要的一个组成部分,而内存如果管理或者使用不规范,则可能让我们的内核效率受到影响,一般让硬件管理虚拟内存,则内存是按照页的方式进行管理的,一般为4K;

(4)虚拟文件系统:Linux中时允许不同的文件系统共存的,比如ext的几个版本,NTFS等等,它们都是通过同一套I/O操作的,而不需要去考虑具体的文件系统格式,除此之外,Linux认为“一切都是文件”,这就包括了普通文件、设备、socket等等,正是基于这两点,才产生了虚拟文件系统层,它是一个内核的中间抽象层,允许不同的文件和设备共存。

(5)网络堆栈:内核中的网络堆栈遵循我们通用的网络协议分分层体系结构,比如我们的IP层、TCP层、socket层等等;

(6)设备驱动程序:Linux内核中很多的代码都是在设备驱动程序中的,它们可以让不同的设备能够正常运行;

(7)依赖体系结构:虽然Linux是开源且独立的结构,但是有的组件却不得不考虑对应的体系结构,才能实现正常的一些操作或者让效率更好,而依赖体系结构就是由此诞生的。

3、内核协议栈

在介绍完了内核的一些相关知识,接下来则是对于内核协议栈的一些介绍。

Linux的内核协议栈,是基于BSD协议栈的,它的接口和协议栈本身的分层结构符合常用规范,它是基于分层的设计思想进行的,区别于理论的七层OSI架构,即我们的TCP/IP协议栈,主要分为:网络接口层、网络层、传输层以及我们的应用层;

(1)网络接口层:它对应于OSI模型中的物理层和数据链路层,是TCP/IP和各种LAN或WAN的接口,它是数据包从一个设备的网络层传输到另外一个设备的网络层的方法,主要有ARP、NDP、L2TP、PPP、Ethernet等等协议类型;

(2)网络层:位于OSI模型的第三层,介于传输层和数据链路层间,它在网络接口层提供相邻两个端点之间的数据帧的传送功能上,进一步的管理网络的数据通信,通过不同的规则将数据从源传递到目的地,中间可能会经过很多个不同的节点,它的目的是实现源和目的端的数据透明传输,比如寻址、路由选择和连接的建立、保持、中断等,从而让传输层在不需要了解具体的网络结构下就可以进行数据传输和交换;主要有IPv4、IPv6、ICMP、ECN、IGMP等不同的协议,最主要的目的是为了传输层服务;

(3)传输层:在OSI中位于第四层,OSI中前三层主要是为了数据通信而存在的,而之后三层则是为了数据处理,是通信子网和资源子网的接口和桥梁,主要是为了提供网络层和会话层间的传输服务,或者说在两个主机进程间的通信提供服务,传输层提供逻辑连接的建立、传输层寻址、数据传输、传输连接释放、流量控制、拥塞控制、多路复用和解复用以及崩溃恢复等等,传输层在给定的链路上通过流量控制、分段和重组等方式来保证数据传输的可靠性,主要有TCP、UDP、SCTP等不同的协议,它的目的是向用户透明的传送报文,并且屏蔽了下层数据通信的细节;

(4)应用层:在OSI中位于第七层,是直接为应用程序提供服务的,作用是在实现多个系统应用进程间通信的同时,我八成一系列业务处理所需的服务,在TCP/IP协议栈中对应于OSI模型的会话层、表示层和应用层,所以需要负责回话管理和数据交换管理,以及协商和建立数据交换的格式,解决各应用程序间在数据格式表示上的差异,还有根本的完成用户希望在网络上完成的各种工作,负责完成网络应用程序和网络操作系统间的联系,应用层为用户提供常见的服务有文件服务、目录服务、文件传输服务等等,对应的协议有DHCP、DNS、FTP、HTTP、SSH等等不同的协议。

那么总的来说,一次完整的数据交互经历的流程大概是这样的,首先用户的应用程序调用write或者read系统调用;然后确认文件描述符;之后会将数据通过文件描述符拷贝到socket buffer中,然后创建TCP片段并计算校验和,之后是添加IP头部,执行IP路由并计算校验和,之后则是添加Ethernet头部,执行ARP,然后是内核告诉我们的网卡我需要发送数据出去了,网卡则会从内存中获取数据并发送出去,发送完再通过中断告诉CPU。

总结

TCP协议又名传输控制协议,是Internet最基本的一项协议,而且TCP/IP提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。那么TCP/IP的好处是什么呢?

(1)TCP/IP协议它不是针对于特定硬件或者操作系统的,是开放且标准的一套,在联合不同的硬件或软件方面有着很好的作用,还能形成各种不同的网络,比如Ethernet、拨号等;

(2)现有的公网IP网络地址是统一分配的,所以每一个TCP/IP设备在网络中都具有自己唯一的标识,而标准化的协议,就能提供很好的可靠性服务;

(3)相对于我们那些专用的网络等,TCP/IP网络由于其通用性,所以在很多时候都能直接嵌入或者替代专用网络的作用,从而进行数据传输;

(4)TCP/IP有着很好的错误恢复机制和低数据开销,并且能够在不中断现有服务的情况下加入网络,与平台的关系不是很密切,可以实现跨平台的通信

当然既然有有点,就会存在缺点的,以下则是关于TCP/IP网络的缺点:

(1)由于TCP/IP协议是四层结构,所以它在一些地方并没有很好的区分开来,比如主机层和网络层,它定义了网络层和数据链路层的接口,但是却没有很好的把物理层单独划分出来,而是放在数据链路层中,而一个好的参考模型将这两层分开是很有必要且合理的;

(2)TCP/IP由于其通用性,所以它在服务、接口和协议上的区分不是很清楚,而一般应该将功能和实现方法区分开来进行使用的,所以TCP/IP对于新技术的指导意义不是很好,不适合其他的协议簇;

原文链接:https://blog.csdn.net/LPAINI520/article/details/105970517

,