Taogen's Blog

Stay hungry stay foolish.

本文主要探究计算机网络的应用层,我们先介绍应用层的基本概念,然后逐一的介绍常见的应用层协议。

应用层的基本概念

应用层是网络协议栈中最上的一层,也是网络通信的第一层,它提供了让两个终端设备进行信息交换的服务。它定义了信息交换的格式,然后把定义好的信息交给它下面一层的传输层去传输。

应用层是由应用层的硬件和软件组成。硬件主要是终端设备,如手机、个人电脑、服务器等。软件主要是应用层网络协议,如 HTTP、DNS 等。应用层协议是给应用程序提供网络通信的基础,一个终端设备中应用程序通过应用层协议发送网络请求,另一个终端设备接收到请求,并通过应用层协议响应请求。其中,发送请求的一端称为客户端,响应请求的一端称为服务端。

网络通信实际上是两个终端设备上的应用程序进行通信,操作系统中一个运行的应用程序称为进程,网络通信也称为进程通信

开发一个网络应用程序,首先,我们需要根据需求选择一个网络应用架构,常见的架构有 CS 架构(Client-Server Architecture)和 P2P 架构 (Peer-to-Peer Architecture)。然后选择一个合适的应用层协议,如 HTTP,FTP等。

  • CS 架构。它有一个一直开启、一直提供服务的主机,称为服务器,其它请求它的主机称为客户机。它的主要特点:客户端之间不直接进行通信,服务器有一个固定的 IP 地址,所有的通信都是在客户端与服务器之间进行。常见的 CS 架构应用有:Web 应用,文件传输,远程登录,和 电子邮件等。

  • P2P 架构。任何两个主机直接可以直接进行通信,这一对主机称为 Peers。提供服务的称为服务器,请求服务的称为客户机。任何一台主机既可以作为服务端,又可以作为客户端。常见的 P2P 架构应用有:文件分享应用,对等下载加速应用迅雷,和网络电话视频应用如 Skype。

  • 混合架构,应用程序既使用 CS 架构,也使用 P2P 架构。如即时消息软件中,服务器用于记录用户的IP地址和相关信息,用户与用户之间直接进行通信。

不同的架构采用了不同的应用层协议,不同的应用层协议使用不同的传输层协议提供的传输服务。下面列举了一些常见的应用采用的网络架构和网络协议。

应用 应用架构 应用层协议 底层传输层协议
电子邮件 CS SMTP TCP
远程终端登录 CS Telnet TCP
Web CS HTTP TCP
文件传输 CS FTP TCP
流媒体 CS HTTP TCP
网络电话视频 P2P SIP, RTP, or Proprietary UDP or TCP
文件分享 P2P BitTorrent TCP

通过这个小节,我们了解了应用层的基本概念,对应用层有了一个大致的了解。接下来,我们将介绍一些常见的应用层协议。

Web 应用和 HTTP 协议


介绍 HTTP

介绍 HTTP 之前,我们先了解一下 World Wide Web 也称 Web。它是世界上使用最广泛的网络应用之一。它是一个信息系统,它提供文件和其它 web 资源的访问服务,所有的资源文件通过 URL(Uniform Resource Locator)来定位。在浏览器输入一个网站的 URL 就可以访问这个网站的资源文件。Web 应用采用的是 CS 架构和 HTTP 协议。

HTTP 协议(HyperText Transfer Protocol),它定义了网络通信中消息的结构,以及客户端和服务端如何交换消息,消息可以称为 HTTP 报文(HTTP Message)。HTTP 网络通信由客户端应用程序和服务端应用程序构成,客户端应用程序为 Web 浏览器,服务端应用程序为 Web 服务器。HTTP 通信的过程是:浏览器通过 URL 指定要访问的资源,然后发送 HTTP 请求给服务器,服务器收到请求后,响应 HTTP 请求。浏览器收到的服务器的响应信息后,渲染该资源文件。

HTTP 报文格式

HTTP 请求报文格式

(Request Line) method URL Version
(Header Lines) header_field_name: value
header_field_name: value
...
(Entity Body) ...

例子

GET /somedir/page.html HTTP/1.1
HOST: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: en
(data data ...)

字段说明:

请求行(Request Line)中定义了 HTTP 请求的关键参数。其中 Method 字段表示请求的方式,常用的请求方式为GET,POST。URL 字段用来定位资源,Version 字段用来说明当前使用的协议版本。

