一文搞懂HTTP面试

前言

无论是前端,还是后端。面试中大概率都会被问道HTTP。我根据自己的经验,同时也收集了大量的资料。总结出了这篇文章。

内容概要

  • HTTP基本概念
  • HTTP请求类型
  • HTTP缓存
  • HTTP的历史
  • 五层模型
  • HTTPS

1 HTTP的基本概念

1.1 基本概念

HTTP是超文本传输协议。这个概念可以分为三个部分来看:超文本、传输、协议

  • 超文本
  • 传输
  • 协议
超文本

超文本字面意思就是超级文本。不仅仅是文字,还包括了音频,视频,图片,压缩包等。对于HTTP来说,均可传输。

传输

传输就是数据经过一系列的打包传输。从发送方送到接收方。

协议

没有规矩不成方圆。在计算机的世界中也一样。传输数据也要按照规定(协议)来走。

1.2 状态码
  • 1** 提示信息
  • 2** 成功
  • 3** 重定向
  • 4** 客户端错误
  • 5** 服务端错误
301、302、304
401 403
1.3 请求头

HTTP请求类型分为四种类型。分别是通用标头、实体标头、请求标头、响应标头。

通用标头

Date:即时间,不过是格林威治标准时间,与我们的北京时间相差8个小时
Cache-Control:控制浏览器的缓存行为
Connection:是否启动长连接 keep-alive/close

实体标头

实体标头是描述消息正文内容的 HTTP 标头。一般是发送方给接收方发内容加。
Content-length 实体内容大小
Content-Language 实体内容语言
Content-Encoding 实体内容媒体压缩方式

请求标头

Host:请求头指明了服务器的域名
Referer:告诉浏览器,自己是从哪个页面链接过来的
预防XSRF可以用到这个属性
If-Modified-Since:用于确认代理或客户端拥有的本地资源的有效性。一般在浏览器缓存那使用
Accept
接受请求 HTTP 标头会通告客户端其能够理解的 MIME 类型。
MIME: MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
也就是说,MIME 类型其实就是一系列消息内容类型的集合。那么 MIME 类型都有哪些呢?

文本文件:text/html、text/plain、text/css、application/xhtml+xml、application/xml

图片文件:image/jpeg、image/gif、image/png

视频文件:video/mpeg、video/quicktime

应用程序二进制文件:application/octet-stream、application/zip

Accept-Charset:规定服务器处理表单数据所接受的字符集。
Accept-Language:用来告知服务器用户代理能够处理的自然语言集

响应标头

Access-Control-Allow-Origin 指定一个来源,它告诉浏览器允许该来源进行资源访问。跨域那设置。
Keep-Alive Connection 非持续连接的存活时间
Set-Cookie 服务器向客户端发送 sessionID。

2 HTTP请求类型

HTTP有多种请求类型。分别是options、Get、Post、Put、Head、Delete、Trace、Connect。虽然说我我们常用的是Get、Post、Head。但是其他的也应该了解。

2.1 请求类型(八种)
OPTIONS

返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送‘*’请求来测试服务器的功能性。跨域那使用这个。

GET

向服务器发送请求,请求资源。

POST

向服务器提交数据,进行处理。常见提交表单数据。

DELETE

请求服务器删除request-URL所标识的资源

HEAD

服务端接收请求后返回响应头

PUT

向指定资源位置上传最新内容

TRACE

显示服务器收到的请求。用于测试和诊断

CONNECT

HTTP/1.1协议中能够将连接改为管道方式的代理服务器

2.2 GET和POST有哪些区别

大小:
get请求 (浏览器url的长度),post请求无限制
缓存:
get请求浏览器会自动存储,post不会
历史:
get请求记录会被存储在历史记录中,而post不会
编码:
get请求只能进行url编码,post请求支持多种
参数:
get请求只接收ASCII字符,post无限制。
安全:
get请求参数暴露在url中,post放在Request body中,更加安全
回退:
请求在浏览器反复的 回退/前进 操作是无害的,而 post 操作会再次提
交表单请求。
TCP数据包:
get请求发送一次,因为http header和 data是一并发送的。服务器响
应200
post请求发送两次。先发送header,响应100 continue,在发送
data,服务器响应 200。
当然了Firefox就仅仅是发送一次

3 HTTP的缓存

当我们向服务端请求资源的时候,客户端本地会判断是否有缓存,如果有的话,则不向服务端发送请求。则使用本地的缓存内容。如果没有的话,则向服务端发起请求。

判断缓存

  1. 是否有缓存。有则进行下一阶段的判断,没有则直接向服务端请求。
  2. 判断强缓存是否过期。没有过期则直接读取,过期则进行下一阶段判断协商缓存。
  3. 协商缓存会判断Etag和Last-Modified首部,查看资源是否发生变化,如果未发生变化则返回304,从本地返回资源。否者是协商缓存未命中,会到服务端请求返回新的资源。

4 HTTP 0.9 - 3.0的发展

HTTP是基于 TCP/IP 协议的应用层协议。默认使用 80 端口。第一个版本是 0.9版本。这个版本仅仅有GET一种方式。HTTP/1.0 版本发布,内容大大增加。增加了POST和HEAD命令。可以发送任何形式的内容,也规定了请求和响应格式。

4.1 HTTP 1.1

HTTP/1.0是基于 TCP/IP,并且使用了请求-应答的通信模式。

长连接

在最开始的HTTP/1.0,每一次发送请求,都会新建一次TCP连接(三次握手),每一次的请求都意味着TCP的建立和断开。
为了解决这个问题,HTTP/1.1 使用长连接的通信方式,也就是持久连接。也就是说TCP在一段时间内一直保持着连接状态,这样后续的请求过来。就不用再一次的连接断开,减少了服务器端的开销。

管道网络通信

在HTTP/1.0时,只有前一次的请求发出,并得到服务器端的响应。第二次的请求才可以发出去。而在HTTP/1.1管道机制规则下,可以一次同时向服务端发出去多个请求。
当然了,管道机制,也有自己的缺陷。虽然是一次性发出多个,但是服务端在响应的时候还是按照请求顺序响应。这就有可能出现,前面的某个请求的响应时间很长,后面就会有很多的请求排队等候。这个现象也称为队头阻塞

队头阻塞

其实很好理解。这就像车开在单行道上。前面有车熄火了,后面的都要等待他处理玩那,才可以继续前进。

缺点

请求头部信息未进行压缩。首部信息太多,会造成延迟。
多个相同的请求头部信息,造成资源的浪费。
对头阻塞
没有优先级
只能是客户端请求,服务端响应。

4.1 HTTP 2.0

HTTP/2.0是基于HTTPS的,所以在安全性上更有保障

头部压缩

同时发送多个请求,头部会帮我们消除重复的部分。这就是HPACK算法

客户端,服务端同时维护一张头信息表,所有的字段都会存入这张表,生成索引号码,每一次仅仅发送索引号码就可以了。
、‘

二进制格式

HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式。过这种形式对人不友好,对计算机友好。省去了计算机收到报文后,转换成二进制的过程。增加了数据传输的效率

数据流

HTTP/2 的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。客户端发送的编号是奇数,服务端发出的偶数。客户端可以指定数据流的优先级,优先级高的请求,服务端就先响应其请求。

多路复用

一个连接中并发多个请求或回应,而不用按照顺序一一对应。降低了延迟,大幅度提高了连接的利用率。

服务器推送

服务端可以主动向客户端发送消息。

缺点

多个 HTTP 请求在复用一个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求的。所以一旦发生丢包现象,就会触发TCP的重传机制,这样一个TCP连接中的所以请求都必须等待这个丢失的包重新传回来。

4.1 HTTP 3.0

HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!UDP 发生是不管顺序,也不管丢包的,所以不会出现 HTTP/1.1 的队头阻塞 和 HTTP/2 的一个丢包全部重传问题。
可以理解QUIC就是一个在UDP之上的伪TCP + TLS + HTTP/2.0多路复用的协议。

5 五层模型

5.1 五层模型

说到 HTTP,不得不提的就是 TCP/IP 网络模型,一般是五层模型。

  • 应用层
  • 运输层
  • 网络层
  • 链路层
  • 物理层

也可以分为四层

  • 应用层
  • 运输层
  • 网络层
  • 网络接口层

也可以说成七层

应用层
表现层
会话层
运输层
网络层
链路层
物理层

应用层:HTTP、SMTP、Telnet、DNS、FTP
运输层:TCP、UDP
网络层:IP、ARP

5.2 TCP和UDP的区别

TCP和UDP均是运输层的协议,他们负责将应用层的数据传输到网络层。

5.2.1 TCP是什么

通过三次握手建立TCP连接,四次挥手断开TCP连接。TCP的三次握手就是用来启动和确认TCP连接的过程,建立成功后,就可以发送数据了。

主要特点:

  • TCP 支持错误重传机制
  • TCP 支持校验,甄别有害的数据包
  • TCP 在拥塞的情况下,能够延迟发送
5.2.2 UDP是什么

UDP不需要进行握手操作,从而加快了通信速度

主要特点:

  • UDP具有低延迟的特点
  • 发送大量数据包
  • UDP 支持容忍数据包丢失的带宽密集型应用程序
5.2.3 UDP和TCP有什么区别
TCPUDP
面向连接无连接
进行校验发送,错误会触发重传机制也就错误检查,对于错误的的数据会进行丢弃
TCP是可靠的,因为他可以保证将数据传到路由器UDP不可靠,不能保证将数据传到
头部20个字节头部8个字节
传输的速度较慢传输的速度更快

6 HTTPS

HTTPS又叫超文本传输安全协议,数据通信仍然是HTTP,但是利用了SSL/TLS加密数据包。HTTPS的出发点是为了解决HTTP明文传输时信息被篡改和监听的问题。所以使用了非对称加密(传输密钥)+ 对称加密(l前者密钥生成的密文)的方案。同时为了保证公钥传输过程中不会被篡改,又使用了数字签名功能,这就是我们大家熟知的HTTPS证书。

6.1 为什么会有HTTPS

HTTP在传输的过程中会经过一系列物理节点,路由器,机房等。又因为HTTP是明文传输,任一物理节点被监听,我们传输的内容就会被暴露。这就是俗称的中间人攻击。

6.2 HTTPS工作流程
  1. 用户操作浏览器,浏览器发起请求(端口443)。
  2. 服务器收到浏览器的请求后,将配置好的公钥证书返还给客户端。
  3. 客户端收到证书,验证其合法性。如果没有通过验证,则提示HTTPS连接不安全。
  4. 客户端利用收到的公钥,加密自己的对称加密的密钥。并向服务端传递过去。
  5. 服务端收到密文,利用自己的私钥解密出客户端想要传递的对称加密的密钥。
  6. 这个时候服务端,客户端就可以使用这个密钥进行传递信息了。
6.2.1为什么要有CA颁发机构

假设这样一个场景,服务端向客户端传递公钥。被中间人劫持。中间人将这个公钥换成自己的。待客户端将对称密钥的密钥传递过来后。中间人再一次的劫持。换成自己的密钥。这样之后双方传递的信息,都将会被中间人劫持。

所以,我们就引入了第三方机构,CA公信机构,一个大家都可以相信的机构。服务端在使用HTTPS之前,会先去CR哪里申请一份数字证书,数字证书里包含了持有者的各种信息以及证书的有效期。这样服务端再向客户端发送公钥的时候,将证书一同传递过去,客户端验证证书,就可以确认该消息是否来自自己请求的服务端。以便进行后续的操作。

同样的,这样也会有一个漏洞,就是攻击者仅仅修改公钥部分,而不改动证书部分,从而做到伪造服务端的效果。

这个时候就需要用到密码学中非对称加密中,私钥加密,公钥解密的作用 ---- 数字签名

CA自己也有一对公钥和私钥。CA在给服务端颁发证书的时候,对明文部分进行哈希,同时将哈希值使用私钥进行加密,从而得到数字签名。而当我们的客户端得到证书的式公寓,也会将明文分解成Text和数字签名Sig1,这个时候使用公钥解密,得到Sig2。看到这里就应该明白了,接下来就是验证了。这个时候我们用证书中的算法对明文进行解密得到Text2,对比Text2和Sig2是否相等,相等则可信,反之就被劫持篡改了。

码字不易,如果你看到这里,感觉还不错,点个赞吧!!!

如果感觉这篇文章对你有帮助,加个关注吧!!!

也可关注我的公众号,我们一起交流。

在这里插入图片描述

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值