科技 > 操作系统 > Linux

httpd之Web服务概述(一)

286人参与2020-05-10

  自上世纪80年代末至90年代初互联网诞生以来,web服务可以说是在互联网的普及过程当中起到了巨大的作用。而web服务应该是当今世界上普通用户访问互联网的最广泛的方式了,用户只需在浏览器中输入所谓网址的方式即可浏览互联网上的海量信息,而浏览器这种瘦客户端的交互方式也是目前最主流的交互方式。

  web服务的基础是http协议,基于http这个应用层协议才能实现客户端和服务器端之间的数据交互。客户端通过http协议向服务器端发送请求,服务器端接收到这个请求之后,服务器端基于http协议也能够理解客户端发送的请求的含义,同时返回客户端所请求的内容至客户端,而客户端接收到服务器端发送过来的响应之后就能够解析相应内容并通过特定的格式展示给用户。我们可以看到在此过程中,http协议作为双方能够实现通信的这样一种标准而言至关重要。那在介绍http协议的相关知识之前我们在复习一些关于计算机网络的基础知识。

一、网络协议基础简述

1、传输层协议:提供进程地址

  我们知道,协议是分层的,正如目前互联网事实上的标准tcp/ip协议族就分为了四层,自下而上依次是:物理层、网际接口层、传输层、应用层,每一层所完成的功能不尽相同,这样做的好处是可以将一个大而复杂的问题拆分为许多小而相对独立的逻辑单元,上层可以很方便的调用其下一层次所提供的服务用以完成自身特定的功能;同时当每一层次的具体实现细节改变时,调用其接口的上层服务也无需做人也修改,不至于影响全局。那tcp/ip这四层协议当中的传输层协议作用之一就是用来提供在主机上运行的各进程需要实现与外部主机通信时需要监听的地址端口。

  传输层协议主要有tcp协议和udp协议两大类。tcp(transfer control protocol)协议是面向连接的协议,即通信双方在通信之前需要建立专用于通信的虚拟链路,在通信结束后需要将链路拆除,此种方式可保证通信的可靠性,但效率会受到一定程度的影响。udp(user datagram protocol)协议则是无连接的协议,即通信双方在通信之前无需建立虚拟链路,此种方式不能保证通信的可靠性,但效率比tcp协议要高。

  tcp和udp是两个相互独立的协议,它们各有一套端口号用来提供给各进程使用,范围为0-65535(其中源端口16位,目标端口16位)。根据端口使用对象划分,可分为如下几类:

2、socket

  socket是ipc(进程间通信)的一种实现机制,它能够实现不同主机甚至是同一主机上的不同进程之间进行通信.程序员可通过socket api这样一种c标准库调用接口进行socket编程.第一个真正被大众广泛接收的socket api大约是在1983年前后发布;这个标准早期是出现在4.2版本的bsd系统上的,后来被广泛移植到了各种各样的unix发行版上,甚至包括后来出现的linux系统对其也都有支持.

  socket的格式诸如:ip:port每一个ip:port,我们称其为一个套接字.因此根据使用协议端口的不同,可分为三类不同的套接字:

  此外,根据所使用的地址的 不同,又出现了socket domain这样的概念,即根据socket使用的ip地址的不同,可作如下分类:

  结合传输层协议来看,在上述三种分类中,每一类套接字都至少提供了两种socket的数据传输机制:流(基于tcp),数据报(基于udp);对比tcp与udp的特点,我们即可以知道流与数据报的区别:

  流:提供可靠的面向连接数据传输,多个报文发送之间无边界;

  数据报:提供不可靠的无连接数据传输,多个报文发送之间有边界(因为是无序发送,需要添加帧头和帧尾用以标识一帧的开始和结束);

套接字相关的系统调用

  注:

  1. write(),read()的作用同send(),recv(),sendto(),revcfrom();
  2. 默认情况下,这些调用在io无法完成时将会被阻塞;

3、ipv4的分类

  按照ipv4的第一个字节所处的范围,大致可分为a,b,c,d,e五类:

    a:1-127;

    b:128-191;

    c:192-223;

    d:组播地址,224-239;

    e:240-254

  为满足建立不与外部网络通信的局域网的需求,ipv4在a,b,c三类中又各预留了一段私有地址供使用,它们分别是:

    a:10.0.0.0/8

    b:172.16.0.0/16-172.31.0.0/16

    c:192.168.0.0/24-192.168.255.0/24