头部行(Header Lines)中定义了可选的参数,用来辅助 HTTP 请求。

数据域(Entity Body) 用来传输数据。

HTTP 响应报文格式

(Status Line)  version status_code phrase
(Header Lines) header_field_name: value
header_field_name: value
...
(Entity Body) ...

例子

HTTP/1.1 200 OK
Connection: close
Date: Wed, 12 Aug 2019 12:00:01 GMT
Server: Apache/2.2.3
Last-Modified: Wed, 12 Aug 2019 9:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data ...)

字段说明:

状态行(Status Line)定义了响应报文的关键参数。其中 Version 用来说明当前使用的协议版本,Status Code 表示请求结果的状态码,phrase 为状态码的说明。

头部行(Header Lines)中定义了可选的参数,用来辅助 HTTP 响应。

数据域(Entity Body) 用来传输数据。响应的数据一般是 HTML 文本,或者 JSON 文本。

常见的状态码

  • 200 OK:请求成功。
  • 301 Moved Permanently:资源位置永久移动,请求会自动重定向到资源新的 URL。
  • 400 Bad Request:错误的请求。
  • 404 Not Found:请求的资源不存在服务器中。
  • 505 HTTP Version Not Supported:HTTP 协议版本不支持。

HTTP 服务器是无状态的,这个设计简化了服务器,允许开发者开发一个高性能的 Web 服务器,服务器可以同时处理上千的 TCP 连接。但是一个网站往往想要区分用户,这样可以限制用户的接入权限,以及记录用户的行为等。为了达到这个目的,HTTP 可以使用 cookie 来追踪用户。

Cookie 是 HTTP 报文中头部中的一个属性,使用 Cookie 由四个部分组成:

  • HTTP 响应报文的头部 (header lines)字段 Set-Cookie 设置 cookie 。
  • HTTP 请求报文的头部字段 Cookie 携带用户的 cookie。
  • 一个 Cookie 文件保存在用户终端,由浏览器管理。
  • 后端数据库保存用户 Cookie。

浏览器每次请求都会携带 Cookie 发送给服务器,服务器可以根据 Cookie 来追踪用户的行为,分析数据,从而优化网站的功能。

Web Cache

Web 缓存服务器 (Web Cache)也称代理服务器,Web Cache 可以缓存静态资源在本地,而不用请求 Web 服务器。

一个机构或公司使用局域网 Web 缓存服务器,可以减少客户端 HTTP 请求的响应时间,也可以减少机构接入网络的带宽。

DNS 协议


介绍 DNS

网络中服务器是通过 IP 地址来识别的, IP 地址是由4个十进制的数字组成如121.7.106.83,这样的地址不方便记忆。DNS (Domain Name System)可以为 Web 服务器提供一个有字母和数字组成的域名 ,如 google.com。

DNS 是一个实现在多个 DNS 服务器的分布式数据库。一个应用层协议允许去查询分布式数据库。它提供了将域名转换为 IP 地址的服务。

浏览器通过服务器的域名获取 IP 地址的过程

  • 查询本地缓存。浏览器先检查浏览器本地缓存中是否有该域名,如果没有,检查电脑的 DNS 缓存中是否有该域名。
  • 查询 DNS 服务器。如果本地缓存没有找到,浏览器通过发送 DNS 查询请求给 DNS 服务器,DNS 接收到请求,返回该域名的 IP 地址。浏览器获得该网站的 IP 地址。(为了便于理解,这里简化了对 DNS 服务器的访问,实际会请求多个 DNS 服务器,下面会详细说明)

为什么浏览器知道了域名,还需要 Web 服务器的 IP 地址?

浏览器是客户端进程,Web 服务器是服务端的一个进程,在操作系统中进程之间的通信是通过 Socket 完成,每个进程都有唯一对应的 Socket,Socket 连接应用层和传输层桥梁。因为 Socket 通信需要的是 IP 地址建立 TCP 连接,所以浏览器需要知道 Web 服务器的 IP 地址。不过查询 IP 地址的过程,是自动地快速地进行的,用户是无感的。

DNS 提供地服务

  • Web 服务器别名。
  • 邮件服务器别名。
  • 负载分配。一个域名关联一组 IP 地址,多个服务器依次处理 HTTP 请求,从而减少了单个服务器的压力。

DNS 层级结构

