前端需要具备的http知识(http1.0=>http1.1=>http2.0)

699 阅读11分钟

http协议的知识其实有很多,下面简单的总结一下相关概念。

首先,我们要对网络模型有个基本概念。通常都会说7层模型/4层模型,其实完整的网络模型是7层,为了简化,延伸出4层TCP/IP的模型概念。用下图进行表示 image.png

4层的话就是

  • 1.应用层:将最上面三层应用层、表示层、会话层合并统称,http相关
  • 2.传输层:tcp,udp,socket,端口号
  • 3.网络层:IP,路由相关
  • 4.数据链路层:将最下面数据链路层与物理层合并统称,MAC地址相关

我们主要了解的就是应用层,http协议。可以看到,http是建立在tcp之上的,所以我们还必须了解tcp的连接。

http1.0与http1.1主要区别:

一、TCP的连接。TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用4次挥手来关闭一个连接。http1.0就似一个渣男,用完就扔;http1.1稍微长情一点,可以设置持久连接,利用一次tcp连接进行多次请求。

三次握手其实是对客户端与服务器端状态的确认,两端都必须具备发送能力与接收能力。

第一次握手:客户端发送网络包,服务端收到了。服务端得出结论:客户端的发送能力、服务端的接收能力是正常的。

第二次握手:服务端发包,客户端收到了。客户端得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。

第三次握手:客户端发包,服务端收到了。服务端得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。

在两端的状态正常情况下连接就建立起来了,此时就可以传输数据了。

四次挥手其实就是双方对此次连接的终结。简化成以下对话

  • 发起方:‘哎,我要关闭了哈’
  • 接收方:‘啊,等等,有点突然,给我点时间’
  • 接收方:‘我搞完了’
  • 发起方:‘好的,拜拜’

第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了。

第二次挥手被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。先告诉对方,关闭请求我已经收到了。

第三次挥手在数据处理完毕以后,被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

第四次挥手主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。我已经知道你完成了,就此分道扬镳。

HTTP1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求.

例如,一个包含有许多图像的网页文件中并没有包含真正的图像数据内容,而只是指明了这些图像的URL地址,当WEB浏览器访问这个网页文件时,浏览器首先要发出针对该网页文件的请求,当浏览器解析WEB服务器返回的该网页文档中的HTML内容时,发现其中的img图像标签后,浏览器将根据img标签中的src属性所指定的URL地址再次向服务器发出下载图像数据的请求。

HTTP1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。

一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。

二、HTTP1.1还通过增加更多的请求头和响应头来改进和扩充HTTP 1.0的功能。

例如

- Host主机名字段,可以用来指定访问服务器上的哪个WEB站点
- Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持连接
- Cookie状态管理
- Referer,从哪个资源访问服务器,进行安全校验
- User-Agent,请求环境,比如浏览器内核
- 缓存,强制缓存优先级高于对比缓存
    - 强制缓存Cache-Contorl: no-cache,no-store,public,private或max-age=0, must-revalidate控制浏览器的缓存,相比http1.0的Expires字段(设置复杂,采用绝对时间,客户端可能与服务端不一致,导致缓存失效) 不请求服务器,disk cache,状态码200
    - 对比缓存Last-Modified & If-Modified-Since:如果强制缓存失效,通过对比缓存去判断是否刷新资源,如果资源更新的速度是秒以下单位,那么该缓存是不能被使用的,因为它的时间单位最低是秒。如果文件是通过服务器动态生成的,那么该方法的更新时间永远是生成的时间,尽管文件可能没有变化,所以起不到缓存的作用。请求服务器,一致,返回304,不一致则更新资源,返回200
    - 对比缓存Etag & If-None-Match,优先级高于Last-Modified:Etag字段和它所表示的文件hash,也就是进行内容比对
- 跨域,相对jsonp只能使用get请求,这种支持所有类型的请求
    - 简单请求,请求响应头会添加origin,用来说明本次请求来自哪个源(协议 + 域名 + 端口)
    - 设置Access-Control-Allow-Origin响应头,*表示接受所有跨域请求,也可以指定源,增强安全性
三、http1.1增加了更多的请求方法

http1.0共有GET, POST 和HEAD三种请求方法;

http1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和CONNECT方法

http1.1与http2.0的主要区别

一、二进制框架层

从技术角度而言,http1.1和2.0 最大的区别是二进制框架层。与 http1.1把所有请求和响应作为纯文本不同,http2 使用二进制框架层把所有消息封装成二进制,且仍然保持http语法,消息的转换让http2能够尝试http1.1所不能的传输方式。

Http1.1 通过引入长连接和流水线技术高效处理资源请求。通过长连接,允许客户端通过同一连接发送多个请求。但是这个策略有个瓶颈。当一个队头的请求不能收到响应的资源,它将会阻塞后面的请求。这就是知名的队头阻塞问题。也就是说,一个连接虽然可以发送多个请求,但是必须等上一个请求完成下一个请求才能开始处理。虽然添加并行的tcp连接能够减轻这个问题,但是tcp连接的数量是有限的,且每个新的连接需要额外的资源。Chrome浏览器最多允许对同一个域名Host建立6个TCP连接。

与http1.1利用多个tcp连接来减少队头阻塞的影响相反,http2在两端建立一个单独的连接。该连接包含多个数据流。每个流包含多个请求/响应格式的消息。最终,每个消息被划分为更小的帧单元。交错的请求和响应能够并行的传输而不被阻塞。该过程被称作多路复用技术。

相比http1.1而言,也就是在同一个tcp连接上同时进行多个请求的处理。所以有更好的网络及带宽利用率。

http2.0允许开发人员自定义请求的权重。

二、预测资源请求

因为http2支持多个并发响应,服务器可以提前把HTML 页面中的其他资源在客户端请求之前发给它。比如说首页的样式文件资源,在请求html页面的时候可以一起推送。

常见状态码

2XX——表明请求被正常处理了

1、200 OK:请求已正常处理。

2、204 No Content:请求处理成功,但没有任何资源可以返回给客户端,一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

3、206 Partial Content:是对资源某一部分的请求,该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。

3XX——表明浏览器需要执行某些特殊的处理以正确处理请求

4、301 Moved Permanently:资源的uri已更新,你也更新下你的书签引用吧。永久性重定向,请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。

5、302 Found:资源的URI已临时定位到其他位置了,姑且算你已经知道了这个情况了。临时性重定向。和301相似,但302代表的资源不是永久性移动,只是临时性性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。

6、303 See Other:资源的URI已更新,你是否能临时按新的URI访问。该状态码表示由于请求对应的资源存在着另一个URL,应使用GET方法定向获取请求的资源。303状态码和302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别。

当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。

7、304 Not Modified:资源已找到,但未符合条件请求。该状态码表示客户端发送附带条件的请求时(采用GET方法的请求报文中包含If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since中任一首部)服务端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304.。

8、307 Temporary Redirect:临时重定向。与302有相同的含义。

4XX——客户端错误。

9、400 Bad Request:服务器端无法理解客户端发送的请求,请求报文中可能存在语法错误。

10、401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。

11、403 Forbidden:不允许访问那个资源。该状态码表明对请求资源的访问被服务器拒绝了。(权限,未授权IP等)

12、404 Not Found:服务器上没有请求的资源。路径错误等。

5XX——服务器端错误

13、500 Internal Server Error:貌似内部资源出故障了。该状态码表明服务器端在执行请求时发生了错误。也有可能是web应用存在bug或某些临时故障。

14、503 Service Unavailable:抱歉,我现在正在忙着。该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。