4、tcp协议的特性

     如果说a、b主机之间进行通信时,a的发送速度可能大于b的接收速度,为了避免这中情况可能产生的问题,我们应该做流量控制;

     滑动窗口算法允许包含总共假如说n个字节或者n个窗口大小的未确认段同时在发送者和接收者之间可以完成传输的,如果接收者的缓冲间完全被塞满了,那么窗口就会被关闭,告诉发送方窗口为0即停止发送;

  (tcp的拥塞控制算法主要用来防止快速的发送者压垮整个网络的;因此它使用慢启动的方式)

 

 二、http协议基础

  http全称为hyper text transfer protocol,即所谓的超文本传输协议。见名知意,从其名称上我们可以得知,http协议是用于实现传输超文本的协议,那什么是超文本呢?

  我们可以简单将超文本理解为带超链接的文本,而超链接是超文本当中一种特殊的语法格式,它用于实现超文本之间的跳转。通过点击超链接,我们可以实现从一个超文本跳转到另一个超文本,甚至于实现在同一个超文本之内的不同内容之间进行跳转。比如我们通常在浏览器中访问的一个网页就是一个超文本,点击超链接,它又会跳转到另一个网页中去。

  超文本是通过html编写的,html(hyper text mark language,超文本标记语言)是一种编程语言,它是由很多既定的标签组成,每一种标签的用法和属性可能不尽相同。我们在浏览器中所看到的一个个生动形象的网页就是通过html以及借助于css(cascading style sheet,层叠样式表)js(javascript,一种脚本语言)所实现的。

  因此http协议就是实现超文本传输的协议,那么http为什么能够实现超文本的传输呢?http协议传输纯文本的数据流之外,为什么还能够支持对如图片等二进制数据的传输呢?http的工作机制到底是什么?那么接下来,我们就来介绍http协议的相关内容。

1、http协议版本

  http协议诞生于20世纪80年代的欧洲核物理实验室,诞生的初衷主要是为了能够实现在多个部门之间可以共享文档和快速实现文档定位。http协议在发展过程中进行了多次版本迭代,其所实现的功能随着版本更新也愈加丰富。

  在当时http/0.9是http协议应用最广泛的版本,那个时候的web服务仅支持纯文本(即由纯ascii字符组成的文本),这种纯文本还包含有超链接,这种超链接也是表现为纯文本形式的,但这种文本比较独特,因此称为超文本。

  通过参照传统的smtp协议,在http/1.0中引入了mime机制,从此之后,http协议也可以传输诸如图片、音频、视频等非文本数据了;此外,http/1.0还引入了缓存机制。

  http是基于tcp的应用层协议,而每一次tcp连接的建立都需要3次握手,在数据交互完成之后,有需要4次断开。因此为了避免由于每一次访问资源时的3次握手和4次断开而造成的资源浪费,推出了http/1.1。

  首先,在http/1.1中增强了缓存功能;

  其次,引入了长连接机制,即每一次连接在获取到资源之后并不会立即断开,而是继续获取下一个资源。

 

  注意:建议阅读http/1.0和http/1.1的rfc文档。

2、http报文

  http报文分为请求报文和响应报文,其格式不尽相同;

2.1 http请求报文

  请求报文语法:

 <method> <request-url> <version>

<headers>

 

<entity-body>

  <method>:请求方法,标明客户端希望服务器对资源的执行动作,如get、put、post等;

    常用method:

  <request-url>:请求的资源路径;

  <version>:对应的请求资源协议的版本号;

  <headers>:http协议请求报文首部,每个请求报文可包含任意个首部,每个首部都有首部名称,后跟一个冒号,而后跟上一个可选空格,接着是一个值,其格式都形如key:value,需要注意的是,首部的最后面一行必须是空白行;

  <entity-body>:报文的主体内容;

2.2 响应报文

  响应报文语法:

<version> <status> <reason-phrase>

<headers>

 

<entity-body>

  <version>:协议版本;

  <status>:状态码,用以标识请求的状态结果(正确与否),大约可分为5类:

    常用状态码:

  <reason-phrase>:对<status>的进一步补充说明;

  <headers>:响应报文首部,每个响应报文可包含任意个首部;每个首部都有首部名称,后跟一个冒号,而后跟上一个可选空格,接着是一个值,同样的,响应报文首部的最后一行的下一行必须是空白行;

  <entity-body>:响应报文主体

2.3 举例

  请求报文:

get / http/1.1

host: www.test.com

connection: keep-alive

 

  响应报文:

http/1.1 200 ok

x-powered-by: php/5.2.17

vary: accept-encoding,cookie,user-agent

cache-control: max-age=3, must-revalidate

content-encodiing: gzip

