HTTP协议(二)
请求访问文本或图像等资源的一端成为客户端,而提供资源相应的一端成为服务器。应用HTTP协议时,必定是一端担任客户端角色,另一端担任服务器端角色。HTTP协议请求肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。
举个简单的例子,那我们学校的教务系统举例,我使用火狐的httpfox插件去获取到请求
请求
Request-Line: 请求行,其中GET表示本次请求是GET类型,/student/html/s_index.htm 是请求访问的资源对象。HTTP/1.1表示我用的协议方案是HTTP/1.1版本
Host: 访问的主机是 yjsiw.hfut.edu.cn
User-Agent:表示我的个人信息,用的是Mac OS X 10.11版本的电脑,使用Firefox的浏览器访问的
Accept:表示告知服务器,客户端可以接受的数据类型,例如text/html格式等等
Accept-Language:表示告知服务器,客户端可以接收的语言类型,如中文,英文
Accept-Encoding:表示告知服务器,客户端可以接受的编码类型
Referer:是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。
Cookie:给服务器发送的Cookie
Connection:链接状态 keep:alive
Upgrade-insecure-Requests:“升级不安全请求(upgrade-insecure-requests)”,即在启用升级非安全请求后,HTTP会被作为HTTPS对待。许多传统网站的页面可能包含了HTTP资源请求,在启用HTTPS后页面的HTTP请求仍然给中间人劫持和监听留下了空间。然而网站开发者无需担心,浏览器会自动帮你完成安全升级
响应
Status-Line:状态行,用于告知客户端,请求的响应状态等信息,200表示服务器处理请求成功,其他的状态码,稍后的几篇博客将会介绍。OK表示200状态码的原因短语。
Content-Length:表示返回内容的长度
Content-Type:表示返回内容的类型
Last-Modified:在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是客户端请求的资源,同时有一个Last-Modified的属性标记此文件在服务器端最后被修改的时间。
Accept-Ranges:它允许服务器指明:将在给定的偏移和长度处,为资源组成部分的接受请求。该头标的值被理解为请求范围的度量单位。例如Accept-Ranges: bytes或Accept-Ranges: none
Etag:一种实体头标,它向被发送的资源分派一个唯一的标识符。对于可以使用多种URL请求的资源,Etag可以用于确定实际被发送的资源是否为同一资源。例如:ETag: ‘of86db99d97c71:5fo’
Server:服务器运行系统为Microsoft-IIS/6.0
X-Powered-By:X表示这个头是一个扩展报头,即不符合HTTP标准。Powered-By:告诉HTTP客户端引擎的请求/响应处理。
Date:提供日期和时间标志,说明报文是什么时间创建的
HTTP是不保存状态的协议
HTTP是一种不保存状态,即无状态协议,HTTP协议自身不对请求和响应之间的通信状态进行保存,这是为了更快的处理大量事务,确保协议的可伸缩性。HTTP协议虽然是无状态的协议,但是确通过cookie达到有状态。
告知服务器意图的HTTP方法
GET:获取资源
POST:传输实体主体,虽然GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法。虽说POST的功能与GET很相似,但POST的主要目的并不是获取响应的主体内容。
PUT:传输文件,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置,但是鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,所以一般WEB网站不使用该方法,若配合WEB应用程序的验证机制,或架构设计采用REST(REpresentational State Transfer,表征状态转移)标准的同类WEB网站,就可能会开放使用PUT
HEAD:获取报文首部
DELETE:删除文件,与PUT相反,也具有不安全性
OPTIONS:询问支持的方法,用来查询针对请求URI指定的资源支持的方法
TRACE:追踪路径,让WEB服务器将之前的请求通信环回给客户端的方法。客户端可以通过TRACE方法可以查询发送出去的请求是怎么样被加工修改的,但是TRACE方法本来就不常用,因为容易引起XST(Criss0Site Tracing,跨站追踪)攻击。
CONNECT:要求用隧道协议连接代理,要求在与代理服务器通信时简历隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经过网络隧道传输。
持久连接节省通信量
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。在以前通信量较小的情况下,这样使用没有多大问题,可是随着HTTP的普及,文档中包含大量的图片情况多了起来。所以每次请求一个页面,可能随后还要请求这个页面里面的其他资源,例如图片等,每次请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。
为了解决上述问题,HTTP采用了keep-alive的方法,持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
HTTP/1.1中所有的连接默认都是持久连接
持久连接使得多数请求以管线化方式发送成为可能,以前发送请求后需要等待并收到响应,才能发送下一个请求,管线化技术出现后,不用等待响应也可以直接发送下一个请求。
持久连接通过减少TCP的建立和断开的开销,从而使得WEB页面的显示速度提高。管线化,通过同一时间发送多个请求,达到WEB页面的显示速度提高。
使用Cookie的状态管理
Cookie技术是为了解决HTTP协议无状态问题而产生。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会根据从服务器端发送的响应报文内的一个叫做set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再去往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。服务器端发现客户端发送过来的Cookie后,回去检查究竟是从哪个客户端发送过来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。