HTTP协议

HTTP(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端进行资源请求和应答的标准。

HTTP方法

get 获取资源

GET方法用来请求访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。如果请求的资源是文本,那就保持原样返回;如果是像CGI那样的程序,则返回经过执行后的输出结果。

post 传输实体主体

POST方法用来传输实体的主体。虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法。虽说POST的功能与GET很相似,但POST的主要目的并不是获取相应的主体内容。

head 获得报文首部

HEAD方法与GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。

option 询问支持的方法

用来查询这对请求URI指定的资源支持的方法。

GET与POST的区别

参考:GET请求和POST请求的区别 HTTP方法:GET对比POST

  • 在HTTP/1.1中,get被强制服务器支持,即服务器必须实现get方法
  • 浏览器对URL的长度有限制,所以GET请求不能代替POST请求发送大量数据
  • POST请求相对GET请求是相对安全的。因为get请求会将数据添加到url后,普通人都可以看到。而post则需要进行抓包才可以看到。所以说相对安全。
  • 在规范的定义下,GET操作不会修改服务器的数据

HTTP首部字段

HTTP报文主要由报文首部和报文主体构成(中间以空行分界)。请求报文首部由请求行(方法 URI HTTP版本)、请求首部字段、通用首部字段、实体首部字段和其他首部组成。响应报文首部由状态行(HTTP版本 状态码)、响应首部字段、通用首部字段、实体首部字段和其他首部组成。

通用首部字段

  • Cache-Control 控制缓存的行为,更多请查看百度百科
Cache指令 说明
public 所有内容都将被缓存(客户端和代理服务器都可缓存)
private 内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)
no-store 所有内容都不会被缓存到缓存或 Internet 临时文件中
must-revalidation/proxy-revalidation 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证
max-age=xxx (xxx is numeric) 缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高
no-cache 必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag),no-cache会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。
  • Connection:管理持久连接、控制不再转发给代理的首部字段。Keep-Alive:持久连接,HTTP/1.1版本和2.0版本都默认持久连接,在遇到Connection为close时,才会断开连接。
  • Date:表明创建HTTP报文的日期和时间。
  • Pragma:与HTTP/1.0兼容的字段,设为no-cache要求所有的中间服务器不返回缓存的资源。
  • Transfer-Encoding:规定传输报文主体时采用的编码方式。如gzip、chunked等
  • Upgrade:用于检测HTTP协议及其他协议是否可使用更高的版本进行通信。使用方法为:Upgrade:TLS/1.0 Connection:Upgrade

请求首部字段

  • Accept:能够处理的媒体类型及媒体类型的相对优先级,如text/html、text/css、image/png等
  • Accept-Encoding:支持的内容编码及内容编码的优先级,如gzip、compress等
  • Accept-Language:支持的自然语言集及相对优先级,如zh-cn、en-us等
  • Host:虚拟主机运行在同一个IP上时,使用Host加以区分
  • If-Modified-Since:如果在该字段指定的日期后,资源发生了更新,服务器会接收请求
  • If-None-Match:如果没有该Etag相匹配,处理该请求。可在get或head方法中使用它可获取最新的资源。
  • Referer:会告知服务器请求的原始资源的URI,即哪个web页面发起的请求。
  • User-Agent:创建请求的浏览器和用户代理名称等信息

响应首部字段

  • Etag:每个资源的唯一性标识,资源更新,则Etag更新。
  • Location:配合3**重定向响应,提供重定向的URI。
  • Server:服务器上安装的HTTP服务器应用程序的信息。

实体首部字段

  • Allow:服务器支持的所有HTTP方法,使用option方法可返回该字段
  • Content-Encoding:实体的主体部分选用的内容编码方式。
  • Content-Language:如zh-CN
  • Content-Length:实体主体部分的大小(单位为字节)
  • Content-Type:实体主体内对象的媒体类型。如text/html等
  • Expires:资源失效的日期
  • Last-Modified:资源最后修改的时间

其他

  • Set-Cookie:status=enable;expires:Tue,05 Jul 2011 07:26:31 GMT;path=/;domain:.hackr.jp;(NAME=VALUE以及失效期、目录、域名等)Secure表示仅在HTTPS下才发送Cookie,HttpOnly,表示Cookie不能被JavaScript脚本访问。
  • Cookie:发送cookie名称及相应的值
  • X-XSS-Protection:针对跨站脚本攻击(XSS)的一种对策。0:将XSS过滤设置成无效状态;1:有效状态

常用TTTP码

1xx

  • 101 转换协议

    2xx成功

  • 200:服务器已成功处理了请求并提供了请求的网页。
  • 204:服务器成功处理了请求,但没有返回任何内容。

    3xx重定向

  • 301:请求的网页已永久移动到新位置。当URLs发生变化时,使用301代码。搜索引擎索引中保存新的URL。
  • 302:请求的网页临时移动到新位置。搜索引擎索引中保存原来的URL
  • 304:如果网页自请求者上次请求后没有更新,则用304代码告诉搜索引擎机器人,可节省带宽和开销。

    4xx客户端错误

  • 400:服务器不理解请求的语法。
  • 403:服务器拒绝请求。
  • 404:服务器找不到请求的网页。服务器上不存在的网页经常会返回此代码。
  • 410:请求的资源永久删除后,服务器返回此响应。该代码与404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时用来替代404页面代码。如果资源已永久删除,应当使用301指定资源的新位置。

    5xx服务器错误

  • 500:服务器遇到错误,无法完成请求。
  • 503:服务器目前无法使用(由于超载或停机维护)。
  • 505:HTTP版本不受支持。

