HTTP相关知识点

1、http版本

1. http1.1

1.1 持久链接

经过使用 Connection:keep-alive 进行长链接。客户端只请求一次,可是服务器会将继续保持链接,当再次请求时,避免了从新创建链接。浏览器

1.2 管道机制(pipelining)

在同一个TCP链接里面,客户端能够同时发送多个请求。这样就进一步改进了HTTP协议的效率。缓存

举例来讲,客户端须要请求两个资源。之前的作法是,在同一个TCP链接里面,先发送A请求,而后等待服务器作出回应,收到后再发出B请求。管道机制则是容许浏览器同时发出A请求和B请求,可是服务器仍是按照顺序,先回应A请求,完成后再回应B请求。安全

1.3 对头阻塞问题(Head-of-line blocking)

虽然1.1版容许复用TCP链接,可是同一个TCP链接里面,全部的数据通讯是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为“队头堵塞”(Head-of-line blocking)。服务器

2. http2与http1.1的区别(优势)

  1. HTTP2使用的是二进制传送,HTTP1.X是文本(字符串)传送。cookie

    你们都知道HTTP1.X使用的是明文的文本传送,而HTTP2使用的是二进制传送,二进制传送的单位是帧和流。帧组成了流,同时流还有流ID标示,经过流ID就牵扯出了第二个区别网络

  2. HTTP2支持多路复用session

    • HTTP/2 中,有两个很是重要的概念,分别是帧(frame)和流(stream)。
    • 帧表明着最小的数据单位,每一个帧会标识出该帧属于哪一个流,流也就是多个帧组成的数据流。
    • 多路复用,就是在一个 TCP 链接中能够存在多条流。换句话说,也就是能够发送多个请求,服务端能够经过帧中的标识知道属于哪一个请求。经过这个技术,能够避免 HTTP 旧版本中的队头阻塞问题,极大的提升传输性能。
  3. HTTP2头部压缩post

    HTTP/1 中,咱们使用文本的形式传输 header,在 header 携带 cookie 的状况下,可能每次都须要重复传输几百到几千的字节。性能

    HTTP2经过gzip和compress压缩头部而后再发送,同时客户端和服务器端同时维护一张头信息表,全部字段都记录在这张表中,这样后面每次传输只须要传输表里面的索引Id就行,经过索引ID就能够知道表头的值了网站

  4. HTTP2支持服务器推送 在 HTTP/2 中,服务端能够在客户端某个请求后,主动推送其余资源。

2、http协议的主要特色

1. 简单快速

简单:每一个资源(好比图片、页面)都经过 url 来定位。这都是固定的,在http协议中,处理起来也比较简单,想访问什么资源,直接输入url便可。

2. 灵活

http协议的头部有一个数据类型,经过http协议,就能够完成不一样数据类型的传输。

3. 无链接

链接一次,就会断开,不会继续保持链接。

4. 无状态

客户端和服务器端是两种身份。第一次请求结束后,就断开了,第二次请求时,服务器端并无记住以前的状态,也就是说,服务器端没法区分客户端是否为同一我的、同一个身份。

有的时候,咱们访问网站时,网站能记住咱们的帐号,这个是经过其余的手段(好比 session)作到的,并非http协议能作到的。

3、http报文的组成部分

1. 请求报文

  • 请求行:请求方法、请求url、http协议及版本

  • 请求头

    常见请求头:

    ​ Accept:可接受的相应内容类型

    ​ Accept-Language:可接受的响应内容语言列表

    ​ User-Agent:浏览器的身份标识字符串

    ​ Content-Type:请求体的MIME类型 (用于POST和PUT请求中)

    ​ Content-Length:以8进制表示的请求体的长度

    ​ Connection:客户端(浏览器)想要优先使用的链接类型

    ​ Cache-Control:用来指定当前的请求/回复中的,是否使用缓存机制

    ​ Cookie

  • 空行

  • 请求体

2. 响应报文

  • 状态行:http协议及版本、状态码及描述、

  • 响应头

    经常使用的响应头:

    ​ Server:服务器的名称

    ​ Content-Type:当前内容的MIME类型

    ​ Content-Length:响应消息体的长度,用8进制字节表示

    ​ Transfer-Encoding:表示实体传输给用户的编码形式

    ​ Date:此条消息被发送时的日期和时间

  • 空行

  • 响应体

4、http方法

1. 经常使用方法

  • GET:获取资源
  • POST:传输资源
  • put:更新资源
  • DELETE:删除资源
  • HEAD:得到报文首部

2. get和post区别

  1. 浏览器在回退时,get不会从新请求,可是post会从新请求。

  2. get请求会被浏览器主动缓存,而post不会。

  3. get请求的参数,会报保留在浏览器的历史记录里,而post不会。作业务时要注意。为了防止CSRF攻击,不少公司把get统一改为了post。

  4. get请求在url中传递的参数有大小限制,基本是2kb,不一样的浏览器略有不一样。而post没有注意。

  5. get的参数是直接暴露在url上的,相对不安全。而post是放在请求体中的。

5、http状态码

2XX 成功

  • 200 OK,表示从客户端发来的请求在服务器端被正确处理
  • 204 No content,表示请求成功,但响应报文不含实体的主体部分
  • 205 Reset Content,表示请求成功,但响应报文不含实体的主体部分,可是与 204 响应不一样在于要求请求方重置内容
  • 206 Partial Content,进行范围请求

3XX 重定向

  • 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
  • 302 found,临时性重定向,表示资源临时被分配了新的 URL
  • 303 see other,表示资源存在着另外一个 URL,应使用 GET 方法获取资源
  • 304 not modified,表示服务器容许访问资源,但因发生请求未知足条件的状况
  • 307 temporary redirect,临时重定向,和302含义相似,可是指望客户端保持请求方法不变向新的地址发出请求

4XX 客户端错误

  • 400 bad request,请求报文存在语法错误
  • 401 unauthorized,表示发送的请求须要有经过 HTTP 认证的认证信息
  • 403 forbidden,表示对请求资源的访问被服务器拒绝
  • 404 not found,表示在服务器上没有找到请求的资源

5XX 服务器错误

  • 500 internal sever error,表示服务器端在执行请求时发生了错误
  • 501 Not Implemented,表示服务器不支持当前请求所须要的某个功能
  • 503 service unavailable,代表服务器暂时处于超负载或正在停机维护,没法处理请求

6、http缓存

1. 强缓存

不用请求服务器,直接使用本地的缓存。

强缓存是利用 http 响应头中的**ExpiresCache-Control**实现的。

浏览器第一次请求一个资源时,服务器在返回该资源的同时,会把上面这两个属性放在response header中。

  1. Expires:服务器返回的绝对时间

Expires是http1.0提出的一个表示资源过时时间的header,它描述的是一个绝对时间,由服务器返回。 Expires 受限于本地时间,若是修改了本地时间,可能会形成缓存失效

  1. Cache-Control:服务器返回的相对时间

http1.1中新增的 response header。浏览器第一次请求资源以后,在接下来的相对时间以内,均可以利用本地缓存。超出这个时间以后,则不能命中缓存。从新请求时,Cache-Control会被更新。

二者同时存在的话,Cache-Control优先级高于Expires

2. 协商缓存

浏览器发现本地有资源的副本,可是不太肯定要不要使用,因而去问问服务器。

当浏览器对某个资源的请求没有命中强缓存(也就是说超出时间了),就会发一个请求到服务器,验证协商缓存是否命中。

  1. Last-ModifiedIf-Modified-Since

(1)浏览器第一次请求一个资源,服务器在返回这个资源的同时,会加上Last-Modified这个 response header,这个header表示这该资源在服务器上的最后修改时间

(2)浏览器再次请求这个资源时,会加上If-Modified-Since这个 request header,这个header的值就是上一次返回的Last-Modified的值

(3)服务器收到第二次请求时,会比对浏览器传过来的If-Modified-Since和资源在服务器上的最后修改时间Last-Modified,判断资源是否有变化。若是没有变化则返回304 Not Modified,但不返回资源内容(此时,服务器不会返回 Last-Modified 这个 response header);若是有变化,就正常返回资源内容(继续重复整个流程)。这是服务器返回304时的response header

(4)浏览器若是收到304的响应,就会从缓存中加载资源

但last-modified 存在一些缺点:

  • 某些服务端不能获取精确的修改时间

  • 文件修改时间改了,但文件内容却没有变

既然根据文件修改时间来决定是否缓存尚有不足,可否能够直接根据文件内容是否修改来决定缓存策略?

  1. ETagIf-None-Match

(1)浏览器第一次请求一个资源,服务器在返回这个资源的同时,会加上ETag这个 response header,这个header是服务器根据当前请求的资源生成的惟一标识。这个惟一标识是一个字符串,只要资源有变化这个串就不一样,跟最后修改时间无关,因此也就很好地补充了Last-Modified的不足。

(2)浏览器再次请求这个资源时,会加上If-None-Match这个 request header,这个header的值就是上一次返回的ETag的值

(3)服务器第二次请求时,会对比浏览器传过来的If-None-Match和服务器从新生成的一个新的ETag,判断资源是否有变化。若是没有变化则返回304 Not Modified,但不返回资源内容(此时,因为ETag从新生成过,response header中还会把这个ETag返回,即便这个ETag并没有变化)。若是有变化,就正常返回资源内容(继续重复整个流程)。这是服务器返回304时的response header

(4)浏览器若是收到304的响应,就会从缓存中加载资源。

7、http和https区别

  1. https协议须要到ca申请证书,通常免费证书较少,于是须要必定费用。

  2. http是超文本传输协议,信息是明文传输,https则是具备安全性的ssl加密传输协议。

  3. http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。

  4. http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

相关文章
相关标签/搜索