HTTP 了解下

🍃 几个疑问:web

  • 浏览器输入 URL 后都发生了什么?
  • 什么是三次握手,四次挥手?
  • 什么是长链接?为何须要长链接?
  • HTTP 有什么缺陷?有什么解决办法吗?
  • HTTPS 建立过程是怎样的?为何 HTTPS 就是安全的?
  • HTTP2 有什么优点?
  • HTTP2 的多路复用为何能提升性能?

TCP/IP协议族

概念

要了解 HTTP,须要先了解下 TCP/IP协议族。浏览器

协议中有各式各样的内容,好比电缆的规格到 IP 地址的选定方法、寻找异地用户的方法、双方创建通讯的顺序、web页面显示须要处理的步骤等,把这些与互联网相关联的各种协议集合起来总称为TCP/IP协议族。缓存

clipboard.png

TCP/IP协议族分层管理

TCP/IP协议族分为:应用层、传输层、网络层、链路层。安全

  • 应用层:决定了向用户提供应用服务时通讯的活动,HTTP 协议也处于这一层。
  • 传输层:对上层应用层提供处于网络链接中两台计算机间的数据传输,TCP(传输控制协议)处于这一层。
  • 网络层:处理在网络上流动的数据包(选择一条传输路线)。
  • 链路层:处理连接网络的硬件部分。

TCP/IP协议族通讯数据流

clipboard.png

利用TCP/IP协议族进行网络通讯时,会经过分层顺序与对方通讯。
发送端从应用层往下走
接收端往应用层方向上走服务器

🌰 拿 HTTP 通讯举例来讲,客户端输入 url 回车后:网络

客户端在应用层(HTTP 协议)发出一个 HTTP 请求 ⬇️
在传输层(TCP 协议)把从应用层接收到的请求报文分割,打上标记序号及端口号以后发给网络层 ⬇️
网络层(IP 协议)增长做为通讯目的地的 MAC地址后发给链路层 ⬇️
这样,发往网络的通讯请求准备完毕,接着
接收端的服务器在链路层接收到请求数据,按顺序往上走,一直走到应用层,才算是真正的接收到了客户端发过来的 HTTP 请求。并发

因而可知,HTTP,TCP,IP,DNS 是 TCP/IP协议族的一个子集,并分别出于本身所在的层级发挥着各自的做用。性能

HTTP 进化史

clipboard.png

🍃 HTTP1.1 版本中的持久链接(长链接)是怎么回事?学习

HTTP 协议的初始版本中,每进行一次 HTTP 通讯就要断开一次 TCP 链接(短链接),这样无谓的 TCP 链接和断开会增长通讯量的开销,为了解决这个问题,HTTP1.1 版本中提出了持久链接(HTTP keep-alive),只要任何一端没有明确提出断开链接,则保持 TCP 链接状态,这样能够创建一次 TCP 链接后屡次进行请求和相应的交互。编码

优势:减小了 TCP 链接的重复创建和断开所形成了额外开销,减轻了服务端负载以及提升了 web 页面的显示速度。

🍃 HTTP1.1 版本的管线化是怎么回事?

从前发送请求后须要等待并接收到响应,才能够发送下一个请求,管线化技术出现后,不用等待响应就能够直接发送下一个请求,实现了同时并行发送多个请求的功能。

HTTP协议

HTTP协议如何通讯?

HTTP协议:用于客户端和服务端之间经过请求和响应达成通讯。

在一个 HTTP 请求建立的时候会建立一条 TCP 链接,HTTP 的全部请求都是在这个 TCP 链接的基础上发送的。

clipboard.png

HTTP通讯的桥梁 - TCP

TCP 位于传输层,提供可靠的字节流服务。

为了方便通讯,将大块数据分割成报文段(按序号),把每一个报文段可靠的(三次握手策略 (标记:SYN,ACK))传递给对方。

🍃 三次握手策略:

step1. 客户首先发送一个带 SYN 标志的数据包给对方
step2. 服务端接收后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息
step3. 客户端再回传一个带 ACK 标志的数据包,表明握手成功

若握手过程当中某个阶段中断,TCP 协议会再次以相同顺序发送相同数据包。

clipboard.png

🍃 那,浏览器输入 URL 回车后都发生了什么?

clipboard.png

上图是客户端访问一个页面的流程图,HTTP 通讯过程当中,密切相关的几个协议都起到了哪些做用?

DNS职责:解析域名并返回 IP 地址给客户端 ⬇️

HTTP协议职责:生成针对 web 目标服务器的 HTTP 请求报文 ⬇️

TCP协议职责:为了方便通讯,将 HTTP 请求报文按序号分割成报文段,把每一个报文段可靠的(三次握手 (标记:SYN,ACK))传递给对方 ⬇️

IP协议职责:搜索对方地址,一边中转一边传送 ⬇️

TCP协议职责:将对方那接收到的报文段按原来顺序重组请求报文 ⬇️

HTTP协议职责:对 web 服务器请求的内容进行处理,请求的处理结果也一样利用 TCP/IP通讯协议向用户回传

HTTP 状态码

HTTP 状态码:告知从服务器端返回的请求结果。

🍃 类别

1xx:信息性 - 接收的请求正在处理
2xx:成功 - 请求正常处理完毕
3xx:重定 - 须要进行附加操做已完成请求
4xx:客户端错误 - 服务器没法处理请求
5xx:服务器错误 - 服务器处理请求出错

🍃 经常使用状态码
200:请求处理成功
204:请求处理成功,可是没有资源能够返回

301:永久性重定向,请求的资源已经被分配新的 URI,之后应使用如今所指的 URI
302:临时性重定向,请求的资源已经被分配新的 URI, 但愿用户使用新的 URI 更新
303:请求对应的资源存在另外一个 URI,应使用 get 方法定向获取请求的资源

