本次博文的主题是web服务哈。web服务也是Internet上使用最多的服务,通常被称为WWW(World Wide Web,万维网)服务。

【本次博文的主要内容】

  • HTTP协议基础

  • HTTP的报文首部

  • HTTP的请求报文

  • HTTP的响应报文

  • 常见的Web服务器和浏览器


一、HTTP协议基础:

1、HTTP是什么:

HTTP:HyperText Transfer Protocol,超文本传送协议,定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

HTML:HyperText Mark Language,超文本标记语言,包含了超链接的文档,通过浏览器解析后展示给用户。

2、HTTP的工作原理:

HTTP协议的工作工程大致如下图所示:

Linux运维之Web基础(HTTP基础)

【HTTP事务】

一个事务的组成是由request+response整个过程的建立到结束,即一个请求与其一个对应的响应报文合并起来就是一次HTTP事务

一次HTTP事务的完成过程(如上图所示):

建立连接---->客户端通过DNS解析后的IP地址与Web服务器建立连接;

接收请求---->Web服务器接收来自客户端的请求;

处理请求---->Web服务器解析请求报文并做出相应的动作;

访问资源---->Web服务器在自己的数据库中访问请求报文中所请求的相关的资源;

构建响应---->Web服务器使用正确的首部生成HTTP响应报文;

发送响应---->Web服务器向客户端发送生成的响应报文;

记录日志—--->Web服务器将已经完成的HTTP事务记录进日志文件;

【web资源】

    客户端请求的每一个文件(包括每一个图片)就是一个web资源

下面通过浏览器的开发人员工具来查看一次具体的HTTP事务:

Linux运维之Web基础(HTTP基础)

从上图可以看到,服务器从处理请求到构建响应所花费的时间占主要部分;客户端请求的每一个文件(每一个HTML文档、每一幅图片)都是一个Web资源,每个web资源的获取都是一次http请求

3、HTTP的特点

C/S架构

client:客户端用浏览器与服务器交互

server:主流的Web服务器有httpd(Apache),nginx,lighttp,thttpd,IIS

报文类型:

HTTP是一种应用层协议(基于请求/响应模型)

    请求报文:request

    响应报文:response

无连接:限制每次连接只处理一个请求。服务器端处理完客户的请求并收到客户端的应答后,即断开连接。

无状态:对于事务处理没有记忆能力(即当客户端的请求到来,服务器端做出响应后,连接就关闭了)。这就意味着如果后续处理需要前一次请求的信息,则它必须重传;每一个请求和上一个请求之间是独立的,所请求的资源的次序也是由客户端浏览器决定的,服务器也并不知道客户端请求的资源是一个页面的还是多个页面。

Tips:举一个例子用于理解HTTP协议的无状态特性:

例如用户访问一个电商站点,将某件商品放入购物车,此时一刷新页面会发现购物车空空如也(如何解决此问题呢?通过会话技术--cookie/session机制),原理大致如下图所示:

Linux运维之Web基础(HTTP基础)

4、HTTP协议的版本:

http0.9:第一个成熟的版本

  • 只有get方法:因此只能下载文件;

  • 只有一种资源类型(文本);

  • 无状态(stateless);

http1.0:

(1)引入MIME技术,使得能够支持多媒体功能(浏览器只能展示纯文本,它采用两种方式运行非文本文件:1、通过浏览器内在的插件  2、调用外部相应的程序)

MIME(Mutipurpose Internet Mail Extension:多功能Internet邮件扩展):为smtp协议提供非文本附件提供支持(smtp默认只支持纯文本)

【MIME的各种文件格式】

  • major(主版本号)/minor(次版本号)

  • p_w_picpath/jpg:JPG格式的图片

  • p_w_picpath/gif:GIF格式的图片

  • text/html:纯文本文件

  • video/quicktime:视频文件

  • application/x-httpd-php:应用程序(通过PHP处理的程序)

(2)keep-alive(保持连接):即TCP/IP三次握手获取资源后不会立即断开,而是等待继续获取资源,没有要获取的资源或超时后才断开连接

(3)短连接:连接后立即断掉

(4)支持缓存(打开网页的速度加快)

http1.1(主流):

  • 支持更多的请求方法

  • 支持更精细的缓存控制(条件式请求)

  • 支持持久连接(persistent connection)

  • 支持虚拟主机

5、HTTP标识资源的方法:

思考一个问题:浏览器如何获取一个资源,如何区别同一站点的不同资源及不同站点的相同类型的资源?通过URI来标识不同类型的Web资源?

URI:Uniform Resource Identifier(统一资源标识)

URL:Uniform Resource Locator(URL是URI的一个子集,一般Internet上普遍使用URL)

格式:scheme://[username:[email protected]]HOST:port/path/to/source

          范例:http://www.magedu.com/downloads/nginx-1.5.tar.gz

     网页文件:文件系统中有一个存放位置,假如为/www/html

URN:统一资源命名符

6、简单介绍动态网站技术和CGI:

CGI(common Gateway Interface)技术的出现引入了动态站点技术:

动态站点:用户请求的是一个程序,把程序的执行结果返给用户,根据程序运行的位置分为客户端动态与服务器端动态:

  • 客户端动态:例如Applet(java客户端小程序)

  • 服务器端动态:CGI

CGI原理:客户端打开一个页面想看看服务器端的时间如何实现?