域名、URL、网站名

http://mail.163.com/index.html

  • http:// 这是个协议,即http超文本传输协议,也就是网页在网上传输的协议。
  • mail 这个是服务器名,代表一个邮箱服务器
  • 163.com 这个是域名,是用来定位网站的独一无二的名字
  • mail.163.com 这个是网站名,由服务器名+域名组成
  • index.html 这个是根目录下得默认网页
  • 整体叫做URL,统一资源定位符,定位网上资源。由协议 + 服务器 + 域名 + 网页html组成

HTTP1.1

1997年,HTTP1.1问世。HTTP1.0中出现的最大问题使连接无法复用和队头阻塞问题。针对连接无法复用问题,HTTP1.1通过connection实现长连接,针对队头阻塞问题,HTTP1.1提出管线化(然而存在很多缺陷,所以并没有被广泛使用)。

客户端/服务器端

仅从一条通信路线来说,应用HTTP协议时,必定一端担任客户端角色,另一端担任服务器角色。客户端发送请求,服务器端才能响应,不能实现服务器端推送功能。为了实现服务器端推送功能,就必须使用Comet等解决方法(保留响应直到服务器内容更新)。

不保存状态的协议

HTTP是一种不保存状态的协议,但为了实现期望的保持状态功能,于是引入了Cookie技术,但是该技术在很大程度上使首部膨胀,增加了数据传输压力,进而增加延迟。

采用明文传输

首部采用明文传输,所以首部数据量大,且不安全。为保证安全,要使用HTTPS协议。

仍然存在队头阻塞问题

由于http1.1管线技术的缺陷,使用率较小。为了解决这个问题,主要使用图片合并、文件合并、内容内嵌等技术来减小请求次数,但是会导致文件粒度变大。

SPDY

SPDY针对HTTP1.1的痛点——延迟和安全性,从协议层次进行了技术改革,SPDY位于HTTP之下,TCP和SSL之上,实现了多路复用、请求优先级、header压缩、server推送、server暗示等功能,为了减少使用spdy的协商过程,SPDY规定,协商过程放到SSL协商过程中,从而避免增加延时。

HTTP2.0

由于SPDY的诞生和表现,催生了HTTP2.0的诞生。HTTP2.0最大的特点:不会改动HTTP的语义、方法、状态码、URI 及首部字段等。却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量,其核心在于新增的二进制分帧层。

首部压缩

由于cookie和user agent以及其他明文传输的头部,很容易让头部膨胀,增大了不必要的传输,所以HTTP2.0对头部进行了压缩。实现的方法为:通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的数据的大小。

多路复用

在HTTP2.0中,多个请求和响应共用一个tcp通道。一个request对应一个stream并分配一个id,这样一个连接上可以有多个stream,每个stream的frame可以随机的混杂在一起,接收方可以根据stream id将frame再归属到各自不同的request里面。同时,每个stream都可以设置优先级和依赖,以保证优先级高的stream被优先处理。

服务器推送

HTTP/2允许服务端针对客户端一个单独的请求,主动的发送(或推送)一个或者多个相关的响应。服务端推送语义上等同于服务端响应一个请求;然而,这种情况下请求也是由服务端发送的,作为一个PUSH_PROMISE帧。

HTTPS

HTTPS=HTTP+加密+认证+完整性保护,HTTPS是身披SSL外壳的HTTP,只是HTTP通信接口部分用SSL和TLS协议代替而已。
HTTPS采用混合加密机制,即使用公开密匙加密方式安全地交换在稍后的共享密匙加密中要使用的密匙,在确保交换的密匙是安全的前提下,使用共享密匙加密方式进行通信。公开密匙加密使用一对非对称的密匙——私有密匙和公开密匙,常用的公开密匙加密方法有:RSA算法、ElGamal算法等。除了加密外,还需要证明公开密匙正确性的证书,来证明公开密匙本身就是货真价实的公开密匙。
HTTPS通信步骤:

  1. 客户端发送Client Hello报文,报文中包含客户端支持的SSL的指定版本、加密组件等。
  2. 服务器可进行SSL通信时,会以Server Hello报文作为应答(包含SSL版本等),并发送证书以及公开密匙。随后发送Server Hello Done报文。
  3. 客户端验证证书,然后使用公开密匙加密共享密匙(Pre-master secret),并将其包含包Client Key Exchange报文中发送,随后发送Change Cipher Spec报文,提示服务器,此后采用Pre-master secret密匙加密。最后发送Finished报文。
  4. 服务器同样发送Change Cipher Spec报文,并发送Finished报文。
  5. SSL连接建立完成。

相关资源:
HTTP1.0 RFC
HTTP1.1 RFC
HTTP2.0 RFC
HTTP2.0那些事
HTTP2.0 中英文对照
《图解HTTP》 上野宣 著 于均良 译