HTTP学习
HTTP简介
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,顾名思义一开始它是为了解决超文本传输问题,之后运用到各种场景。HTTP正式作为标准被公布是在1996年,版本被命名为HTTP/1.0,并记载于RFC1945,1997年公布的HTTP/1.1是目前主流的HTTP协议版本,当初的标准是RFC2068,之后发布了修订版RFC2616。
TCP/IP协议簇
通常使用的网络是在TCP/IP协议簇的基础上运作的,HTTP属于它内部的一个子集。所以让我们先从整体角度入手,了解下网络基础。
TCP/IP协议簇具有分层的特点,分为以下4层:
层次 | 作用 | 对应协议 |
---|---|---|
应用层 | 提供向用户提供应用服务时通信的活动 | HTTP、DNS、FTP等 |
传输层 | 提供处于网络连接中的两台计算机之间的数据传输 | TCP、UDP |
网络层 | 用来处理在网络上流动的数据包 | IP |
数据链路层 | 用来处理连接网络的硬件部分 | – |
下图能够让人更直观地理解HTTP与TCP/IP协议簇的其他协议的关系。
HTTP协议
HTTP协议用于服务端和客户端的通信,客户端发送请求,服务端进行响应,客户端使用方法下达命令和服务端进行交互。
HTTP方法
- GET
请求访问已被URI识别的资源 - POST
传输实体主体 - PUT
传输文件 - HEAD
获取首部,确认URI的有效性及资源更新的日期时间等。 - DELETE
删除文件 - OPTIONS
查询针对请求URI指定的资源支持的方法。(如果是对服务器本身发起请求,可用一个*代替URI) - TRACE
让Web服务器端将之前的请求通信环回给客户端的方法。一般搭配Max-Forwards首部进行使用。 - CONNECTION
要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。
协议特点
- 持久连接
初始的HTTP协议中TCP是短连接,HTTP/1.1和一部分的HTTP/1.0提出了持久连接(HTTP Persistent Connections,也称为HTTP keep-alive或HTTP connectionreuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。这样做减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载,另外Web页面的显示速度也相应提高了。 - 使用Cookie的状态管理
HTTP是一种不保存状态、即无状态协议。这是为了更快地处理大量事务,确保协议的可伸缩性。所以为了实现期待的保存状态功能,引入了Cookie技术:通过在请求和响应报文中写入Cookie信息来控制客户端状态。
HTTP报文
报文结构
用于HTTP协议交互的信息被称为HTTP报文,分为请求报文(客户端发给服务端)、响应报文(服务端发给客户端),大致上由报文首部和报文主体组成。
请求报文:
其中请求行=用于请求的方法+请求URI+HTTP版本
响应报文:
其中状态行=表明响应结果的状态码+原因短语+HTTP版本
报文首部
格式为首部字段名:字段值,可有多个字段值,用逗号隔开。
- 通用首部字段
即请求报文和响应报文都会使用的首部。 - 请求首部字段
- 响应首部字段
- 实体首部字段
- 其他首部字段
HTTP状态码
常见状态码:
- 100 Continue
表示目前为止一切正常, 客户端应该继续请求, 如果已完成请求则忽略. - 101 Switching Protocols
表示服务器应客户端升级协议的请求(Upgrade请求头)正在进行协议切换。 - 200 OK
从客户端发来的请求被服务端正确处理。 - 204 No Content
代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。 - 206 Partial Content
表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求 - 301 Moved Permanently
永久性重定向。表示请求的资源已被分配了新的URI,如果已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的URI重新保存。 - 302 Found
临时性重定向。表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。 - 303 See Other
表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。303状态码明确表示客户端应当采用GET方法获取资源,这点与301、302状态码有区别。 - 304 Not Modified
表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304 Not Modified。我的理解是服务器端资源未改变,重定向至使用客户端未过期的缓存。 - 307 Temporary Redirect
临时重定向。类似 302,区别在于能够确保请求方法和消息主体不会发生改变。 - 308 Permanent Redirect
永久重定向。类似 301,区别在于能够确保请求方法和消息主体不会发生改变。 - 400 Bad Request
表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。 - 401 Unauthorized
表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。这个状态码会与 WWW-Authenticate 首部一起发送,其中包含有如何进行验证的信息。Authorization 请求消息头含有服务器用于验证用户代理身份的凭证,通常会在服务器返回401 Unauthorized 状态码以及WWW-Authenticate 消息头之后在后续请求中发送此消息头。 - 403 Forbidden
表明对请求资源的访问被服务器拒绝了。可以在实体主体内描述拒绝原因。 - 404 Not Found
表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。 - 405 Method Not Allowed
表明服务器禁止了使用当前 HTTP 方法的请求。需要注意的是,GET 与 HEAD 两个方法不得被禁止。 - 410 Gone
说明请求的内容在服务器上不存在了,同时是永久性的丢失。如果不清楚是否为永久或临时的丢失,应该使用404。 - 500 Internal Server Error
表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。 - 503 Service Unavailable
表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端。
HTTPS
HTTP协议也存在着一些问题,如通信使用明文、无法验证通信方身份以及无法证明报文完整性等。针对这些问题,HTTPS应运而生。可理解为HTTP+加密+认证+完整性保护=HTTPS。
HTTPS并不是什么新协议,只是HTTP通信接口部分用SSL(SecureSocket Layer)和TLS(Transport Layer Security)协议代替而已。
基于HTTP的功能追加协议
HTTP协议也存在着一定的缺陷,如:
●一条连接上只可发送一个请求。
●请求只能从客户端开始。客户端不可以接收除响应以外的指令。
●请求/响应首部未经压缩就发送。首部信息越多延迟越大。
●发送冗长的首部。每次互相发送相同的首部造成的浪费较多。
●可任意选择数据压缩格式。非强制压缩发送。
Ajax的解决办法是利用JavaScript和DOM(Document Object Model,文档对象模型)的操作,以达到局部Web页面替换加载的异步通信手段。这样做只是减少了响应的通信量。
Comet是采取服务器端有内容更新后直接给客户端返回响应。这是一种通过延迟应答,模拟实现服务器端向客户端推送(Server Push)的功能。虽然可以减少大量请求,但一次连接的持续时间也变长了。
SPDY
SPDY没有完全改写HTTP协议,而是在TCP/IP的应用层与传输层之间通过新加会话层的形式运作。同时,考虑到安全性问题,SPDY规定通信中使用SSL。
使用SPDY后,HTTP协议额外获得以下功能。
多路复用流
赋予请求优先级
压缩HTTP首部
推送功能
WebSocket
WebSocket,即Web浏览器与Web服务器之间全双工通信标准。由于是建立在HTTP基础上的协议,因此连接的发起方仍是客户端,而一旦确立WebSocket通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文。
WebSocket具有推送功能以及减少通信量等主要特点。为了实现WebSocket通信,在HTTP连接建立之后,需要完成一次“握手”(Handshaking)的步骤。请求时用到Upgrade首部字段,响应用到101状态码。
WebDAV
WebDAV(Web-based Distributed Authoring and Versioning,基于万维网的分布式创作和版本控制)是一个可对Web服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统。它作为扩展HTTP/1.1的协议定义在RFC4918。这个协议也新增了一些相关方法与状态码。
HTTP/1.1和HTTP/2.0
HTTP/2.0在基于HTTP/1.1的基础上升级了多路复用、服务器推送、数据压缩等功能。
注:本文图源《图解HTTP》。