3、HTTP常见面试题
HTTP是什么?
Http是超文本传输协议,一种在通信双方之间指定的规则。其中超文本是指数据格式可以是文本、图片、视频等等各种类型的数据;
HTTP常见的状态码
- 1xx:提示信息,传输协议处理的中间状态
- 2xx:请求成功。客户端发起的请求被服务端正确处理并返回响应数据
- 3xx:资源重定位。客户端请求的资源发生改变,需要用新的URL重新发起请求
- 4xx:客户端错误。客户端的请求出现错误
- 5xx:服务端错误。服务端对请求的处理出现错误
GET和POST
1、二者含义:
- GET:请求服务端的资源
- POST: 根据请求体(body)中的数据对服务器资源进行处理
2、GET和POST都是安全和幂等的吗?
GET请求是“只读”操作,所以是安全和幂等的;而POST请求是“新增或者修改操作”,所以不是安全和幂等的
注意:上面对于GET和POST是否安全和幂等只是按照RFC规范判断的,实际中开发者可以用GET方法实现新增或者删除数据的请求,此时GET请求自然就不是安全和幂等的;另外开发者也可以用POST方法实现查询数据的请求,此时POST请求就是安全和幂等的
HTTP缓存技术
HTTP的缓存技术主要有两种:强制缓存和协商缓存:
-
强制缓存:只要本地缓存没有过期,就是用本地缓存的资源
-
协商缓存:若本地存在缓存,客户端会给服务端发送请求,若客户端发现请求资源和客户端的本地缓存一致,就返回一个304响应码表示可以使用本地缓存;否则返回响应码200和最新的资源
其中协商缓存的具体做法是:
-
方法1:第一次请求服务端资源时,服务端返回请求的资源和一个标志位(Last-Modified:记录资源的最后修改时间),客户端把资源和标志位缓存到本地,当再次请求相同资源时,将标志位发送给服务端,服务端通过客户端发过来的标志位判断服务器资源和客户端的缓存是否一致,若一致则返回304,否则返回新的请求资源和标志位
-
方法2:第一次请求服务端资源时,服务端返回资源和一个标志位(Etag:资源的唯一标识符,若资源被修改,则标志位也不同),客户端把资源和标志位缓存到本地,当再次请求相同资源时,将标志位发送给服务端,服务端通过客户端发过来的标志位判断服务器资源和客户端的缓存是否一致,若一致则返回304,否则返回新的请求资源和标志位
-
方法1是根据修改时间做出判断的,而时间容易被篡改,相对不安全一些,所以一般方法2用的多一些。此外如果服务端将Last-Modified和Etag发送给了客户端,客户端再次请求相同资源时会将两个标志位同时发送给服务器,由于Etag优先级更高,服务器会先判断Etag,若Etag没有变化,再比较Last-Modified
HTTP的特性
HTTP协议主要有HTTP1.1、HTTP2.0和HTTP3.0,不同版本特性也不同,这里先用HTTP1.1介绍,后续其他版本也会介绍
1、HTTP1.1的优点
-
简单:HTTP请求由head和body组成,二者都是键值对的形式
-
灵活且易于扩展:HTTP协议里的URL、各种求情方法、head字段等等都没有固定死,开发者可以自定义和扩展
-
应用广泛且跨平台:在PC和手机端都适用,且存在基于HTTP的大量应用程序
2、HTTP1.1的缺点
-
由于无状态,通信双方无需身份验证,故而可能遭遇伪装,比如访问到假网站
-
由于明文传输,信息容易泄露,比如账号被盗
-
无法验证报文完整性,报文可能被修改,比如植入广告
3、HTTP1.1的性能如何
结论:性能一般;
原因:HTTP1.1是基于“请求-应答”模式和TCP/IP的,故性能关键在于这两者
-
“请求-应答”模式导致第一个请求得到回应后才能进行第二次请求,如果第一次请求被阻塞,之后的请求都会被阻塞(队头阻塞现象)
-
HTTP1.0中,TCP/IP导致每次发送数据都需要“三次握手”建立连接,以及四次挥手断开连接,开销较大;HTTP1.1中实现了“长连接”,从而能连接复用,“长连接”使得管道传输成为可能,管道传输是指客户端可以发起多次请求,不需要等前一个请求被响应了才能发第二个请求,服务端会按顺序依次响应请求,但是服务端的第一个请求处理时被阻塞了,后续请求都会被阻塞,故管道传输并没有解决响应端的队头阻塞问题(并且实际中支持管道传输技术并不是默认开启的,而且浏览器基本都不支持该技术)
HTTP与HTTPS
1、HTTP和HTTPS的区别
-
HTTP进行明文传输,而HTTPS会对报文进行加密再传输(因为HTTPS中加入了SSL/TSL协议)
-
HTTP进行“TCP三次握手”后,通信双方就建立了连接,而HTTPS再“TCP三次握手”后还需进行“SSL/TLS”的握手过程
-
HTTP的默认端口号是80,而HTTPS的默认端口号是443
-
HTTPS还需要向CA申请数字身份证书,保证服务器身份是可靠的
2、HTTPS解决了HTTP哪些问题
总的来说,解决了HTTP相对不安全的问题。具体来说:
-
信息加密:导致信息不易泄露
-
身份证书:通过数字身份证书,保证服务器是可靠的
-
校验机制:核对内容是否被篡改,若被篡改则不会被显示
HTTP1.1、HTTP2.0、HTTP3.0的演变
1、HTTP1.1相对于HTTP1.0如何提高的性能
-
使用长连接的方式,使得连接能够被复用,改善了原先短连接的性能开销
-
支持管道传输,第一个请求发出去了,不必等待响应就可以发送第二个请求,提高了整体响应时间
但仍然存在性能瓶颈:
-
只对body部分进行压缩,head部分不压缩,如果head部分很大,则延迟越大
-
如果多次请求的head部分都一样,不会做任何处理,这也会导致资源的浪费
-
存在队头阻塞的现象
-
只能客户端主动发起请求,服务端被动响应
-
请求不存在优先级(会导致紧急请求得不到有效响应)
2、HTTP2.0做了什么优化?
1、安全性方面:
HTTP2.0协议是基于HTTPS的,即添加了SSL/TLS协议,所以HTTP2.0更安全
2、性能方面:
-
头部压缩:不经对body部分压缩,而且head部分也会被压缩;如果多次请求的head部分相似,也会出去冗余
-
二进制格式:报文采用二进制格式传输,效率更高
-
并发传输:引入stream流,实现请求的并发传输,整体响应时间变短(一个TCP连接包含多个stream流,每个stream流可以看成是一个请求或响应,一个请求包含多个数据帧(frame),每个stream流都已唯一标识的stream流ID,故而不同流的数据帧可以错序发送,从而做到并发不同的stream流)
-
服务器主动推送:在HTTP1.1中,客户端向服务器请求html文件,该html可能需要css渲染,则会再发起一个获取css文件的请求;而HTTP2.0中服务器会主动推送css文件给客户端
但仍然存在缺陷:
HTTP2.0通过并发传输在HTTP层面解决了队头阻塞问题,但是在TCP层面依然存在队头阻塞问题:如果接收方接收到的某个stream流缺失了部分数据帧,则之后的stream流即使数据完整,也会等待前面那个stream重新获取到缺失的数据帧且被接收方读取
3、HTTP3.0做了什么优化?
HTTP1.1存在HTTP层面的队头阻塞问题,HTTP2.0存在TCP层面的队头阻塞问题。
HTTP3.0直接把TCP协议换成了UDP协议!
但UDP是不可靠传输,发送方只管发送数据,不管顺序和丢包。于是HTTP3.0使用了基于UDP协议的QUIC协议从而使UDP实现类似TCP的可靠传输。
QUIC协议的特点如下:
-
无队头阻塞:若前一个stream流的数据帧缺失,则只将该stream流被阻塞,后续stream流不受影响
-
更快的建立连接:相较于TCP的三次握手,连接的建立过程更快,且QUIC协议包含了TLS协议
-
连接迁移:基于TCP的HTTP协议是基于TCP四元组(源ip,源端口,目标ip,目标端口)确定双方的连接,那么如果一个移动设备由4G网络切换到WIFI时ip地址也会发生变换,导致连接会断开,再重新建立连接(TCP三次握手和TLS握手),存在时延;而QUIC协议是通过“连接ID”标记通信双方,即使切换网络,只要“连接ID”不变,就无需重新建立连接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY