认识HTTP | 青训营笔记

133 阅读7分钟

这是我参与「第五届青训营 」笔记创作活动的第5天

OSI七层模型

OSI七层模型: 开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。
在七层模型中,每一层都提供一个特殊的网络功能。从网络功能的角度观察:下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;而上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能.。
各层功能简介
它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

  • ●应用层:网络服务与最终用户的一个接口,常见的协议有:HTTP FTP SMTP SNMP DNS.

  • ●表示层:数据的表示、安全、压缩。确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。

  • ●会话层:建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话.

  • ●传输层:定义传输数据的协议端口号,以及流控和差错校验,协议有TCP UDP.

  • ●网络层:进行逻辑地址寻址,实现不同网络之间的路径选择,协议有ICMP IGMP IP等.

  • ●数据链路层:在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路。

  • ●物理层:建立、维护、断开物理连接。

http和https的区别

  1. https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

https握手过程

  • 第一步:客户端会发起一个hello client请求,请求中会携带TLS版本信息、加密套件候选列表、压缩算法候选列表以及一个随机数。
  • 第二步:服务端收到请求以后也会给客户端发一个server hello请求,请求中会告诉客户端它选择的协议版本、加密套件、压缩算法以及一个随机数。
  • 第三步:服务端会给客户端发一个server certificate请求,里面包含服务端的数字证书,用于客户端进行校验。
  • 第四步:服务端会给客户端发一个server hello done告诉客户端信息已发送完毕。
  • 第五步:客户端收到证书以后进行校验获取到服务端的公钥。
  • 第六步:客户端会将自己的数字证书发给服务端用于校验。
  • 第七步:客户端计算出一个随机数pre-master,然后用公钥进行加密发送给服务器端。
  • 第八步:服务端和客户端都根据自己的随机数+对端的随机数+pre-master算出对称密钥,然后再根据对称密钥进行通信。

http缓存

背景 具有一些重复性的HTTP请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,那么下次就直接读取本地的数据,不必在通过网络获取服务器的响应了,这样的话 HTTP/1.1 的性能肯定肉眼可见的提升。
所以,避免发送 HTTP 请求的方法就是通过缓存技术,HTTP 设计者早在之前就考虑到了这点,因此 HTTP 协议的头部有不少是针对缓存的字段。
HTTP 缓存有两种实现方式,分别是强制缓存和协商缓存。

强制缓存

指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。
比如返回的状态码为200,但在size项中标识的是from disk cache,这就是使用了强制缓存。
强制缓存主要利用以下两个HTTP响应头部字段实现的,都用来表示资源在客户端缓存的有效期。
Cache-Control 请求&响应头,缓存控制字段,是一个相对时间。

Expires
响应头 | 代表缓存资源过期时间,由服务器提供 | HTTP1.0的属性,比max-age优先级低 | 是一个绝对时间。
强制缓存流程: ●当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上Cache-Control,Cache-Control 中设置了过期时间大小;
●浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与 Cache-Control中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;
●服务器再次收到请求后,会再次更新 Response 头部的 Cache-Control。

协商缓存

当我们在浏览器使用开发者工具的时候,你可能会看到过某些请求的响应码是 304,这个是告诉浏览器可以使用本地缓存的资源,通常这种通过服务端告知客户端是否可以使用缓存的方式被称为协商缓存。
协商缓存就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。
两种响应头部:

  1. 请求头部中的 If-Modified-Since 字段与响应头部中的 Last-Modified 字段实现;

  2. 请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段
    第一种:

    响应头部 Last-Modified :标识这个响应资源的最后修改时间;
    请求头部 If-Modified-Since:

  • ●当资源过期了,发现响应头部中具有Last-Modified声明,则再次发起请求的时候带上Last-Modified的时间;

  • ●服务器收到请求后发现有If-Modified-Since则于被请求的资源最后修改时间进行对比(Last-Modified);

  • ●如果最后修改时间较新,说明资源又被修改过,则返回最新资源,HTTP 200 OK;

  • ●如果最后修改时间较旧,说明资源无新修改,响应HTTP 304 走缓存。

  • 响应头部Last-Modified:标识这个响应资源的最后修改时间。
    第二种:

    响应头部中的 Etag :唯一标识响应资源。
    请求资头部中的 If-None-Match:

  • ●当资源过期时,浏览器发现响应头里有Etag,则再次向服务器发起请求时,会将请求头If-None-Match值设置为Etag的值。

  • ●服务器收到请求后进行对比,如果值相等,返回304状态码,不会返回资源;如果值变化了,说明资源变化了,返回200状态码,并返回资源。

  • ●如果浏览器收到了304请求响应状态码,则会从本地缓存中加载资源,否则更新资源。
    两方法的不同总结:
    第一种方法是基于时间来实现的; 第二种方法是基于一个唯一标识实现的,后者相对来说能更加准确的判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题。
    如果HTTP响应头部同时有Etag和Last-Modified字段时,Etag的优先级更高,会首先判断Etag是否变化,再看Last-Modified。

注意:协商缓存的这两个字段都是需要配合强制缓存中的Cache-Control字段来使用,只有在未命中强制缓存时,才能发起带有协商缓存字段的请求。