一、HTTP协议简介
1.HTTP概述
HTTP(Hyper Text Transfer Protocol,超文本传输协议),是一个属于应用层的面向对象的协议。用于从万维网(World Wide Web )服务器传输超文本到本地浏览器的传送协议,客户端通过使用网页浏览器或者其它的工具发起一个HTTP请求到服务器上指定端口,服务器在收到请求之后,返回响应内容(文本、图片等)。可以说Web是建立在HTTP协议上通信的。
2.HTTP发展历程
HTTP/0.9
HTTP于1990年问世,但那时HTTP并没有作为正式的标准被建立。
HTTP/1.0
HTTP正式作为标准被公布是在1996年5月,版本被命名为HTTP/1.0,并记载于RFC1945。HTTP 1.0引入了POST和HEAD命令,增强了交互功能,但规定浏览器与服务器只保持短暂的连接,连接成功后只能发送一次请求,然后连接就断开了,如果需要多次请求,需要多次连接。正式因为这种特性造成了一些性能上的缺陷。
HTTP/1.1
1997年1月公布的HTTP/1.1是目前主流的HTTP协议版本,记载于RFC2616。HTTP 1.1支持持久连接,默认TCP连接不关闭,可以被多个请求复用,减少了建立和关闭连接的消耗和延迟,并且新增了更多的请求方式。
HTTP/2.0
2015年5月,HTTP/2发布,记载于RFC7540,主要解决了HTTP1.1的效率不高的问题,新增特性有:二进制协议、多工、数据流、头信息压缩等等功能。
二.HTTP基础——TCP/IP
通常使用的网络是在TCP/IP协议族的基础上运作的,而HTTP协议属于它内部的一个子集。TCP/IP协议族按层次可分为:应用层、传输层、网络层和数据链路层。HTTP协议位于TCP/IP协议栈的应用层。
发送端在层与层之间进行数据传输时,从应用层往下走,每经过一层就会被加上上一层的首部信息;接收端在层与层之间进行数据传输时,从数据链路层往上走,每经过一层,便会把相应的首部去掉。
三.HTTP报文
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。
HTTP报文结构
通用首部字段
Cache-Control:控制缓存行为
Connection:链接的管理
Date:报文日期
Pragma:报文指令
Trailer:报文尾部的首部
Trasfer-Encoding: 指定报文主体的传输编码方式
Upgrade:升级为其他协议
Via:代理服务器信息
Warning:错误通知
实体首部字段
Allow 资源可支持的HTTP方法
Content-Encoding 实体的编码方式
Content-Language 实体的自然语言
Content-Length 实体的内容大小(字节为单位)
Content-Location 替代对应资源的URI
Content-MD5 实体的报文摘要
Content-Range 实体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体过期时间
Last-Modified 资源的最后修改时间
请求报文
请求方法
1.GET:获取资源
GET方法向指定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
2.POST:传输实体主体
POST方法向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
3.PUT:传输文件
PUT方法用来传输文件,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
4.HEAD:获得报文首部
HEAD方法和GET方法一样,只是不返回报文主体部分。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
5.DELETE:删除文件
DELETE方法用来删除文件,与PUT方法相反。DELETE方法按请求URL删除指定的资源。
6.OPTIONS:询问支持的方法
OPTIONS方法用来查询并返回服务器针对特定资源所支持的HTTP请求方法。
7.TRACE:追踪路径
TRACE方法是让Web服务器端将之前的请求通信返回给客户端的方法,主要用于测试或诊断。
8.CONNECT:要求用隧道协议连接代理
CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。
重点:GET方法和POST方法的区别
- GET方法是从服务器上获取数据,POST方法是向服务器传送数据。
- POST方法比GET方法安全,因为数据在地址栏上不可见。
- GET方法提交的数据最多只能有1024字节,而POST方法则没有此限制。
请求首部字段
Client-IP:提供了运行客户端的机器的IP地址
From:提供了客户端用户的E-mail地址
Host:给出了接收请求的服务器的主机名和端口号
Referer:提供了包含当前请求URI的文档的URL
UA-Color:提供了与客户端显示器的显示颜色有关的信息
UA-CPU:给出了客户端CPU的类型或制造商
UA-OS:给出了运行在客户端机器上的操作系统名称及版本
User-Agent:将发起请求的应用程序名称告知服务器
Accept:告诉服务器能够发送哪些媒体类型
Accept-Charset:告诉服务器能够发送哪些字符集
Accept-Encoding:告诉服务器能够发送哪些编码方式
Accept-Language:告诉服务器能够发送哪些语言
TE:告诉服务器可以使用那些扩展传输编码
Expect:允许客户端列出某请求所要求的服务器行为
Range:如果服务器支持范围请求,就请求资源的指定范围
Cookie:客户端用它向服务器传送数据
响应报文
状态码
状态码的作用是当客户端向服务器发送请求时,描述返回的请求结果,根据结果,用户可以知道服务器是正常处理了请求,还是出现了错误。
状态码的类别及常用状态码
-
100~199(信息性状态码)
100 Continue 继续。客户端应继续其请求。 101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议。
-
200~299(成功状态码)
200 OK 请求成功。表示从客户端发来的请求在服务器被正常处理了。一般用于GET与POST请求。 204 No Content 无内容。服务器成功处理,但在返回的响应报文中不含实体的主体部分。 206 Partial Content 部分内容。服务器成功处理了部分GET请求。
-
300~399(重定向状态码)
301 Moved Permanetly 永久性重定向。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 302 Found 临时性重定向。该状态码表示请求的资源被分配了新的URI,希望用户本次能使用新的URI访问 303 See Other 查看其它地址。该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。 304 Not Modified 未修改。表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304Not Modified,不包含任何响应的主体部分。 307 Temporary Redirect 临时性重定向。与302类似,307会遵照浏览器标准,不会从POST变成GET。
-
400~499(客户端错误状态码)
400 Bad Request 客户端请求的语法错误,服务器无法理解。 401 Unauthorized 请求要求用户的身份认证。 403 Forbidden 表明对请求资源的访问被服务器拒绝了。 404 Not Found 服务器无法根据客户端的请求找到资源。
-
500~599(服务器错误状态码)
500 Internal Server Error 服务器内部错误,无法完成请求 503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。
响应首部字段
Age:推算资源创建经过的时间
Public:服务器为其资源支持的请求方法列表
Retry-After:如果资源不可用的话,在此日期或时间重试
Server:HTTP服务器的安装信息
Title:对HTML文档来说,就是HTML文档的源端给出的标题
Warning:比原因短语更详细一些的警告报文
Accept-Ranges:对此资源来说,服务器可接受的范围类型
Vary:代理服务器缓存的管理信息
Proxy-Authenticate:来自代理的对客户端的质询列表
Set-Cookie:在客户端设置数据,以便服务器对客户端进行标识
WWW-Authenticate:服务器对客户端的认证信息
四.HTTP的缺点
- 通信使用明文(不加密),内容可能会被窃听。
- 不验证通信双方的身份,因此有可能遭遇伪装。
- 无法证明报文的完整性,所以可能已篡改。
HTTPS
HTTPS = HTTP + 加密 + 认证 + 完整性保护
加密处理防止被窃听
HTTP协议中没有加密机制,但可以通过SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全传输层协议)的组合使用,加密HTTP的通信内容。
查明对方的证书,确定通信方
HTTP协议无法确定通信方,但如果使用SSL则可以。SSL不仅提供加密处理,而且还使用了一种被称为证书的手段,用于确定通信方。
证明报文的完整性,防止篡改
最常用的是MD5和SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法。
五.参考
《图解HTTP》 [日]上野宣