若没有CGI技术,服务器端直接返回显示时间命令的脚本给客户端(例如返回的内容是#!/bin/bash date

通过某种协议(CGI),使得Web服务器与程序执行环境相互通信(如下图所示):

Linux运维之Web基础(HTTP基础)

7、HTTP 缓存机制:(多级链式缓存)

  • 私有缓存:浏览器这样的私有的资源

  • 公共缓存:如图片、文字等静态文件

  • 代理、旁路缓存服务器(类似DNS的递归)


二、HTTP请求报文与响应报文详解:

【HTTP报文的格式】

一个HTTP报文由3部分组成,分别是:

  • 起始行(start line)

  • 首部(header) :首部有多个,最常用的有通用首部、请求/响应首部、实体首部

  • 主体(body)

【HTTP报文的首部】     

通用首部:请求和响应均可使用

Connection:允许客户端和服务器指定与请求/响应连接有关的选项

Date:提供日期和时间标志,说明报文是什么时间创建的

MIME-Version: 给出了发送端使用的MIME版本

Trailer:如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以用这个首部列出位于报文trailer部分的首部集合。

Transfer-Encoding :告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。

Update:给出了发送端可能想要"升级"使用的新版本或协议

Via:显示了报文经过的中间节点(代理、网关)

请求首部:

Host: 所请求的主机

Referer: 提供了包含当前请求URI文档的URL

Accept: 接受的MIME类型

Accept-Charset:浏览器接受的字符集

Accept-Encoding:浏览器支持的编码类型

Accept-Lanague: 告诉服务器能够发送哪些语言

条件请求首部:用于控制缓存

If-Modified-Since:除非在某个指定的日期之后资源被修改过,否则就限制这个请求

If-None-Match:和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.  使用这样的机制将提高网站的性能

安全请求首部:

Authorization: 客户端提供给服务器的认证信息;

Cookie:客户端用它向服务器传送一个微小的信息片--它并不是真正的安全首部,但却是隐含了安全功能

Cookie2:用来说明请求端支持的cookie版本

响应首部:

Age:(从最初创建开始)响应持续时间

PUBLIC:是否可以在公共缓存上缓存

Server:服务器软件名称及版本

Vary:服务器查看的其他首部的列表,可能会使响应发生变化;也就是说,这是一个首部列表,服务器会根据这些首部的内容挑选出最合适的资源版本发送给客户端(会影响缓存机制);

Set-Cookie:设置cookie

Set-Cookie2 :与Set-Cookie类似

实体首部:

Allow: 允许的请求方法

Location: 资源的实际位置

Content-Language:理解主体时最适宜使用的自然语言

Content-Location:资源实际所处的位置

Content-Type:资源的MIME类型

ETag: 实体标记

Expires:实体不在有效,要从原始的源端再次获取此实体的日期和时间

Last-Mofified:这个实体最后一次被修改的日期和时间

1、HTTP请求报文:

请求报文的格式】:

Linux运维之Web基础(HTTP基础)

Linux运维之Web基础(HTTP基础)

【HTTP请求报文详解】:

Linux运维之Web基础(HTTP基础)

【HTTP协议的请求方法】:

    GET:完整请求一个资源

    HEAD:仅请求响应首部(不需要主题)

    POST:提交表单及附件

    PUT:上传资源的方法,依赖于webdav的机制(不安全);

    DELETE:删除资源的方法,依赖于webdav机制(不安全);

    OPTIONS:返回请求资源所支持的方法的方法

    TRACE:  追踪一个资源请求中间所经过的代理服务器

说明:HTTP请求方法主要有两个--get和post,二者的区别如下:

(1)安全性:get请求的数据会显示在地址栏上;

post请求的数据放在http协议的消息体中;

(2)从可以提交数据的大小看:

http协议本身没有限制数据的大小,但浏览器对get和post请求的数据有限制:

get:(2K+35=2083)字节

post:无限制

(3)get请求可以更好地添加到收藏夹

2、HTTP响应报文:

【响应报文的格式】:

Linux运维之Web基础(HTTP基础)

Linux运维之Web基础(HTTP基础)

【HTTP响应报文详解】:

Linux运维之Web基础(HTTP基础)

【HTTP的响应码】:

Linux运维之Web基础(HTTP基础)

1xx: 信息性状态码    
            100, 101    
2xx: 成功状态码    
            200:OK    
3xx: 重定向状态码    
            301: 永久重定向, Location响应首部的值仍为当前URL,因此为隐式重定向;    
            302: 临时重定向,显式重定向, Location响应首部的值为新的URL    
            304:Not Modified(没修改,在条件请求中有用)    
4xx: 客户端错误状态码    
            404: Not Found    
5xx: 服务器端错误状态码    
            500: Internal Server Error    
            502: Bad Gateway(任何一个代理找不到其上游的代理了)    
            504:Gateway Timeout


三、常见的Web服务器软件和浏览器:

web服务器软件:

    httpd: (apache), a patchy server,

        ASF: Apache Software Foundation

            tomcat

            cassandra

            hadoop

            cloudstack

            lucene

    nginx;

    lighttpd;

    IIS;

web浏览器:

    IE

    chrome

    firefox

    opera

    safari

    elinks

    curl


本次博文的内容就这么多哈,下次博文我们来具体说说Apache(httpd)服务器的基本配置。