面试官总问我http,今天就来总结总结

浅聊一下

在面试中总被问到: httphttps 的区别,今天就来聊一下 http0.9 版本到 3.0 版本,最后到 https 究竟有哪些变化...

http

HTTP 是指超文本传输协议(Hypertext Transfer Protocol),它是用于在网络上传输和接收超文本的协议。在Web浏览器和Web服务器之间的通信中,HTTP被用来请求页面、发送和接收页面内容、提交表单数据等。HTTP是一种无状态协议,每个请求都是独立的,服务器不会在多次请求之间保留任何关于客户端的信息。HTTP通常使用TCP连接,在Web浏览器访问网页时,它是基础的通信协议。

http0.9

http0.9版本是上个世纪的产物,当时主要是科学家们用来传递研究成果,普通人家能用上的少之又少...

  • 流程
  1. 客户端发送GET请求,请求一个XXXXX/index.html文件
  2. 服务器接收到请求后,读取对应的HTML文件,以ASCII码的字符流返回给客户端
  • 特点
  1. 只有请求行,没有请求头和请求体
  2. 没有响应头
  3. 传输的内容是以ASCII的字符流形式传输的

http1.0

随着时代的发展,科学家们已经不满足于只能发送html类型文件了,于是http1.0版本诞生...

  • 特点
  1. http1.0版本引入了请求头和响应头,于是可以支持多种文件的数据传输

请求头: accept: text/html accept-encoding: gzip

响应头: content-encoding: br content-type: text/html ;charset=utf-8

在请求头中设置希望接收的文件类型,并且设置编码方式,响应头中告诉客户端自己的编码方式和返回的文件类型...

http1.1

随着时代的发展,http进入1.1阶段,此时普通人也能用得起电脑,http需要传输大量数据,但是由于一次TCP的三次握手以后,只能执行一次http请求,然后就要四次挥手释放连接,开销变的非常大,于是http1.1诞生

  • 持久连接

当我建立连接以后,经过一次http传输,不立即断开连接,而是继续进行下一次http传输,可以设置Connection: keep-alive ||close 来控制持久连接是否开启

  • Chunk transfer机制

在http1.0中,后端通过设置content-Length字段来告诉前端我传递的数据有多大,在http2.0中,出现了一个Chunk transfer机制:将数据分割成若干个任意大小的数据块,每个数据块标记好长度,最后发送一个长度为0的数据块来标志发送完毕

http2.0

http2.0的出现代表http1.1还是存在很多问题的:

  1. TCP的慢启动: 拥塞控制算法导致一定会慢启动,慢启动导致页面关键资源加载时间推后
  2. 多条TCP连接竞争带宽导致每条TCP连接中能被分配的带宽大大降低
  3. 队头阻塞问题 前一个请求延迟,后一个请求便无法发送,导致带宽浪费

那么http2.0解决了什么问题:

  1. 一个域名只使用一个TCP长连接
  2. 将每一个请求分成一帧一帧的数据进行传输并打上编号,同时发送给服务端,且可以在重要资源请求中标记为加急,服务端接收到带有各种编号的数据帧后,可以区分哪个数据帧加急,优先整理和响应该请求的数据帧(通过引入了二进制分帧成实现多路复用)

http3.0

既然存在http3.0,那么说明http2.0还是存在缺陷:

  • 队头堵塞

http2.0基于TCP协议,那么当我们传输数据包时,如果有一个包丢失,那么TCP协议就会暂停传输后面的包,重新传输丢失的包,就会造成队头堵塞

  • TCP慢启动

拥塞控制算法导致一定会慢启动,慢启动导致页面关键资源加载时间推后

从上面我们可以发现,问题都是因为基于TCP协议而产生的,于是乎http3.0直接抛弃了TCP协议,而转头投靠了QUIC协议

  • QUIC协议

基于UDP协议,在UDP上实现了类似于TCP的多路数据流、可靠性传输等功能

  1. 实现了类似于TCP的流量控制和可靠性传输
  2. 集成了TLS加密功能
  3. 实现了HTTP2中的多路复用

那么为什么http3.0这么牛逼却还没大范围推广呢?这就不得不说到TCP协议僵化了...

  • TCP协议僵化

TCP常用于物理层,一旦TCP修改(路由器,交换机,防火墙)全部失效,全部要更新,所以要用上http3.0需要一个长时间的积累

https

在http3.0中,我们聊到了TLS加密,那么TLS和我们的https有什么关系呢?

https = http + TLS

TLS

TLS(Transport Layer Security)是一种用于保护网络通信安全的协议。它建立在传输层之上,为数据通信提供了安全性、完整性和私密性。TLS主要用于Web浏览器和服务器之间的通信,以及其他应用程序之间的安全通信。

  • 对称加密

TLS是一种加密协议,来看看TLS中的对称加密...什么是对称加密?有一个密码本,我根据密码本把想要对你说的话加密,写在小纸条上并且把密码本也一并通过快递寄给你,当你收到快递以后就可以根据密码本破译出我想对你说的话了,这就叫做对称加密,我有密码本,你也有密码本...但是要是我的快递中途被人偷了,那么我加密的话就会被被人按照密码本给破译出来,真是丢了老脸了...

  • 非对称协议
  1. 密钥生成

    • Alice和Bob各自生成一对非对称加密所需的密钥,每对密钥包括一个公钥和一个私钥。他们将自己的公钥公开,而私钥则保密。
  2. 加密消息

    • Alice想要向Bob发送一条加密消息。她获取Bob的公钥,并使用该公钥对消息进行加密。
  3. 发送加密消息

    • Alice将使用Bob的公钥加密后的消息发送给Bob。
  4. 解密消息

    • Bob收到加密消息后,使用自己的私钥进行解密。
    • 由于加密时使用了Bob的公钥,只有Bob的私钥才能成功解密,确保了通信内容的保密性。

结尾

http的内容总结到这里就差不多了...

相关推荐
前端李易安2 小时前
Web常见的攻击方式及防御方法
前端
PythonFun2 小时前
Python技巧:如何避免数据输入类型错误
前端·python
Neituijunsir2 小时前
2024.09.22 校招 实习 内推 面经
大数据·人工智能·算法·面试·自动驾驶·汽车·求职招聘
hakesashou2 小时前
python交互式命令时如何清除
java·前端·python
天涯学馆2 小时前
Next.js与NextAuth:身份验证实践
前端·javascript·next.js
HEX9CF2 小时前
【CTF Web】Pikachu xss之href输出 Writeup(GET请求+反射型XSS+javascript:伪协议绕过)
开发语言·前端·javascript·安全·网络安全·ecmascript·xss
ConardLi2 小时前
Chrome:新的滚动捕捉事件助你实现更丝滑的动画效果!
前端·javascript·浏览器
ConardLi3 小时前
安全赋值运算符,新的 JavaScript 提案让你告别 trycatch !
前端·javascript
凌云行者3 小时前
使用rust写一个Web服务器——单线程版本
服务器·前端·rust
华农第一蒟蒻3 小时前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token