400:请求报文中存在语法错误
401:请求须要有经过 http 认证的认证信息,若是以前已经进行过一次请求认证则表示用户认证失败
403:请求被服务器拒绝
404:服务器上找不到请求的资源

500:服务器执行请求时出错
503:服务器正在进行停机维护或正在处理超负载,没法处理请求

HTTP 的缺陷

🍃 可能被窃听 - 第三方能够获知通讯内容 ①

HTTP 没有加密功能,报文都是以明文的方式发送的,第三方能够劫持通讯内容形成数据泄露等问题

🍃 可能被冒充 - 第三方能够冒充他人身份参与通讯 ②

HTTP 通讯不会对通讯方进行确认,任何人均可以假装成通讯方和你通讯,伪造虚假服务器欺骗用户,实现钓鱼欺诈,然而用户根本没法察觉

🍃 可能被篡改 - 第三方能够修改通讯内容 ③

由于 HTTP 协议没法证实通讯报文的完整性,也没办法确认发出的请求/响应以及接收到的请求/响应是先后相同的,在通讯的过程当中第三方能够截获并修改你的内容,然而通讯内容被篡改了也是没办法知晓的。

那么这些弊端怎么解决呢?
用 HTTPS, HTTPS = HTTP + 加密(①)+ 认证(②) + 完整性保护(③)

HTTP 的缺陷的解决方法 - HTTPS

HTTPS 不是应用层的新协议,是在 HTTP 和 TCP 中间加了一层 SSL,组合成了 HTTPS。

clipboard.png

🍃 传送门:HTTPS 的通讯过程

🍃 为何 相比较 HTTP 来讲 HTTPS 更安全 ?

  • 使用 HTTPS 协议可认证用户和服务端,确保数据发送到正确的客户端和服务端;
  • HTTPS 协议是由 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 HTTP 协议安全,可防止数据在传输过程当中不被窃取、改变,确保数据的完整性。

HTTP2

🍃 在看 HTTP2 以前,来看下 HTTP1.x 有哪些痛点。

1.并发链接
虽然 HTTP1.1 的管线化已经实现了并发请求,可是由于同时间同域名下请求个数有限制,超出数量的部分会被阻塞挂起,因此也只能作到部分多路复用。所以咱们在须要屡次请求客户端的时候,一般要开启多条 TCP 连接进行通讯,以减小等待时间。

2.HTTP1.x 报头字段重复冗长切不压缩就发送
每次互相发送相同的首部形成资源浪费较多,并且首部信息未经压缩就发送,首部信息越多延迟越大。

3.请求只能从客户端开始,客户端不能够接收除响应之外的指令,服务端不能够主动推进消息给客户端。

为了进行根本性的改善,在协议级别消除 HTTP 所遭遇的瓶颈,SPDY协议 就应运而生了。

🍃 SPDY 是什么?

SPDY 是一种 HTTP 兼容协议,它没有彻底改写 HTTP 协议,而是在 TCP/IP 的应用层与运输层之间以会话层的形式加入,控制对数据的流动,但仍是采用 HTTP 创建通讯链接的,考虑到安全性,SPDY 规定在通讯中使用 SSL。

clipboard.png

SPDY 对当前的 HTTP 协议有 4 个改进:

  • 多路复用请求
  • 对请求划分优先级
  • 压缩 HTTP 头
  • 服务器推送流(即 Server Push 技术)

而 HTTP2 版本的设计正是基于 SPDY 协议。

HTTP2 相比较 HTTP1.x 来讲进一步的下降了网络延迟,提升了传输效率,从而大幅度的提高了web性能。

🌰 借图说明:同时请求379张图片

clipboard.png

🍃 那么,HTTP2 相比以前的版本作了哪些改进?

1.多路复用请求(单个域名)

这个设计弥补了HTTP1.1 中管线化只能部分多路复用了问题,作到了真正的并发请求,在 HTTP2 中,全部的通讯都是在一条 TCP 链接上完成的,能够无限制处理多个 HTTP请求,不再用担忧因为数量限制而致使请求被阻塞。

2.请求优先级
通讯过程当中不只能够无限制的并发处理请求并且还给请求逐个分配优先级顺序,这样作解决了因带宽低而致使响应变慢的问题。

3.服务器推送流
传统的 HTTP 请求服务端没办法主动向客户端推送内容,HTTP2 中实现了这一功能,服务端能够主动把一些资源推送给客户端并缓存起来,当客户端想要访问这些资源的时候就能够直接从缓存中读取了,这样能够避免发送没必要要的请求。

4.压缩 HTTP 头
HTTP1.x 的报头字段常常重复和冗长,HTTP2 引入了头信息压缩机制。
头信息使用gzip或compress压缩后发送,这样通讯产生的数据包数量和发送的字节就更少了。
另外客户端和服务器同时维护一张头信息表,全部字段都会存入信息表并生成索引号,之后直接发送索引号而不用再次发送相同字段,这样能节省带宽和提高速度。

5.二进制分帧
HTTP2中,在应用层(HTTP2.0)和传输层(TCP或者UDP)之间加了二进制分帧层。
在二进制分帧层中, HTTP2 会将全部传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码而再也不是文本格式。
这种单链接多资源的方式,减小了服务端的压力,使得内存占用更少,链接吞吐量更大。并且,TCP链接数的减小使得网络拥塞情况得以改善,同时慢启动时间的减小,使拥塞和丢包恢复速度更快。


🍃 后记

由于最近总看到关于 HTTP 的问题,我又对这个概念很模糊,因此学习一下,以上是学习过程的笔记,若是有错误还请帮忙指出,感谢~

🍃 资料:

相关文章
相关标签/搜索