第十二章 http协议
12.1 http协议简介
http(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。所有的www文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext)。这成为HTTP超文本传输协议标准架构的发展根基。
超文本就是带有超链接的文本,超链接就是基于一些链接实现文档间跳转的文本。
http协议是一种无状态的协议(stateless):
服务器无法持续追踪访问者来源,为了解决此问题引入了cookie和session,实现追踪与保存用户的行为
12.2 http技术架构
http是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。
通过使用web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。
这个客户端被称作用户代理(User Agent)。
应答的服务器上存储着一些资源,比如HTML文件和图像,这个应答服务器被称作源服务器(Origin Server)。
在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和基于它支持的层。事实上,HTTP可在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定其下层协议提供可靠的传输,任何能够提供这种保证的协议都可以被其使用。
通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器向客户端发回一个状态行,比如"HTTP/1.1 200 OK"和响应的消息,消息的消息团体可能是请求的文件、错误消息或者其它一些信息。HTTP使用TCP而不是UDP的原因在于打开一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据和错误纠正。
通过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform Resource Identifiers)来标识。
12.3 http协议功能
http协议是用于从www服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分以及哪些部分内容首先显示(如文本先于图形)等。
http是客户端浏览器或其他程序与web服务器之间的应用层通信协议。在internet上的web服务器上存放的都是超文本信息,客户机需要通过http协议传输所要访问的超文本信息。http包含命令和传输信息,不仅可用于web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。
我们在浏览器的地址栏里输入的网站地址叫做URL(Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超链接时,URL就确定了林浏览的地址。浏览器通过HTTP将web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。
12.4 http协议版本
超文本传输协议已经演化出了很多版本,它们中的大部分都是向下兼容的。在RFC 2145中描述了HTTP版本号的用法。客户端在请求的开始告诉服务器它采用的协议版本号,而后者则在响应中采用相同或者更早的协议版本。
http协议的版本主要有以下这些:
HTTP/0.9:最原始版本,功能简陋。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,所以客户端无法向服务器传递太多信息。
HTTP/1.0:这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。支持MIME。
HTTP/1.1:增加了缓存功能,引入了长连接(默认采用),能很好的配合代理服务器工作 ,支持以管理方式同时发送多个请求,以便降低线路负载,提高传输速度。
HTTP/2.0:大幅度提升了web性能,减少网络延迟,通常用于https
HTTP/1.1相较于 HTTP/1.0 协议的区别主要体现在:
a) 缓存处理
b) 带宽优化及网络连接的使用
c) 错误通知的管理
d) 消息在网络中的发送
e) 互联网地址的维护
f) 安全性及完整性
12.5 名词解释
HTML:HyperText Mark Language,超文本标记语言
URI:Uniform Resource Indentifier,统一资源标识符。用于定义全局范围内(包括但不仅限于互联网)去标记唯一的、定位一种资源访问路径的方式,或者命名方式,被称作统一资源标识符。这里的统一指的是路径格式上的统一。
URL:Uniform Resource Location,统一资源定位符,是URI的一个子集,用于描述在互联网上互联网资源的统一表示格式(protocol://host:port/path/to/file)
URL基本语法:
:// : @ : / ; ? #
params:参数,如http://www.idfsoft.com/bbs/index.html;gender=f,这里的gender=f就是一个参数
query:传递给关系型数据库页面的特定行为。如http://www.idfsoft.com/bbs/item.php?username=tom&title=abc,这个URL表示要查询的是username=name并且title=abc的条目
frag:用来定义一个较大页面中的某一个位置,而不是页面的开始处。说白点就是位置锚定
URN:Uniform Resource Naming,统一资源命名符,也是URI的一个子集
MIME:Multipurpose Internet Mail Extension,多用途互联网邮件扩展。
MIME可以将非文本数据在传输前重新编码为文本格式再传输给对方,接收方能够用相反的方式将其重新还原为原来的格式,还能够调用相应的程序来打开此文件
http事务:http协议的一次请求(request)和响应(response)的过程就称之为http事务
动态网页:包含静态内容和动态内容(动态内容需要执行)
服务器端存储的不是HTML文档,而是编程语言开发的脚本,脚本接受参数之后在服务器端运行一次,运行完成之后会生成HTML格式的文档,并把生成好的HTML文档传给客户端
Web资源:web resource。
静态文件:.jpg,.gif,.html,.txt,.js,.css,.mp3,.avi
动态文件:.php,.jsp
PV:Page View,打开了多少页面
UV:User View,独立IP量
12.6 http协议报文
http协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
http协议的报文有请求报文和响应报文2种,其语法样式如下:
请求报文语法:
响应报文语法:
报文的第一行通常称作报文"起始行(start line)",后面的标签格式的内容称作首部域(Header Field),每个首部域由名称(name)和值(value)组成,中间用逗号分隔。
另外,响应报文通常还有一个称作Body的信息主体,即响应给客户端的内容。
method:请求方法,标明客户端希望服务器对资源执行的动作,常见的有以下几种:
GET:从服务器获取一个资源
HEAD:只从服务器获取文档的响应首部,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的
POST:向服务器发送要处理的数据。服务器端通常通过提供一个表单,客户端填入数据时会把内容放入entity-body中提交提交给服务器端
PUT:将请求的主体部分存储在服务器上。说白点就是上传数据
DELETE:请求删除服务器上指定的文档
TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的请求方法
version:http的协议版本,格式如HTTP/
status:响应状态码,用于标记请求处理过程中发生的情况,常见的响应状态码有以下几种:
1xx:100-101,纯信息提示
100:服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求,响应状态码为"Continue"
101:服务器转换协议,服务器将遵从客户的请求转换到另外一种协议,响应状态码为"Switching Protocols"
2XX:200-206,"成功"类的信息
200:请求资源正常。请求的所有数据通过响应报文的entity-body部分发送,响应状态码为"OK"
201:请求被创建完成,同时新的资源被创建,响应状态码为"Created"
202:供处理的请求已被接受,但处理未完成,响应状态码为"Accepted"
203:文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝,响应状态码为"Non-authoritative information"
204:没有新文档。浏览器应该继续显示原来的文档。响应状态码为"No Content"
205:没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容,响应状态码为"Reset Content"
206:客户发送了一个带有Range头的GET请求,服务器完成了它
3XX:300-305,"重定向"类的信息
301:永久重定向,响应状态码为"Moved Permanently"
请求的URL指向的资源已经被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置,客户端需要请求新位置的资源
302:临时重定向,我这里正忙,你要的资源在另一个地方也有,你先去那里要,响应状态码为"Found"
与301相似,但在响应报文中通过Location指明资源现在所处的临时新位置
304:客户端发出了条件式请求,但服务器端发现客户端请求的资源已被客户端缓存过且未发生改变,让客户端直接到缓存里去取。响应状态码为"Not Modified"
4XX:400-415,"客户端错误"类的信息
400:由于客户端请求有语法错误,不能被服务器所理解,响应状态码为"Bad Request"
401:需要输入帐号和密码认证方能访问资源,响应状态码为"Unauthorized"
403:请求被禁止,响应状态码为"Forbidden"
404:服务器无法找到客户端请求的资源,响应状态码为"Not Found"
5XX:500-505,"服务端错误"类的信息
500:服务器内部错误,响应状态码为"Internal Server Error"
502:代理服务器从后端服务器收到了一条伪响应,响应状态码为"Bad Gateway"
503:服务器当前不能够处理客户端的请求,在一段时间之后,响应状态码为"Service"
reason-phrass:解释status状态码的情况,你成功了,是什么成功了,你失败了,是什么失败了,是获取文件成功/失败还是上传文件成功/失败等等。
headers:用来标记请求或响应的属性
每个请求或响应报文可包含任意个首部;
每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值
格式:Name: Value
首部的分类:
通用首部:可用在请求报文和响应报文中,常见的内容如下:
Date:报文的创建时间
Connection:连接状态,如keep-alive,close等
Via:显示报文经过的中间节点
Cache-Control:控制缓存的生效方法和机制
请求首部:只能在请求报文中使用,常见的内容如下:
Accept:通知服务器客户端可以接受的媒体类型
Accept-Charset:通知服务器客户端可以接受的字符集
Accept-Encoding:通知服务器客户端可以接受的内容编码格式,如gzip
Accept-Language:通知服务器客户端可以接受的语言
Client-IP:客户端的IP
Host:请求的服务器名称和端口号
Referer:包含当前正在请求的资源的上一级资源
User-Agent:客户端代理
条件式请求首部:
Expect:期望服务器端发什么信息
If-Modified-Since:自从此处指定的时间之后请求的资源是否发生修改
If-Unmodified-Since:自从此处指定的时间之后请求的资源是否未发生修改
If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的ETag不匹配
If-Match:本地缓存中存储的文档的Etag是否与服务器文档的Etag匹配
安全请求首部:
Authorization:向服务器发送认证信息,如帐号和密码
Cookie/Cookie2:客户端向服务器发送cookie
代理请求首部:
Proxy-Authorization:向代理服务器认证
响应首部:只能在响应报文中使用
信息性:
Age:响应持续时长
Server:服务器程序软件名称和版本
协商首部:某资源有多种表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型
Vary:服务器查看的其它首部列表
安全响应首部:
Set-Cookie:向客户端设置cookie
Set-Cookie2:向客户端设置cookie2
WWW-Authenticate:来自服务器的对客户端的质询认证表单
实体首部:标识实体的相关信息
Allow:列出对此实体可使用的请求方法
Location:告诉客户端真正的实体位于何处
Content-Encoding:内容的编码格式
Content-Language:内容使用的语言
Content-Length:主体的长度
Content-Location:实体真正所处的位置
Content-Type:主体的对象类型
缓存相关:
ETag:实体的扩展标签
Expires:实体的过期时间
Last-Modified:最后一次修改的时间
扩展首部
entity-body:请求时附加的数据或响应时附加的数据,有可能为空
请求报文示例:
GET / HTTP/1.1HOST:www.baidu.comConnection:keep-alive
响应报文示例:
HTTP/1.1 200 OKX-Powered-By:PHP/5.2.17Vary:Accept-Encoding,Cookie,User-AgentCache-Control:max-age=3,must-revalidateContent-Encoding:gzipContent-Length:6931
12.7 http周边
常见的协议查看、分析的工具:
tcpdump
tshark
wireshark
常见的http服务器程序:
httpd(apache)
nginx
lighttpd
应用程序服务器:可以处理动态文件
IIS
tomcat,jetty,jboss,resin
webshpere,weblogic,oc4j
常用的http压力测试工具:
ab:
语法:ab [options] URL
-n:总的请求数
-c:模拟的并发数
-k:以持久连接模式测试
webbench
http_load
jmeter
loadrunner
tcpcopy
ulimit -n #:调整当前用户所能够同时打开的文件数
web服务器资源路径映射方式:
docroot
alias
虚拟主机docroot
用户家目录docroot
并发访问响应模型(Web I/O):此处假定每个进程内只有一个线程
单进程I/O结构:启动一个进程处理请求,而且一次只处理一个,多个请求被串行响应
多进程I/O结构:并行启动多个进程,每个进程响应一个请求
复用I/O结构:一个进程响应多个请求
多线程模型:一个进程生成多个线程,每个线程响应一个用户请求
事件驱动
复用的多进程I/O结构:启动多个(m)进程,每个进程响应n个请求
12.8 https
https其实就是将ssl或tls应用于http协议的结果,https监听于tcp/443端口
ssl会话的简化过程如下:
(1)客户端发送可供选择的加密方式,并向服务器请求证书
(2)服务器端发送证书以及选定的加密方式给客户端
(3)客户端取得证书并进行证书验证
如果信任给其发证书的CA:
a) 验证证书来源的合法性:用CA的公钥解密证书上的数字签名
b) 验证证书内容的合法性:完整性验证
c) 检查证书的有效期限
d) 检查证书是否被吊销
e) 证书中拥有者的名字,与访问的目标主机要一致
(4)客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
(5)服务器用密钥加密用户请求的资源,响应给客户端
注意:SSL会话是基于IP地址创建,所以单IP的主机上,仅可以使用一个https虚拟主机
WEB服务器的主要操作:
建立连接--接受或拒绝客户端连接请求;
接收请求--通过网络读取HTTP请求报文;
处理请求--解析请求报文并做出相应的动作;
访问资源--访问请求报文中相应的资源;
构建响应--使用正确的首部生成HTTP响应报文;
发送响应--向客户端发送生成的响应报文;
记录日志--当已经完成的HTTP事务记录进日志文件