content-length:6931

 

   注:get / http/1.1中的/表示此时访问一个网站但没有明确指定访问哪个页面,/表示访问对方的默认页面(主页)。

 3、http headers(首部)

   不管是http请求报文和http响应报文中都包含有首部,其格式为name: value,根据各首部的功能用途大约可分为以下几类:

3.1 通用首部

   通用首部即既可以在请求首部又可以在响应首部中的首部;

 3.2 请求首部

 3.2.1 条件式请求首部

 3.2.2 安全请求首部

 3.2.3 代理请求首部

  若某一个请求中途经由代理服务器请求的话,它还有一个代理请求首部;

3.3 响应请求首部

3.3.1 信息性首部

3.3.2 协商首部

  某资源有多种表示方法时使用,比如用户请求的页面有中文版、英文版、阿拉伯语版,因此阿拉伯人访问的时候,其浏览器跟服务器协商版本;

3.3.3 安全响应首部

3.4 实体首部

3.4.1 缓存相关

4、一次完整的http请求处理过程

   一次完整的http请求的处理过程包含从客户端发起请求开始到服务器端发送响应报文完成,这一过程也被称为一次完整的http事务

  (1). 建立并处理连接

    处理连接的方式也无非就是:接收请求拒绝请求,以下我们只考虑接收请求的情况;

  (2).接收请求

    即接收来自于网络的请求报文中对某资源的一次请求的过程;

  (3).处理请求

    对请求报文进行解析,并获取请求的资源及请求方法等相关信息;

  (4).访问资源

    获取报文中指定请求的资源;

    web服务器,顾名思义为存放了web资源的服务器,负责向请求者提供对方请求的资源,或动态运行后生成的资源,这些资源通常放置于某特定路径下,此路径通常被称为docroot;

    例如:在一台名为www.test.com的web服务器上,其docroot为/var/www/html,在此目录下有一images目录,在image目录下有一文件为1.jpg,即/var/www/html/images/1.jpg;因此,在通过浏览器向web服务器请求此资源时,可通过访问:http://www.test.com/images/1.jpg实现;

 

  (5).构建响应报文

  (6).发送响应报文

  (7).记录日志

  我们再来深入了解一下这个过程,如下图所示:

 

 

   首先,我们明确一个概念,我们所谓的web服务器在运行时本质上也无非就是一个运行于用户空间的进程,因为web服务器是一个应用程序,而只要是应用程序就应该在用户空间。其次,用户所访问的资源其在服务器端表现形式为一个文件,这个或者这些文件也一定是存放于某持久性存储设备,我们此处就以磁盘为例。

  当用户通过浏览器发起一个http请求时,此时浏览器作为web服务通信时的客户端,如果用户在浏览器输入http://www.test.com/index.html。很显然,目前在互联网中的主机之间通信是通过ip地址来作为唯一标识的,因此,首先需要进行域名解析,将我们访问的主机名通过hosts文件或者dns服务器转换为ip地址。而浏览器将封装请求报文,并发送至网络中,经过层转发,到达web服务器。当这个请求到达web服务器主机时,最先经过的是web服务器主机的内核空间,因为这个客户端的请求一定是通过网络协议发送过来的,而tcp/ip协议工作于内核当中,因此请求首先到达内核空间。

  web服务默认监听在本机的tcp协议的80端口之上,内核空间通过对tcp/ip协议栈中的各种路由机制进行解码等操作发现访问的是本机80端口的套接字,因此内核会将此请求通过套接字转交给用户空间的web服务器,因此执行流程就从内核空间转移到了用户空间。

  若web服务器发现用户访问的是一个静态文件(如:index.html),而静态文件是存放于磁盘之上的,此时服务器就需要陷入内核重新转换至内核空间,内核从磁盘上加载对应的文件至内核空间,再返回给用户空间,web服务器接收到这个文件之后就可以返回给客户端了。因此此时再通过套接字返回到内核空间,经由tcp/ip协议栈最终响应给客户端,至此,http的一次事务完成。

  我们此时再回过头来分析一遍,如果我们在浏览器输入www.test.com访问,第一步需要把fqdn解析成ip,因此在请求发出之前需要先通过dns服务器解析fqdn,而dns服务器可能会进行递归、迭代,需要消耗一些时间,因为有可能是第一次访问,其结果未缓存到本地。之后客户端输入地址发送请求给服务器,服务器在内部需要有一种机制能够接收用户的请求报文,这种机制就叫监听,服务器端的某用户进程会监听在某个端口上,等待客户端请求。一旦用户请求来了,而内核通过tcp/ip协议栈发现有人监听在这个端口上,于是这个请求就可以交给这个套接字了。但如果本地没有任何一个用户进程监听某个套接字,但如果有用户来访问了,此时内核无法知道有谁能够响应这个请求,此时服务器端会拒绝客户端请求,所以必须到内核中去注册需要使用哪个端口并一直在这个端口上处于等待状态。当有请求到来时,通过tcp/ip协议的首部解码后发现用户访问的是这个端口,于是把这个请求交给这个端口,而进程又一直在监听这个端口,一旦有请求来了,可进行响应。

  tcp/ip协议在封装报文时,tcp首部主要是源端口(source port)、目标端口(destination port)ip首部主要是源ip地址(source ip)目标ip地址(destination ip)。但确并没有说明具体访问哪个文档(资源),因此某一种特定的应用在通过tcp/ip协议往外发送时,tcp/ip最多就是将报文传递到目的地的,到达目的地后还需要具体协议的报文首部。因此http协议也有自己的首部,叫http首部(明确定义了基于哪种协议获取哪个资源的),需要说明获取什么文档,如:get /2.html,并且还需说明获取哪个主机的资源,因此通常还有一个首部叫:host:www.magedu.com(加主机是http1.0当中的引入的一种机制,在发起获取资源请求时,不但要指明获取哪个资源,还要再加上获取哪个主机的资源,这个主机一定是主机名称,这是为虚拟主机提供准备的)。说白了这一切就是我们之前提到的http报文。

