HTTP

HTTP方法

HTTP方法

LINK,UNLINEHTTP1.1版本中已经废弃,不再支持。

持久连接

HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。以当年的通信情况来说,因为都是一些容量很小的文本传输,所以即使这样也没有问题。随着HTTP的普及,文档中包含大量的图片的情况就多了起来,比如:使用浏览器访问一个包含大量图片的HTML页面时,在发送请求访问HTML页面资源的时候,也会请求该HTML页面里包含的其他资源(每一张图片就要一次请求),因此,每次的请求都会造成无谓的TCP连接的断开和建立,增加资源的消耗。

为解决上述问题,在HTTP1.1和一部分HTTP1.0想出了持久连接的方法。持久连接的特点就是,只要任意一端没有明确的提出断开连接,则保持TCP连接状态。在HTTP1.1中,所有的连接默认都是持久连接。但在HTTP1.0中没有标准化。(注意:客户端和服务端都要持久连接)

管线化

从前发送请求后需要等待响应才能发送下一个请求,管线化技术出现以后,不用等待响应,直接发送下一个请求。

Cookie

HTTP是无状态协议:它不对之前的请求和响应的状态进行管理。
假设web页面的登入,因为是无状态的,所以每次跳转新的页面都需要登入一遍,这样就比较麻烦了。Cookie就是解决这个问题的,它通过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie是保存在客户端的。

Cookie

HTTP报文

用于HTTP协议交互的信息称为HTTP报文。客户端的叫做请求报文,服务端的叫做响应报文

请求报文

响应报文

报文首部:服务端或客户端需处理的请求或响应的内容及属性。
报文主体:发送的数据。
请求行:包含请求的方法,请求的URI和HTTP版本。
状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
首部字段:包含表示请求和响应的各种条件和属性的各类首部;一般有4种首部,分别是:通用首部、请求首部、响应首部、和实体首部。

编码提升传输速率

HTTP在传输数据的时候可以按照数据的原样传输,但也可以在传输的过程中通过编码提升传输速率。但是编码的操作是由计算机来完成的,因此会消耗更多的CPU等资源。

常见的内容编码格式:

  • gzip
  • compress
  • deflate(zlib)
  • identity(不进行编码)

内容协商

同一个Web网站有可能存在这多份相同的页面。比如英语版和中文版Web页面,它们的内容相同,只是语言不同。当浏览器的默认语言为中文或者英文时,访问相同的URI的Web页面,则会显示对应设置语言的Web页面。这样的机制叫做内容协商

内容协商机制是客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最合适的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。包含在请求报文中的某些首部字段就是判断的标准:

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

内容协商技术有以下三种类型:

服务器驱动协商

由服务器端进行内容的协商。以请求报文的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判断的依据,并不一定筛选出最优的内容。

客户端驱动协商

由客服端进行内容协商。用户从浏览器显示的可选项列表中手动选择。还可以利用JavaScript脚本自动切换PC版页面或者手机版页面。

透明协商

是以上两者的结合体,是由服务端和客服端各自进行内容协商的一种办法。

HTTP状态码

状态码

常见状态码

2XX的响应结果表示请求被正常的处理了。

200 OK

表示从客户端发来的请求在服务端被正常处理了。

204 No Content

表示服务器接收的请求已成功处理,但响应报文中不含有实体数据。也不允许有。一般在只需要从客户端往服务器发送信息,而客户端不需要接受信息的情况下使用。

206 Partial Content

表示客户端进行了范围请求,而服务器成功执行了这部分的请求。响应报文中包含Content-Range指定范围的实体内容。

3XX的响应结果表示需要执行某些特殊的处理后才能正确的处理请求(重定向)。

从响应报文中的响应首部字段Location获取新的URI。

301 Moved Permanently

永久重定向。表示请求的资源已被分配了新的URI。以后应该使用新的URI。

302 Found

临时重定向。表示请求的资源已被分配了新的URI。希望本次使用新的URI。URI将来还可能变化。

303 See Other

表示请求的资源存在着另一个URI,应该使用GET方法重定向获取请求的资源。与302一样都是临时重定向,但区别就是必须使用GET重新获取。

301,302标准是禁止将POST改成GET方法的,但实际上大家都会改成GET

304 Not Modified

表示客户端发送附带条件(指采用GET方法的请求报文中包含if-Match、if-modified-Since、if-None-Match、if-Range、if-Unmodified-Since中的任何一个)的请求时,服务器允许访问请求资源,但未满足条件。此时响应中没有实体数据。(可以表示资源的有效性)304虽然归在3XX中,但是它和重定向没有关系。

307 Temporary Redirect

临时重定向。与302类似,但是307会遵守标准,不会从POST变成GET

4XX的响应结果表示客户端是发生错误的原因所在。

400 Bad Request

表示请求报文中存在语法错误。

401 Unauthorized

表示发送的请求需要有通过HTTP认证的认证信息。若之前已经请求过一次,则表示用户认证失败。

403 Forbidden

表示对请求资源的访问被服务器拒绝了。

404 Not Found

表示在服务器上无法找到请求的资源。

5XX的响应结果表示服务器本身发生错误。

500 Internal Server Error

表示服务器在执行请求的过程中发生了错误。

503 Service Unavailable

表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

HTTP首部

4种HTTP首部字段类型

