HTTP协议及HTTPS

pre:先发一些参考文档:

HTTP/1.1 RFC2616中英文版算法

http长链接短链接及轮询浏览器

1、HTTP协议简介

HTTP(HyperText Transfer Protocol,超文本传输协议)是基于可靠传输的应用层协议,在互联网上应用很是普遍。绝大部分网络请求都是基于HTTP,乃至当前应用普遍的音视频传输,也有很大一部分是基于HTTP。缓存

  • 注:(对于此处的可靠传输,是因为HTTP假定其下层协议提供的数据传输可靠,一般在网络应用中是基于TCP协议,但实际上HTTP并未指定必须基于TCP传输
  • 注:(对于此处的应用层协议,是因为HTTP只规定客户端和服务器之间的通讯方式,默认使用80端口,但并未规定具体的链接方式,也未指定数据包如何传输。因此,所谓的“HTTP链接”都是通俗而又错误的说法,由于HTTP未指定如何创建链接,如何断开链接。对于一个应用层协议来讲,咱们应该关注的是HTTP请求及HTTP响应,链接是传输层应该关注的事情。)

2、HTTP协议演变

  • 前身:1960年Ted Nelson构思的经过计算机处理文本信息的方法,即hypertext。
  • HTTP/0.9于1990年正式发布,用于网络上原始数据传输。
  • HTTP/1.0于1996年在RFC 1945中提出,容许消息以类MIME格式传送,但对分层代理、缓存、持久链接、链接复用、虚拟主机需求等无规定。
  • HTTP/1.1于1999年在RFC 2616中提出,主要是对HTTP/1.0中的一些问题进行了优化。好比默认使用持久链接及链接复用,缓存处理,带宽优化及网络链接使用,错误通知,消息发送,互联网IP维护,安全性等。
  • HTTP/2于2015年在RFC 7540中提出,是基于Google提出的SPDY协议进行了进一步开发和完善。主流浏览器支持良好,主要在减小网络延迟方面拥有更好的特性。在各个网络应用场景中,(虽然HTTP/2未强制要求数据加密),但各个客户端均采用只支持经过TLS加密的方式,致使HTTP/2实际上基于HTTPS(Hypertext Transfer Protocol Secure, HTTP over TLS)成为一个业内事实标准

当前使用状况:听说,HTTP/1.0仍旧在一些古老的网络设备(尤为是代理服务器)上使用;HTTP/1.1的使用在互联网应用中占据了大部分,在服务器上的部署尤其普遍;HTTP/2的使用主要是在网页请求上,有统计数据称截至2018年大约40%~50%的网站使用了HTTP/2。安全

3、HTTP请求及响应

3.1 请求REQUEST

HTTP请求消息结构

图1、HTTP请求消息结构
  • 第一部分:请求行,用来讲明请求方法类型、要访问的资源及所使用的HTTP版本【必须】;
  • 第二部分:请求头部,紧接着请求行以后的部分,用来记录服务器所需信息【必须】;
  • 第三部分:空行,请求头部后面的空行【必须】;
  • 第四部分:主体,自定义【非必须】

HTTP/1.1规定了8种请求方法(其中GET/HEAD两种为服务器必须支持的),以下所示。“请求request”是指由客户端向服务器发起的一种通讯方式。此外,服务器能够扩展自定义方法:服务器

方法名称 注释
GET 向服务器上指定的资源发出“显示”请求,只用于读取数据。服务器会返回HEADER和BODY【必须实现】
HEAD 向服务器上指定资源发出“显示”请求,仅用于读取。服务器只返回元数据,不包括资源的本文部分【必须实现】
POST 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会建立新的资源或修改现有资源,或两者皆有
PUT 向指定资源位置上传其最新内容
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 回显服务器收到的请求,主要用于测试或诊断
OPTIONS 使服务器传回该资源所支持的全部HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,能够测试服务器功能是否正常运做
CONNECT HTTP/1.1协议中预留给可以将链接改成管道方式的代理服务器。一般用于SSL加密服务器的连接(经由非加密的HTTP代理服务器)

3.2 响应RESPONSE

HTTP响应消息结构

图2、HTTP响应消息格式
  • 第一部分:状态行,包括HTTP版本号,状态码,状态消息【必须】;
  • 第二部分:响应报头,用来讲明客户端解析响应时要使用的一些信息【必须】;
  • 第三部分:空行,消息报头后的空行【必须】;
  • 第四部分:响应实体,服务器返回的消息主体【非必须】

3.3 状态码

全部的状态码都是三位数字,有对应的状态消息。除了RFC 2616中规定的状态消息,开发人员仍能够自定义某个状态码对应的消息内容,不过服务端和客户端须要约定好。网络

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——须要后续操做才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者没法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

具体状态码信息——红色和橙色为错误状态码,加粗为经常使用状态码oop

状态码 状态消息(缘由) 备注
100 Continue 继续
101 Switching Protocols 协议切换,服务端建议客户端更换协议
102 Processing 处理中,防止客户端超时
200 OK 成功返回
201 Created 当前请求已经被实现且有一个新资源已经根据请求须要被创立
202 Accepted 服务器已接受请求,但还没有处理。最终该请求可能会也可能不会被执行,而且可能在处理发生时被禁止
203 Non-Authoritative Information 未认证信息,服务器是一个转换代理服务器,以200 OK状态码为起源,但回应了原始响应的修改版本
204 No Content 服务器成功处理请求,没有返回任何内容
205 Reset Content 服务器成功处理了请求,但没有返回任何内容。与204响应不一样,此响应要求请求者重置文档视图
206 Partial Content 服务器已经成功处理了部分GET请求。用于断点续传之类的
207 Multi-Status 表明以后的消息体将是一个XML消息,而且可能依照以前子请求数量的不一样,包含一系列独立的响应代码
208 Already Reported DAV绑定的成员已经在(多状态)响应以前的部分被列举,且未被再次包含
226 IM Used 服务器已经知足了对资源的请求,对实体请求的一个或多个实体操做的结果表示
300 Multiple Choices 被请求的资源在服务器上有一系列可供选择的资源,除非请求为HEAD请求,不然响应实体中应包括资源特性及地址的列表。服务器亦能够指定首选的资源。响应可缓存
301 Moved Permanently 资源被永久移动到新位置。除非是HEAD请求,不然响应实体中应包含新URI的超连接及简短说明。若是不是GET/HEAD请求,浏览器应禁止自动重定向。响应可缓存
302 Found 临时重定向(本次)。除非是HEAD请求,不然响应实体内应包含新的URI及简短说明。若是不是GET/HEAD请求,浏览器应禁止自动重定向。响应通常不可缓存
303 See Other 对应请求的响应能够重定向到另外一个URI,相似302,主要为了容许由脚本激活的POST请求输出重定向到新资源。303响应禁止被缓存
304 Not Modified 表示资源在由请求头中的If-Modified-Since或If-None-Match参数指定的这一版本以后,不曾被修改
305 Use Proxy 被请求的资源必须经过指定的代理才能被访问
306 Switch Proxy 目前新规范不使用该状态码
307 Temporary Redirect 在这种状况下,本次请求应该用另外一个URI重复,但后续的请求应仍使用原始的URI。与302相反,当从新发出原始请求时,不容许更改请求方法
308 Permanent Redirect 本次请求和后续请求都应用另外一个URI重复或替换
400 Bad Request 客户端错误致使错误的请求
401 Unauthorized 用户的请求未经过认证(所请求资源需认证)
402 Payment Required 通常不用。预留用来让请求人员付费的
403 Forbidden 服务器已理解请求但拒绝执行,能够在响应实体中描述拒绝缘由。不建议重复该请求
404 Not Found 请求失败,或所请求资源未在服务器上发现,但容许后续请
405 Method Not Allowed 请求方法与所对应的资源不匹配。好比用GET请求某个需POST的表单资源
406 Not Acceptable 请求的资源的内容特性没法知足请求头中的条件,于是没法生成响应实体,该请求不可接受
407 Proxy Authentication Required 客户端需先在代理服务器上进行身份验证
408 Request Timeout 请求超时,超过服务器等待时间
409 Conflict 存在冲突没法处理该请求,好比多个同步更新的编辑请求
410 Gone 通常不用,表示该资源再也不可用
411 Length Required 客户端请求未标明Content-Length
412 Precondition Failed 服务器在验证在请求的头字段中给出先决条件时,没能知足其中的一个或多个
413 Request Entity Too Large 因为请求提交的实体数据大小超服务器预期,因此拒绝响应。若允许客户端重试,响应中应携带Retry-After
414 Request-URI Too Long 因为请求的URI长度超出服务器解释长度而拒绝响应
415 Unsupported Media Type 请求中提交的某资源格式,不符合服务器指定的格式
416 Requested Range Not Satisfiable 服务器未涵盖客户端请求所要求的资源范围
417 Expectation Failed 请求中期待的资源没法被服务器知足
420 Enhance Your Caim Twitter Search与Trends API在客户端被限速的状况下返回
421 Misdirected Request 服务器没法产生响应(例如由于链接重用)
422 Unprocessable Entity 请求格式正确但有语义错误
423 Locked 当前资源被锁定
424 Failed Dependency 因为以前某个请求错误,致使当前请求失败
425 Unordered Collection 目前未使用的状态码
426 Upgrade Required 客户端应当切换到TLS/1.0,并在HTTP/1.1 Upgrade header中给出
428 Precondition Required 原服务器要求该请求知足必定条件,防止“未更新”,即客户端所操做资源与第三方改写发生冲突
429 Too Many Requests 客户端在某段时间内发送请求过多
431 Request Header Fields Too Large 请求头部中一个或多个字段过大
444 No Response Nginx上HTTP扩展,服务端主动关闭链接
450 Blocked by Windows Parental Controls Microsoft扩展,用于信息和测试
451 Unavailable For Legal Reasons 该访问因法律的要求而被拒绝
494 Request Header Too Large 431码提出前用于Nginx服务器
500 Internal Server Error 服务器发生不可预期的错误
501 Not Implemented 服务器不支持当前请求所须要的某个功能
502 Bad Gateway 做为网关或者代理工做的服务器尝试执行请求时,从上游服务器接收到无效的响应
503 Server Unavailable 服务器临时维护或过载致使没法处理请求,暂时的,响应中应包含Retry-After
504 Gateway Timeout 做为网关或者代理工做的服务器尝试执行请求时,未能及时从上游服务器或辅助服务器收到响应
505 HTTP Version Not Supported 服务器不支持当前请求中的HTTP版本
506 Variant Also Negotiates 服务器存在内部配置错误
507 Insufficient Storage 服务器没法存储完成请求所必须的内容。这个情况被认为是临时的
508 Loop Detected 服务器在处理请求时陷入死循环
510 Not Extended 服务器未支持获取该请求资源时所需策略
511 Network Authentication Required 客户端须要进行身份验证才能得到网络访问权限,旨在限制用户群访问特定网络

4、HTTP请求流程解析

  • 客户端与服务器创建TCP链接
  • 客户端发送HTTP请求
  • 服务器接收请求,定位资源,构建响应,经过TCP通道返回响应
  • 按需关闭或保持TCP链接(keep-alive则不会此时关闭)
  • 客户端解析请求

5、HTTP中的缓存

单独把缓存机制做为一个模块列出来,是由于在HTTP请求和响应中,使用缓存技术实在太常见&&重要了!!HTTP中的缓存主要为了(在合理场景下)尽量减小发送请求和发送完整的响应,这对于减轻服务器的负载以及节省客户端带宽有很重要的做用。测试

HTTP中缓存机制须要下降语义透明性要求。但这要求在整个请求——缓存——响应的结构中,客户端始终可以发现任何语义透明性的潜在放松规则。(总之就是,无论下降语义透明性是由客户端/缓存/服务器中任意一方执行,最终客户端都知道。)设计HTTP缓存机制中各端的时候,必须严格遵照优化

  • 缓存基本机制——用于响应的缓存必须是最新的,等价于当前服务器应该给出的响应。若缓存模块此时没法与服务器通讯,除非已缓存的响应肯定是请求所需,不然应返回一个错误或警告;若缓存模块从服务器接收到某个已过时的响应,应直接转发给客户端(不添加警告,但也不移除已有警告),且不会由于响应过时而向服务器重复该请求。警告在某个响应既不是最新获取,也不在保鲜期内时必须添加。Cache-control字段是用于服务器或客户端给缓存模块显式的指令。在缓存机制中,客户端能够显式要求不使用缓存,但是设置某个响应的最大保鲜期,能够显式要求缓存模块定时验证某个请求,等等。
  • 缓存过时——缓存机制是指在保鲜期内由缓存模块代替源服务器向客户端返回某个请求的响应。服务器能够指定某个请求的显式过时时间,能够强制缓存模块老是不断验证该缓存项,但只做用于服务器缓存模块而非用户代理。除了显式的过时时间,还能够用启发式过时时间算法。
  • 验证模型——是指缓存模块利用超过保鲜期的缓存项做为响应以前,应利用缓存验证器向源服务器或拥有最新响应的中间缓存对此内容进行验证。验证时无需重传整个响应内容。
  • 构建响应——有时候缓存模块是简单转发源服务器的响应,但有时候须要根据必定规则构建响应。
  • 标记缓存无效——若是源服务器上某资源已变动,须要使用“invalidate an entity”来让缓存删除某个实体,或标记为无效
  • 强制写经过——除了GET/HEAD外,全部对源服务器资源的操做都须要先通过缓存模块对源服务器的写操做,不过此时缓存模块能够先发一个100响应。
  • 缓存替换——接收到服务端响应的一个新的可缓存资源,除非其Date域值比当前缓存的更旧,不然应替换缓存内容。
相关文章
相关标签/搜索