DNS 服务器是分布在世界各地的,是有层级关系的。三层结构如下:

  • 第一层:根 DNS 服务器 (Root DNS Servers)管理下一层顶级域名 DNS 服务器的地址。

  • 第二层:顶级域名 DNS 服务器(Top-Level Domain (TLD) DNS Servers)管理下一层权威域名 DNS 服务器的地址。一般的顶级域名如 .com、 .edu、 .gov、 .net等。

  • 第三层:权威域名服务器 (authoritative DNS servers)记录了组织机构、公司的所有域名对应的 IP 地址。如 *.baidu.com(www.baidu.com, baike.baidu.com, news.baidu.com)

通过循环查询 DNS 服务器,得到一个域名对应的 IP 地址的过程, 如 cs.umass.edu

  • 客户端请求 <本地 DNS 服务器>,本地 DNS 服务器检查缓存中是否有 cs.umass.edu 对应的 IP 地址。如果有就返回,没有就进行到下一步。
  • 本地 DNS 服务器请求<根 DNS 服务器>,查询 edu 顶级域名服务器 IP 地址。
  • 本地 DNS 服务器请求<顶级域名 DNS 服务器>,查询 umass.edu 的权威域名服务器的 IP 地址。
  • 本地 DNS 服务器请求<权威域名服务器>,查询 cs.umass.edu 对应的 IP 地址。
  • 本地 DNS 服务器最终得到了cs.umass.edu 的 IP 地址,并返回给客户端。

DNS 记录

DNS 分布式数据存储的是 Resource Records (RRs)

一个记录有四个字段(Name, Value, Type, TTL)

TTL 表示域名在 本地 DNS 服务器缓存的时间。

不同的类型表示不同的功能,常见的类型有:

Type=A,表示域名映射到 IP 地址。如(bar.foo.com, 145.37.93.126, A)

Type=CNAME, 表示权威域名的别名。如(foo.com, www.foo.com, CNAME)

Type=MX,表示权威域名的邮箱服务别名。如(foo.com, mail.foo.com, MX)

Type=NS,表示域名进一步查询地址。如(foo.com, dns.foo.com, NS)

DNS 报文

DNS 的请求报文和响应报文格式是一致的,由于用的比较少,具体细节,这里不详细展开,有兴趣的朋友可以去查阅相应资料。

CDN 内容分发网络

网络视频需要消耗大量的网络带宽,很多网络视频公司会选择 CDN (Content Distribution Network)服务,来优化用户的体验。

一个 CDN 网络管理很多分布在世界各地的服务器,在每个服务器上复制了视频和其它资源文件的副本,用户请求 CDN,然后 CDN 提供一个离用户客户端距离较近的服务器同响应客户端请求,从而给用户更快更好的网络体验。CDN 的实现是利用了 DNS 拦截和重定向请求功能。

不使用 CDN 可能会出现的问题

  • 每个客户端都请求同一个地区的服务器(数据中心),服务器的带宽是一定的,请求太多造成客户端得到的资源吞吐量下降,会导致视频卡顿。
  • 一个流行的视频会在同一个通信链路上多次传输,浪费网络带宽。
  • 一个数据中心容易出现单点故障,导致整个服务不可用。

CDN 使用的过程

  • 用户访问一个视频的链接,如 http://video.netcinema.com/6Y7B23V
  • 浏览器查询客户端本地缓存是否存在该域名的 IP 地址。如果没有,继续下一步查询。
  • 浏览器请求本地 DNS 服务器,查询 video.netcinema.com 域名的 IP 地址。本地 DNS 服务器检查本地缓存是否存在该域名,不存在,则请求权威 DNS 服务器,查询 video.netcinema.com 的 IP 地址。权威 DNS 服务器发现是 video 开头的域名,则返回 CDN 提供商的权威域名如 a105.kingcdn.com。
  • 本地 DNS 服务器请求权威域名服务器,查询 a105.kingcdn.com 的 IP 地址,CDN 提供商根据客户端的地理位置,最终返回 CDN 系统中的一个 web 服务器 IP 地址。
  • 本地 DNS 服务器把 IP 地址返回给浏览器。
  • 浏览器通过 IP 地址与服务器建立 TCP 连接,发送视频访问请求。web 服务器返回视频内容给浏览器。

CDN 是如何让客户端访问离自己最近的一个服务器

方法一

使用 DNS 服务器响应一个离用户最近的服务器的 IP 地址。DNS 服务器通过查询 IP 位置数据库,获取客户端所在的城市。根据客户端所在的城市选一个最近的一个服务器的 IP 地址返回给客户端。

方法二

使用任播(Anycast)路由选择一个最近的服务器。CDN 分布世界各地的所有 Web 服务器使用同一个 IP 地址。路由器根据最少花费(Lowest Cost)的路由规则,选择一个离客户端最近的服务器。

References

[1] Computer Networking: A Top-Down Approach, by Jim Kurose

[2] World Wide Web - Wikipedia

[3] DNS Explained - How Your Browser Finds Websites

[4] How does Akamai CDN use DNS to allocate closest edge server to client? - Quora

本文主要是为了让大家了解计算机网络,介绍了网络的基本概念,没有涉及具体的网络协议和网络通信的细节。计算机网络概念和专有名词非常多,为了便于理解,我会尽量用一些简单的语言去描述和解释它们。

什么是因特网


因特网的定义

因特网(Internet)是当今世界广泛使用的计算机网络,也称为互联网。它由一系列硬件和软件组成。它为世界各地的网络应用提供服务。

计算机网络(Computer Network)是一个抽象的概念,它定义了网络的逻辑结构。而因特网是一个具体的网络,是一个客观存在的事物。计算机网络,因特网,互联网等词经常相互使用,容易混淆,本文介绍的网络概念统一使用因特网。

因特网的结构

因特网是一个连接着分布在世界各地的亿万个计算设备的计算机网络。这些计算设备有个人电脑,智能手机,平板电脑,电视,手表,汽车等等。在因特网中这些设备称为主机(Host)或者终端(End Systems)。因特网的基本结构如下图所示

从上图可以看出因特网的构成十分复杂,它连接着许许多多的设备。我们可以简单将因特网划分为两种类型,一个是网络的核心,一个是网络的边缘。

网络的核心主要是由许多互相连接的路由器(Router)组成,它构成了网络的骨架,用于网络信息的传输。而网络的边缘主要是由一个调制解调器(Modem)俗称为猫、一个或多个路由器、交换机(Link-layer switch)和许多终端设备连接在一起,它们构成了一个局域网。其中调制解调器负责连接上因特网,路由器和交换机是用来组建和扩展局域网。局域网中连接着调制解调器的路由器连上了网络,其它连接到这个路由器的设备都可以上网。网络的边缘主要是组建局域网,让局域网内的终端设备可以连接网络。

网络按规模大小可以进行如下分类:

  • 局域网 (Local Area Networks, LAN),如一个家庭,一个公司,一个学校的网络都可以看作是一个局域网。
  • 城域网(Metropolitan Area Network, MAN),一个城市范围内所建立的网络。
  • 广域网(Wide Area Network, WAN),一个国家或一个洲范围内所建立的网络。

通过本小节,你已经大致了解了什么是因特网,为了更加深入的了解因特网的组成结构和它是如何工作的,我们接下来会进一步地讲诉这些内容,以及常见的网络安全问题。

因特网组成

上面已经提到因特网是由一些列硬件和软件组件构成。硬件部分主要有:连接网络的物理媒介、网络设备、和终端设备。软件部分表示的就是网络协议。网络协议规定了网络信息的格式和信息传播的规则。

网路硬件

网络设备:路由器,交换机,调制解调器,手机信号塔等。

终端设备:个人电脑,智能手机,平板电脑,服务器等。

网络连接的物理媒介:

  • 有线传输
    • 双绞线 (Twisted-Pair Copper Wire)。最早用在固定电话网络。 现在常用于局域网的网络接入。它可提供高达10G比特每秒的网络传播速度。
    • 同轴电缆(Coaxial Cable)。常用于有线电视系统,最近有线电视系统也可以提供数十M比特每秒的网络接入。
    • 光纤(Fiber Optics)。它具有很高的传播速度,高达数100G比特每秒。也有很低的信号衰减和抗干扰能力,适合长距离信号传播。如今的因特网的骨架一般都是用光纤去组建。
  • 无线传输
    • 地面无线电波(Terrestrial Radio Channels)
    • 卫星无线电波(Satellite Radio Channels)

网络协议

为了理解网络协议,我们先要知道网络协议是什么?以及它的结构是怎样的?

网络协议是一个网络系统的规则,允许两个或多个终端去交流信息,无论它们采用什么物理媒介进行通信。它定义了传播的信息的数据格式,以及信息传播的规则。因特网有中应用了很多协议,一个协议可能由软件实现,硬件实现,或者软件硬件结合实现。

因特网是一个十分庞大和复杂的系统,一个复杂的系统要高效有序的工作,需要合理的组织它的结构。因特网的协议使用分层结构,每一层执行具体的任务,提供相应的服务,上一层可以使用下一层提供的功能服务。分层的好处就是可以轻松的改变某一个协议的实现,只要它提供相同的服务给上一层,和使用下一层提供相同的服务,当一个协议的实现发生改变,整个系统其它的部分不需要改变。对于大型的复杂的系统,它是需要持续不断的更新的,而分层结构有利与系统的持续更新,所以分层十分有必要的。

OSI 参考模型

在 1970s,国际标准化组织(International Organization for Standardization,ISO)提出网络分为七层称为,开放系统互联模型(Open Systems Interconnection,OSI) 。这七层分别为:应用层、表现层、会话层、传输层、网络层、数据链路层、物理层。其中五层和五层协议名称和功能相同,其它两个表现层和会话层是五层协议没有的。这两层的含义如下:

  • 表现层(Presentation Layer)。提供翻译和转换应用层的数据的服务,它包括数据的压缩,加密,数据描述。这一层存在是因为考虑到不同的电脑的数据表示和存储的格式可能不同,需要进行格式转换。
  • 会话层(Session Layer)。提供对数据交换的限定和同步服务。它包括构建一个检查点和恢复策略。
五层网络协议

五层网络协议,从上到下分别为:应用层,传输层,网络层,链路层,物理层。

应用层(Application Layer)协议是指分布世界的终端设备,一个终端的应用程序使用协议去与另一个终端应用程序交换信息。常见的应用层协议有:HTTP,SMTP,FTP,DNS等。应用层传播的信息称为消息(Message)。

传输层(Transport Layer)协议负责在两个终端应用之间传输应用层的消息。常见的传输层协议有TCP,UDP等。传输层传播的信息称为报文段(Segment)。

网络层(Network Layer)协议负责将数据报从一个主机运送到另一个主机。常见的网络层协议有 IP 协议,以及路由协议。网络层传播的信息称为数据报(Datagram)。

链路层(Link Layer)协议负责将上一层的数据报封装帧格式,在一条链路上传播。链路层协议有:Ethernet,WiFi。链路层传播的信息称为帧(Frame)。

物理层(Physical Layer)负责将上一层的帧封装成比特流在两个节点之间传输。物理层传播的信息称为比特(Bit)。

五层协议的基本工作原理是,两个终端设备要进行数据交流,在一个终端发送应用层的请求,另一端接收到请求并做出相应的回应。应用层的交流是网络通信最终要达成的交流目标,但是仅靠应用层完成不了整个交流的任务。实际上,应用层做好了自己的任务,把剩余的任务交给运输层去完成;运输层完成了自己的任务,把剩余的任务交给网络层;依次类推到物理层,依靠每一层的努力,最终实现了两个终端交流的目的。网络分层的通信结构图如下

上图是一个简化的网络模型,其中一个堆栈表示一个网络设备,为什么在中间的部分只有三层结构,因为在网络的核心负责运送消息,不需要进行通信交流。而网络的边缘即两个终端是进行交流的目标主体。

为什么每一层都有不同的传播信息的名称?实际上,我们知道网络通信最终的目的是完成两个终端之间的通信,也可以说是最上层应用层的通信,而上一层的通信需要依靠下一层提供的服务。在网络通信中,每一层都都有自己的协议,定义了不同大小的传播数据单元,由于每一层传播信息单元的最大数据长度不同,每一层可能需要将上一层的数据切分成多个小段,每一个小段加上当前层的协议内容信息称为头部(Header),每一层的数据格式都是头部加数据域(Data)组成。所以,每一层根据自己协议的规定和职责,组装了自己的数据格式,不同的数据格式则需要不同的名称。

网络通信的过程

一个设备需要进行网络通信首先需要接入网络。谁可以提供网络接入呢?互联网服务提供商(Internet Service Provider, ISP)能够为我们提供网络接入。国内现有的网络运营商为:中国电信,中国移动,中国联通。最常见的网络接入服务有:拨号上网、ADSL、CDMA无线上网。