1.通用首部字段

请求报文和响应报文都会使用的首部。

Cache-Control:控制缓存的。
Cache-Control:private,max-age=0,no-cache
缓存请求指令
缓存响应指令
no-cache:不能缓存过期的资源。

注意:no-cache不是不能缓存的意思
如果请求中存在no-cache指令,则表示客户端将不会接收缓存过的响应,中间的缓存服务器必须把请求转发给资源服务器(向服务器验证缓存的有效性)。
如果响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存。资源服务器以后也不再对缓存服务器请求中的资源有效性进行确认,且禁止缓存服务器对资源进行缓存。
在响应中,如果no-cache指令有具体的参数值(Cache-Control:no-cache=Location)那么客户端收到这个响应报文后,就不能缓存。如果无具体的参数值,客户端可以使用缓存。该具体的参数值只能在响应中指定。

no-store:不能缓存,不能在本地缓存请求或响应的任何一部分。
max-age:响应能被重用的最长时间。
Cache-Control:max-age=60(单位:s)

当出现在请求中,如果有效,那么客户端就接收缓存的资源,在这期间不会向服务器发送请求。
当出现在响应中,缓存服务器将不对资源的有效性进行确认,该值代表资源存活的最长时间。

2.请求首部字段

请求报文使用的首部,补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。

Accept:客户端希望接收的类型。
Accept:text/html,application/xml,application/json //将按照从左到由依次匹配
Accept:application/xml;q=0.5,application/json;q=0.9,text/html//按照优先级高的先匹配q表示优先级,值越大优先级越高。
类型

text/html :接收html ;image/jpeg:接收JPEG格式的图片。前面表示什么文件的类型,/后面的表示该类型下的具体文件格式。

Accept-Charset:客户端可以接收的字符编码。
Accept-Charset:utf-8,gbk,ununicode-1-1;q=0.8 //同Accept类似。
Accept-Encoding:指定内容编码。
Accept-Encoding:gzip,deflate //可以指定多个。
Accept-Language:指定可以接收的语言。
Accept-Language:zh-cn,zh,en-us;q=0.3
Authorization:用来告知服务器,用户的认证信息。
Authorization:Basic oyH1Vwk4vPXgub6UkxAr3wvmfD18 //用户名和密码认证信息的Base64编码。
Referer:告知服务器请求的原始资源的URI。
User-Agent:会将创建请求的浏览器和用户代理名称等信息传递给服务器。
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36
If-Match:该字段的值只有与ETag(实体标记,是与特定资源关联的确定值)的值一致时,服务器才会处理请求。

形如If-XXX这样的首部都可称为条件请求。服务器收到带条件的请求后,只有判断条件为真时,服务器才会执行请求。

If-None-Match:与If-Match相反。
If-Modified-Since:如果在该字段指定的日期以后,资源发生了更新,服务器才会处理请求。

3.响应首部字段

响应报文使用的首部。补充了响应的附加内容,也会要求客户端附加额外的信息。

Accept-Ranges:指定服务器能处理的范围。

如果能处理范围请求,后面跟具体的字节范围,如果不能处理请求,赋值为none

ETag:资源唯一标识。服务器会为每份资源分配对应的ETag值。当资源更新时,该值也会更新。

该字段有强ETag和弱ETag之分。前者指无论实体发生多么细微的变化,该值都会变;后者是只有实体发生根本性的变化之后才会变化。

ETag: "usagi-1234" //强ETag
ETag: W/"usagi-1234" //弱ETag,前面加来标识。
Location:返回重定向后的地址。
Server:告诉客户端服务器上安装的 HTTP服务器应用程序的信息。

Vary:是当前缓存的数据是否可以返回给客户端的依据。

vary: Accept-Encoding
Vary: Accept-Encoding,User-Agent

4.实体首部字段

针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。

其他首部

HTTP首部字段是可以自行扩展的。所以在Web服务器和浏览器的应用上,会出现各种非标准的首部字段。

X-Frame-Options
X-Frame-Options:DENY

该字段数据响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。主要目的就是为了防止劫持攻击。
DENY:表示拒绝;SAMEORIGIN:仅同源域名下的页面匹配时许可。

X-XSS-Protection
x-xss-protection: 1; mode=block

该字段属于响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。
1:将XSS过滤设置为有效状态;0:设置为无效状态。

实战

推荐阅读更多精彩内容

  • 作者:涤生_Woo链接:https://www.jianshu.com/p/6e9e4156ece3 本篇文章篇幅...
    Fi的学习笔记阅读 313评论 0 3
  • 本文是《图解HTTP》读书笔记的第二篇,主要包括此书的第六章内容,因为第六章的内容较多,而且比较重要,所以单独写为...
    lijiankun24阅读 452评论 0 4
  • 作者:李成文;标签: http首部 HTTP报文首部 HTTP协议的请求和响应报文中必定包含HTTP首部。首部内容...
    广州芦苇科技web前端阅读 88评论 0 0
  • Web 页面的实现 Web 基于 HTTP 协议通信 客户端(Client)的 Web 浏览器从 Web 服务器端...
    毛圈阅读 154评论 0 2
  • HTTP报文首部   HTTP协议的请求和响应报文中必定包含HTTP首部。首部内容为客户端和服务器分别处理请求和响...
    JarvanZ阅读 156评论 0 0