5、web服务器处理并发连接请求的架构方式(响应模型)(web i/o)

  对于一个正常的网站而言,在同一时间内甚至是同一时刻一定会存在多个用户访问的情况,那么我们的web服务器同时接收到这些请求之后如何进行处理呢?这就是我们接下来要讨论的web服务器对于并发连接请求的处理方式。

  此种架构方式中,web服务器一次处理一个请求,结束后读取并处理下一个请求。在某请求处理过程中,其它所有的请求将被忽略,因此,在并发请求较多的场景中将会出现严重的性能问题。

  此种架构方式中,web服务器生成多个进程或线程并行处理多个用户请求,进程或线程可以按需或事先生成。有的web服务器应用程序为每个用户请求生成一个单独的进程或线程来进行响应,不过,一旦并发请求数量达到成千上万时,多个同时运行的进程或线程将会消耗大量的系统资源。

  为了能够支持更多的并发用户请求,越来越多的web服务器正在采用多种复用的架构——同步监控所有的连接请求的活动状态,当一个连接的状态发生改变时(如数据准备完毕或发生某错误),将为其执行一系列特定操作;在操作完成后,此连接将重新变回暂时的稳定态并返回至打开的连接列表中,直到下一次的状态改变。由于其多路复用的特性,进程或线程不会被空闲的连接所占用,因而可以提供高效的工作模式。

  将多进程和多路复用的功能结合起来形成的web服务器架构,其避免了让一个进程服务于过多的用户请求,并能充分利用多cpu主机所提供的计算能力。

三、常用软件简介

1、常用的客户端浏览器

2、常用的web服务器应用

3、应用程序服务器

  所谓的应用程序服务器,它们既能提供web服务,但并不是纯粹意义上的web服务器,通常还能够编译执行一些特定脚本文件,这是web服务器所不具备的功能;

 

注: ,此网站每隔一段时间统计一次全球互联网中web服务器各产品所占的比例,各位若有兴趣可自行查看。

 

留下您精彩的一笔!!点此进行留言回复

最近更新

linux系统怎么判断路由转发功能是否开启?

06-22

深度Linux自带的录屏工具怎么录制gif图?

06-22

Linux怎么查找影子文件并进入?

06-22

Linux如何安装运行.AppImage文件?.AppImage文件两种运行方法介绍

06-22

linux怎么添加每天定时任务? linux添加定时任务的教程

06-22

Linux下如何安装deb格式的安装包?deb安装包安装教程

06-22

推荐阅读

httpd之Web服务概述(一)

05-10

shell脚本if结构条件句知识与实践

04-29

记一次Ubuntu19无法安装docker源

11-01

021.掌握Pod-Pod调度策略

11-21

NTP服务器搭建

09-29

使用Ponysay,在Linux终端显示彩虹小马

10-04

把Linux运行级别设置为6后如何解决的经验分享

11-22

网络空间安全基础篇(1)----nmap的使用

10-25

linux命令行,gcc,g++零基础

05-11

(一)U盘安装ubuntu18.04.1

04-19

Nginx基础知识点总结

11-03

Linux下Chrome地址栏输入卡顿该怎么办?

07-03

热门评论