一、前言
此篇博客在深入理解了Linux内核任务调度,例如中断处理、softirg、tasklet、wq以及内核线程等机制的基础上,分析和梳理了send和recv过程中TCP/IP协议栈相关的运行任务实体及相互协作的时序分析。
另一方面,在对之进行了一系列的相关原理了解以及源代码分析之后,对其进行了相关的编译、部署以及运行、测评、跟踪调试等相关工作,并在此基础上给出了对应的时序图。
二、Linux系统概述
1.Linux系统简析
Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。
Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
2.Linux系统组成
2.1 Linux内核
内核在计算机科学中是一个用来管理软件发出的数据 I/O(输入与输出)要求的计算机程序,将这些要求转译为数据处理的指令并交由中央处理器(CPU)及计算机中其他电子组件进行处理,是现代操作系统中最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的。所以内核通常提供一种硬件抽象的方法来完成这些操作。通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及 IO 设备)。
2.2 Linux文件系统
文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统。在Linux系统中有一个重要的概念:一切都是文件。 其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。
2.3 shell
shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
2.4 应用程序
很多人的Linux系统上也要装很多应用程序,这些东西组合在一起,就成为一个可以使用的Linux操作系统了,就像下图展示的那样。
三、TCP/IP协议栈详解
1.TCP/IP协议简介
TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。
TCP/IP 不是一个协议,而是一个协议族的统称,里面包括了 IP 协议、ICMP 协议、TCP 协议、以及 http、ftp、pop3、https 协议等。网络中的计算机都采用这套协议族进行互联。
TCP/IP协议完整地包含了一些列构成互联网基础的网络协议。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
TCP/IP协议是Internet最基本的协议,其中应用层的主要协议有Telnet、FTP、SMTP等,是用来接收来自传输层的数据或者按不同应用要求与方式将数据传输至传输层;传输层的主要协议有UDP、TCP,是使用者使用平台和计算机信息网内部数据结合的通道,可以实现数据传输与数据共享;网络层的主要协议有ICMP、IP、IGMP,主要负责网络中数据包的传送等;而网络访问层,也叫网路接口层或数据链路层,主要协议有ARP、RARP,主要功能是提供链路管理错误检测、对不同通信媒介有关信息细节问题进行有效处理等。
2.TCP/IP协议分层
2.1应用层
应用层是模型的最高层,它最简单的解释就是利用传输层的提供了数据传输功能发送自己的数据到对方。传输层协议类型有多种,不同的类型意味着不同的传输速度和可靠性,而二者往往不可兼得。所以每个应用程序选择最合适的传输服务类型,以使双方之间的数据传输达到最佳效果。
2.2传输层
传输层主要是提供应用程序之间的通信服务,这种通信又称为端到端通信。传输层协议把上层(应用层)要传输的数据流分组,把每个分组连同目的地址交给网络层去发送。传输层要系统的管理两端数据的准确交互,要提供可靠的传输服务,以确保数据达到无差错、无乱序。为了达到这个目的,传输层可以采取协商、确然、重发等机制。
2.3网络层
网络层负责在主机之间的通信中选择数据报的传输路径,即路由。
当网络层接受到来自上层(传输层)发来的数据分组后,他会把分组封装在IP数据报中,填入数据报的首部,使用路由算法来确定是直接交付数据报,还是把它传递给路由器,然后把数据报交给适当的网络接口进行传输。
网络层还要负责处理传入的数据报,并检验其有效性,然后判断该数据报是否是给本机的,如果不是,则使用路由算法将数据报发出转发;如果是,网络层需要除去数据报中的数据首部得到数据分组,然后将数据分组递交给上层(传输层)。
2.4网络接口层
这是TCP/IP协议的最底层,主要负责网络上数据帧的接受和发送,数据帧是底层网络传输的基本单元。由于网络接口有不同的实现方式(有线或者是无线),所以数据帧有不同的实现方式(帧结构、发送速率等不同)。网络接口层一方面将上层(网络层)的数据组成自己特定的数据帧结构并发送,一方面接受网络发送给自己的数据帧,解析后交给上层。
整体的逻辑结构如下所示:
3. Linux中的网络协议栈
3.1 Linux网络核心架构
Linux的网络架构从上往下可以分为三层,分别是 :用户空间的应用层。内核空间的网络协议栈层。物理硬件层。其中最重要最核心的是内核空间的协议栈层了。
3.2 Linux网络协议栈结构
Linux的整个网络协议栈都构建与Linux Kernel中,整个栈也是严格按照分层的思想来设计的,整个栈共分为五层,分别是 :
1)系统调用接口层,实质是一个面向用户空间应用程序的接口调用库,向用户空间应用程序提供使用网络服务的接口。
2)协议无关的接口层,就是SOCKET层,这一层的目的是屏蔽底层的不同协议(更准确的来说主要是TCP与UDP,当然还包括RAW IP, SCTP等),以便与系统调用层之间的接口可以简单,统一。简单的说,不管我们应用层使用什么协议,都要通过系统调用接口来建立一个SOCKET,这个SOCKET其实是一个巨大的sock结构,它和下面一层的网络协议层联系起来,屏蔽了不同的网络协议的不同,只把数据部分呈献给应用层(通过系统调用接口来呈献)。
3)网络协议实现层,毫无疑问,这是整个协议栈的核心。这一层主要实现各种网络协议,最主要的当然是IP,ICMP,ARP,RARP,TCP,UDP等。这一层包含了很多设计的技巧与算法,相当的不错。
4)与具体设备无关的驱动接口层,这一层的目的主要是为了统一不同的接口卡的驱动程序与网络协议层的接口,它将各种不同的驱动程序的功能统一抽象为几个特殊的动作,如open,close,init等,这一层可以屏蔽底层不同的驱动程序。
5)驱动程序层,这一层的目的就很简单了,就是建立与硬件的接口层。
可以看到,Linux网络协议栈是一个严格分层的结构,其中的每一层都执行相对独立的功能,结构非常清晰。
四、Socket编程
1.Linux系统简析
五、各层中的send和recv分析
1.应用层
2.传输层
3.网络层
4.网络接口层
六、时序图
七、心得体会
原文:https://www.cnblogs.com/seeker76/p/14350070.html