我们接入网络之后,就可以使用网络应用服务,最常见网络应用服务有:web服务(使用浏览器访问网页),发送电子邮件等。

完整的通信过程是,首先,你所在的区域(家庭或者公司)接入 ISP 提供的网络,客户端(手机,电脑)连上网络,设备上的应用程序使用网络协议发送请求,通过网络的数据传播,提供服务的终端(服务器)上的应用程序接受到请求,并使用网络协议响应请求。

网络安全

网络给我们的生活带来了很多便利,但在使用网络的同时,我们也可能收到网络的攻击。这些网络攻击可能会伤害我们的电脑,窃取我们的隐私信息,以及使服务器无法提供服务等。

常见的安全攻击有

  • 恶意软件(Malware)。通过网络将恶意软件安装到你的电脑中,感染你的电脑。从而删除你的文件,安装间谍软件收集你的隐私信息。常见的恶意软件有:病毒软件、蠕虫软件。
  • 拒绝服务攻击(Denial-of-service (DoS) Attack),大量的访问你的服务器,使服务器无法提供正常的服务。
  • 数据嗅探(Packet Sniffer),监听和保存你的设备发送的网络数据包,从中分析出你的敏感数据。如你的密码,你的交易信息,你的个人隐私信息等。
  • IP欺骗(IP Spoofing),冒充一个网址,从而获取你在该网站的登录用户名和密码等。

References

[1] Computer Networking: A Top-Down Approach, by Jim Kurose

[2] Internet - Wikipedia

[3] Communication Protocol - Wikipedia

[4] 五层因特网协议栈

Background

I want to use Swagger with Spring Boot, but the Swagger-UI can’t work. Following it’s my code.

pom.xml

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>

AppConfig.java

@Configuration
@EnableSwagger2
public class SpringFoxConfig
{
@Bean
public Docket api()
{
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}

Error Info

When I visited http://localhost:8080/swagger-ui.html, occur following error tips.

Solution

make sure your swagger configuration is under your spring boot application which can be scanned.
and then it solved.

Reason

My config file doesn’t scan by spring boot. It leads to the required bean is not exist.

References

https://github.com/springfox/springfox/issues/1996

Background

I use mvn spring-boot:run command to run my spring boot project.

Error Info

[ERROR] No plugin found for prefix 'spring-boot' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (D:\Repositories\mavenRepo), central (https://
repo.maven.apache.org/maven2)] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixException

Solution

Make sure your project pom.xml exists in your terminal’s working directory when you run the mvn spring-boot:run command. The basic configurations for the pom.xml file to run a spring boot project are shown below.

pom.xml

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<!-- run $ mvn package, generating an executable jar -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

Reason

I run the mvn spring-boot:run command not in my project root directory.

Reference

https://stackoverflow.com/questions/30855864/maven-no-plugin-found-for-prefix-spring-boot-in-the-current-project-and-in-th

为了探究操作系统的工作原理。我们先要知道它是什么,它的作用,以及它的组成结构。然后我们解释为什么需要操作系统。最后,我们开始探究操作系统的工作原理,它是如何实现这些功能的。

什么是操作系统


操作系统的定义

操作系统是一个一直运行在计算机中的程序。它管理着计算机的硬件和软件资源,提供一些服务给计算机的程序。为了更好的理解操作系统,我们可以把它对比一个政府组织,它作用的与政府组织相类似。一个政府组织,它不是为了自己而运作,而是为了给百姓提供服务。操作系统它提供了一个环境,让程序可以在操作系统中运行。


操作系统的功能

  • 用户接口。如用户图形界面,终端等。
  • 程序的执行。
  • I/O 操作。
  • 文件系统操作
  • 通信。
  • 错误侦探。
  • 资源分配。如,为程序分配CPU、分配内存。

操作系统的结构

常见的操作系统结构如下。

  • 整体结构 (Monolithic Structure)。结构比较简单,没有清晰的层次和模块划分。这种结构,初期看起来会比较简单。由于耦合度较高,后期就比较难维护,以及容易出现安全问题。
  • 分层结构 (Layered Approach)。系统分为多个层,较低的层的提供一系列方法给较高的层调用。这是一种松耦合的结构,系统中某一个部分改变对其它部分没有很大的影响。另外,这种结构比较易于系统调试。
  • 微核心结构 (Microkernels)。把所有不必要的组件从内核中移除,作为用户层的软件去实现,把内核最小化。这样的结构易于系统扩展,添加新的系统服务不需要修改内核。
  • 组件化结构 (Modules)。内核包含一些核心的组件,其它系统服务模块可以通过动态加载来实现。

