6.1、HTTP介绍
Web、服务器和相关的Web应用程序都是通过HTTP相互通信的。HTTP(HyperText Transfer Protocol,超文本传输协议)是现代全球因特网中使用的公共语言。Web内容都是存储在Web服务器上的,Web服务器所使用的是HTTP协议,因此经常会被称为HTTP服务器。这些HTTP服务器存储了因特网中的数据,如果HTTP客户端发出请求,它们会提供数据。客户端向服务器发送HTTP请求,服务器会在HTTP响应中回送所请求的数据。
- 资源与资源的类型
Web服务器就是Web资源的宿主,Web资源就是Web内容的源头。最简单的Web资源就是Web服务器文件系统中的静态文件。这些文件可以包含任意内容:文本文件、HTML文件、word文件、AVI电影文件等。但是资源并不一定是静态文件,资源还可以是根据需要生成内容的软件程序,这些程序可以根据用户身份、所请求的信息来产生不同的内容。
因特网上有数千种不同类型的数据类型,HTTP给每种要通过Web传输的对象都打上了MIME类型的数据格式标签。Web服务器会为所有的HTTP对象数据附加MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)类型。当Web浏览器从服务器中取回一个对象时,会查看相关的MIME类型,看看能否知道该如何处理该对象,大多数浏览器都可以处理数百种常见的对象类型。
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间用斜杠分隔。
HTML格式的文本文档由text/html类型来标记 普通ASCII文本文档由text/plain类型来标记 JPEG版本图片为image/jpeg类型 GIF版本图片为image/gif类型 ... |
- URI与URL
每个Web服务器资源都有一个名字,这样客户端可以通过该名字找到所需要的资源。服务器资源名被称为统一资源标识符(Uniform Resource Indentifier,URI)。URI就像英特网上的邮政地址一样,在世界范围内唯一标示并定位信息资源。
例如: http://www.joes-hardware.com/specials/saw-blade.gif
统一资源定位符(Uniform Resource Locator,URL)是资源标识符最常见的形式,URL描述了一台特定服务器上某资源的特定位置。它们可以明确说明如何从哟个精确、固定的位置获取资源。如图显示了URL如何精确的说明某自愿的位置以及如何访问。
- 事务
下图展示了客户端如何通过HTTP与Web服务器及其资源进行事务处理。一个HTTP事务由一条(客户端发往服务器端)请求和一个响应(服务器端发回客户端)组成。这种通信通过HTTP报文的格式画数据块进行。
HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP mothod)。每种HTTP请求报文都包含一个方法。这些方法告诉服务器要执行什么动作,常见的HTTP方法有:
GET | 请求获取一个资源,需要服务器发送 |
HEAD | 跟GET相似,但其不需要服务发送资源而仅传回响应首部 |
PUT | 与GET相反,向服务端写入文档;例如发布系统 |
DELETE | 请求删除URL指向的资源 |
OPTIONS | 探测服务器端对某资源所支持的请求方法 |
TRACE | 跟踪请求要经过的防火墙、代理或网关等 |
POS | 支持HTML表单提交,表单中有用户填入的数据,这些数据会发送到服务器端,由服务器存储至某位置(例如发送处理程序) |
每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作,常见的状态码有:
1xx | 纯信息性状态码 |
2xx | “成功”类的信息 (200, 201, 202) |
3xx |
重定向状态码 301:Moved Permanently, 在响应报文中用首部“Location: URL”指定资源现在所处位置 302:Found, 在响应报文中使用首部“Location: URL”指定临时资源位置; 304:Not Modified, 条件式请求中使用;(缓存中使用) |
4xx |
客户端错误类的信息 403:Forbidden,请求被服务器拒绝 404:Not Found,服务器无法找到请求的URL 405:Method Not Allowed,不允许使用此方法请求相应的URL |
5xx |
服务器端错误类的信息 500:Internal Server Error,服务器内部错误; 502:Bad Gateway,代理服务器从上游收到了一条伪响应; 503:Service Unavailable,服务器此时无法提供服务,但将来可能可用; 504:Gateway Timeout,网关代理请求后端服务时,后端服务没有及时响应。 |
- 报文
HTTP报文是由一行一行的简单字符串组成.HTTP报文都是纯文本,而不是二进制代码,所以可以方便地对其进行读写。下图展示了一个简单事务所使用的HTTP报文。
HTTTP报文主要分为三个部分:起始行、首部字段、主体。
请求报文语法: <method> <request-URL> <version> <headers>(name:value) (必须空一行) <entity-body> 报文主体 响应报文语法: <version> <status> <reason-phrase> <headers> (必须空一行) <entity-body> |
<method>: 请求方法, 希望服务器端执行的动作,如GET、HEAD、POST等 <request-url>: 请求的资源,可以是相对路径,也是完整的URL <version>:协议版本,格式HTTP/<major>.<minor>,如http/1.0 <headers>:HTTP首部 <status>: 状态码 <reason-phrase>:原因短语,数字状态码易读信息 <entity-body>: 主体部分 |
- HTTTP协议版本
http/0.9:仅纯文本(超链接), ASCII
http/1.0:支持多媒体数据的处理。支持保持连接。
http/1.1:支持持久连接。更精细的缓存控制
HTTP-NG(又称HTTP/2.0),重点是性能的大幅优化,以及更强大的服务逻辑远程执行框架,但没有要取代http/1.1的计划。
- HTTP首部
HTTP首部和方法配合工作,共同决定了客户端和服务器能做什么。首部通常可以分为五种类型:
通用首部:请求报文和响应报文都可以使用的
HTTP/1.0引入允许HTTP应用程序缓存对象本地副本的首部,这样就不需要总是直接从服务器段获取。
请求首部:只在请求报文中有意义
请求的信息性首部:
Accept首部:
条件请求首部:
安全请求首部:
代理请求首部:
响应首部:只在请求报文中有意义
响应的信息性首部
协商首部
安全响应首部
实体首部:用于指定实体属性
实体的信息性首部
内容首部
实体缓存首部
扩展首部:非标准首部,可能是由程序开发者创建的,例如X-Forward-For
- HTTTP的实现软件
客户端:
GUI:IE、Firefox、Safari、chrome、Opera
CLI:elinks, curl
服务端:
Server: httpd(ASF基金会)、nginx、lighttpd
App Server: IIS、tomcat、jetty、resin
6.2、Web服务器处理连接请求的架构方式
1、单线程web服务器(Single-threaded web servers)
此种架构方式中,web服务器一次处理一个请求,结束后读取并处理下一个请求。在某请求处理过程中,其它所有的请求将被忽略,因此,在并发请求较多的场景中将会出现严重的必能问题。
2、多进程/多线程web服务器
此种架构方式中,web服务器生成多个进程或线程并行处理多个用户请求,进程或线程可以按需或事先生成。有的web服务器应用程序为每个用户请求生成一个单独的进程或线程来进行响应,不过,一旦并发请求数量达到成千上万时,多个同时运行的进程或线程将会消耗大量的系统资源。
3、I/O多路复用web服务器
为了能够支持更多的并发用户请求,越来越多的web服务器正在采用多种复用的架构——同步监控所有的连接请求的活动状态,当一个连接的状态发生改变时(如数据准备完毕或发生某错误),将为其执行一系列特定操作;在操作完成后,此连接将重新变回暂时的稳定态并返回至打开的连接列表中,直到下一次的状态改变。由于其多路复用的特性,进程或线程不会被空闲的连接所占用,因而可以提供高效的工作模式。
4、多路复用多线程web服务器
将多进程和多路复用的功能结合起来形成的web服务器架构,其避免了让一个进程服务于过多的用户请求,并能充分利用多CPU主机所提供的计算能力。
- 一次web请求响应的过程
1、建立连接——接受或拒绝客户端连接请求;
2、接收请求——通过网络读取HTTP请求报文;
3、处理请求——解析请求报文并做出相应的动作;
4、访问资源——访问请求报文中相关的资源;
5、构建响应——使用正确的首部生成HTTP响应报文;
6、发送响应——向客户端发送生成的响应报文;
7、记录日志——当已经完成的HTTP事务记录进日志文件;