现代操作系统一般采用上面的某一种结构。但有的操作系统会采用混合多种不同的结构。大部分现代操作系统都采用一种组件化结构称为 Loadable Kernel Modules (LKMs)。

虽然每个系统的结构各不相同,但它提供的功能大致是相同的。如进程管理,文件管理,设备管理等功能是必要的。每个系统为了实现它要提供的功能,采用一个合适的结构就好。最重要的是把功能很好的实现,以及方便操作系统能够持续的维护和优化。

现代 Linux 系统内核结构采用组件化结构,如图


为什么需要操作系统

操作系统是连接硬件和用户软件的媒介。它对硬件资源进行管理,提供一个让用户软件可以运行的环境,以及给用户提供了用户图形接口(GUI)让用户可以方便使用硬件资源。没有操作系统提供的环境,我们就无法享受各种各样的应用软件带来的便利。


操作系统是如何工作的


操作系统的启动过程

当笔记本电脑按下开机键后,位于电脑主板上的固件 ROM 中的启动程序(Boot Loader)会运行,常见的启动程序有 BIOS 和 UEFI。启动程序会加载操作系统的启动程序,进而把整个操作系统加载到内存中并开始执行操作系统。然后安装驱动程序,创建初始化系统进程,启动必要的服务(如Web服务器,数据库等),最终出现系统登录的页面。


操作系统是如何为用户程序服务的?

操作系统启动成功后,就可以登录系统。用户可以根据自己的需要运行相应的程序,如浏览器,文本编辑器等。

一个程序的运行,需要把可执行文件加载到内存中,需要使用 CPU 去执行。然而,硬件资源(CPU,内存等)是被操作系统所管理的,为了安全和高效,用户程序不能直接使用硬件资源。

操作系统为用户程序提供了一系列的接口,通过调用对应的接口获取相应的服务和资源。这一系列接口称为系统调用 (System Call)接口。

常见的系统调用接口

  • 进程控制。创建子进程,获取进程属性,分配额外内存空间等等。
  • 文件管理。创建和删除文件,打开和关闭文件,读写文件等等。
  • 设备管理。请求连接设备,关闭设备,读写设备等等。

操作系统是如何管理硬件和软件资源的?

为了更高效的使用硬件资源,需要合理的管理和分配资源。操作系统负责给进程分配资源。关于 CPU 的分配,一般采用轮询调度算法(Round-Robin Scheduling),即每个进程依次被 CPU 执行一个小的时间片段。关于内存的分配,一般采用的是虚拟内存,它可以使进程的逻辑内存空间远大于实际的物理内存空间,从而能运行更多的程序,更大程度的使用计算机硬件资源。

除了管理硬件资源,操作系统还要管理软件资源。如何让进程同步,如何解决进程死锁,如何实现文件I/O 等等。由于篇幅原因,这里就不具体展开。以后会单独作为一篇文章去写。


结语

通过了解操作系统是什么,为什么需要操作系统,以及操作系统的工作原理。我们大致了解操作系统的内部结构和实现机制。想要了解更多操作系统相关内容,可以阅读我的参考内容。


References

[1] Silberschatz, A. Operating system concepts 10th [M]. 2018.

[2] Operating system - Wikipedia

写博客这件事,最早是上大学的时候,老师课堂上说让我们写博客,说写博客不仅能够加强对知识的理解,也有利于将来找工作。那时对计算机领域相关东西了解的很少,学得也少,对写博客这件事没什么想法,写博客这件事从脑海中一闪而过了。毕业之后,也常常有写博客的念头。但是,感觉自己没什么可写。或者缺少开始的勇气。

最近,对整个计算机领域技术进行了梳理,对计算机技术有了一个较深的理解。知道自己要学什么、要干什么。同时,学习了很多计算机基础的内容,如组成原理,操作系统和算法。原来看起来很高深、很复杂的算法和实现原理,当你理解了之后,再回头看也就没有那么难。克服对技术的恐惧心理。所以,写博客看起来也不是一件很难的事情了。于是,经过一番折腾把博客搭起来了。接下来就是,写博客了。相信,那也不是一件很难的事!


0%