一个HTTP打趴80%面试者,你是否也被面试官”虐“?
Posted 码民的飘柔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个HTTP打趴80%面试者,你是否也被面试官”虐“?相关的知识,希望对你有一定的参考价值。
前言
HTTP 可以说是互联网的基石,我们浏览的网页、刷的视频、玩的游戏,都离不开 HTTP 协议,而且热门的 nginx、Apache、gRPC 等服务背后的技术也是由 HTTP 协议支撑的,可以说 HTTP 既常见又重要。
就前段时间,我和一位面试官交流心得,他说面试一年多,每当问起候选人对 HTTP 的理解,却经常出现这样的情形:
- 面试官:请问你了解 HTTP 协议吗?
- 前端开发:这不是应该后端清楚的吗?
- 后端开发:这不应该是前端知道的吗?
- 面试官:…
正文
其实无论是前端还是后端,都需要了解 HTTP。前端接触较多的是在其上层的 HTTP 协议,包括承载请求的 HTTP 和 HTTPS 协议,而随着前端路由的控制越来越多,深刻理解 HTTP 的 Header、Body 等属性是很有好处的。
学好了 HTTP 对于 Web 开发和性能优化等都有用处。比如页面资源的缓存策略,如果对 HTTP 协议不够了解,就没法进行方案的制定或者优化。页面资源加载速度的优化,也同样离不开对 HTTP/2 的了解。
就这么说吧,如果你不懂 HTTP 协议,就相当于是个只有“半桶水”的程序员。
话虽如此,不少人觉得:“HTTP 协议好简单的啦,还用系统学吗?” “HTTP 不就是请求 / 响应、GET/POST、Header/Body 吗?网络上的资料一抓一大把,有什么问题搜一下就是了。”
但事实是,就因为 HTTP 太常见、太普遍了,很多工作 7、8 年的老手,也未必搞得清楚,当年我也是在工作上踩了大坑,所以才下定决心“死磕” HTTP。(不想看文,只想学习,直接拉到文末获取精选面试题)
HTTP 和 HTTPS 的区别
1、HTTPS协议需要到CA(证书颁发机构)申请证书,一般免费证书很少,需要交费。
2、HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
3、HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议,可以有效的防止运营商劫持,解决了防劫持的一个大问题,比http协议安全。
HTTP有哪些方法?
- HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法
- HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT
概念很简单很精辟,还不太理解应用场景的自行百度~~
Get 和 Post 区别
- 数据传输方式不同:GET请求通过URL传输数据,而POST的数据通过请求体传输。
- 安全性不同:POST的数据因为在请求主体内,所以有一定的安全性保证,而GET的数据在URL中,通过历史记录,缓存很容易查到数据信息。
- 数据类型不同:GET只允许 ASCII 字符,而POST无限制
- GET无害: 刷新、后退等浏览器操作GET请求是无害的,POST可能重复提交表单
- 特性不同:GET是安全(这里的安全是指只读特性,就是使用这个方法不会引起服务器状态变化)且幂等(幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同),而POST是非安全非幂等
什么是无状态协议,HTTP 是无状态协议吗,怎么解决
http是无状态的协议,也是不安全的协议,它的无状态是指对于事务处理没有记忆能力,缺少状态意味着后续的操作需要前面的信息。
解决办法:1,通过cookie解决,2,通过session会话保存。
UDP 和 TCP 的区别
TCP 和 UDP 都位于计算机网络模型中的运输层,它们负责传输应用层产生的数据。
UDP 是什么
UDP 的全称是 User Datagram Protocol,用户数据报协议。它不需要所谓的握手操作,从而加快了通信速度,允许网络上的其他主机在接收方同意通信之前进行数据传输。
数据报是与分组交换网络关联的传输单元。
UDP 的特点主要有
- UDP 能够支持容忍数据包丢失的带宽密集型应用程序
- UDP 具有低延迟的特点
- UDP 能够发送大量的数据包
- UDP 能够允许 DNS 查找,DNS 是建立在 UDP 之上的应用层协议。
TCP 是什么
TCP 的全称是Transmission Control Protocol ,传输控制协议。它能够帮助你确定计算机连接到 Internet 以及它们之间的数据传输。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。
TCP 的主要特点有
- TCP 能够确保连接的建立和数据包的发送
- TCP 支持错误重传机制
- TCP 支持拥塞控制,能够在网络拥堵的情况下延迟发送
- TCP 能够提供错误校验和,甄别有害的数据包。
TCP 和 UDP 的不同
为你罗列了一些 TCP 和 UDP 的不同点,方便理解,方便记忆。
TCP 三次握手和四次挥手,以其存在意义
三次握手
想想一下如果不确认一次,那么我们发送如果网络不好那么服务端一直开着一个链接,客户端过了一会又发了一个信息,
那么服务器端认为是一个新端请求就会创建一个新的链接,造成了不必要的性能的开销,三次握手就表示双方都收到,就不会出现上面的问题了
四次挥手
由于我们的tcp是双向的,我们客户端发送给服务端说可以断开链接了,但是可能我们的服务端端数据还没有发送完成,
所以需要进行一次确认,我们服务端发送一个ACK确认包给客户端,(我收到了),然后服务端再发送一个FIN包
(我已经传输完毕了),可以断开链接了,然后客户端确认到关闭端请求,给服务端发送收到端消息,双方就关闭了
http2和http1.1之间的区别
1.http2 是二进制传输
2.头部压缩,http1.1每次都要重复请求大量都头部信息,http2只需要发送改变都头部信息就可以
3.服务器推送:服务器可以在推送html的时候主动推送其他的一些资源
4.多路由复用:http1.1比如我们请求2个文件,一个文件请求需要1秒,第二个文件需要等待第一个请求响应结束,才可以进行三次握手传递文件,那么时间就会增加,而http2中按流等形式进行传输,帧是流等最小单位,帧中带有下标,可以识别从哪个流来的,服务器会将帧数据重新整合成流,也就是多路由复用
请你说一下 HTTP 常见的请求头
1、GET或POST:请求类型,后接请求资源、协议和版本
2、Host:主机和端口
3、Connection:是否使用持续连接
4、User-Agent:客户端浏览器的名称
5、Accept:浏览器可接受的MIME类型
6、Accept-Encoding:浏览器知道如何解码的数据编码类型
7、Accept-Language:浏览器指定的语言
8、Accept-Charset:浏览器支持的字符编码
9、Cookie:保存的Cookie对象
10、Cache-Control:用来指定当前的请求/回复中的,是否使用缓存机制。
11、Expect:表示客户端要求服务器做出特定的行为
http的状态码有哪些
HTTP状态码表示客户端HTTP请求的返回结果、标识服务器处理是否正常、表明请求出现的错误等。
cookie与session区别
- cookie将状态保存在客户端,session将状态保存在服务端。
- session相对于cookie要安全,但cookie不需要占用服务器的资源。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
地址栏输入 URL 发生了什么
1、浏览器开启一个线程来处理,对URL解析,如果有http协议就按照web方式进行处理;
2、执行浏览器内核中的对应方法,比如webview的urlLoad事件;
3、进行dns解析,找到对应的IP地址;
4、进行http协议对话,客户端发送请求报头;
5、进入到服务器的WebServer;
6、进入部署好的后端应用,如 php、Java、javascript、Python 等,找到对应的请求处理;
7、处理结束回馈报头,此处如果浏览器访问过,缓存上有对应资源,会与服务器最后修改时间对比,一致则返回304;
8、浏览器开始下载html文档(响应报头,状态码200),同时使用缓存;
9、文档树建立,根据标记请求所需指定MIME类型的文件(比如css、js),同时设置了cookie;
10、页面开始渲染DOM,JS根据DOM API操作DOM,执行事件绑定等,页面显示完成。
HTTPS 的工作原理
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。
(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。
http的响应报文是什么样的?
请求报文有4部分组成:
- 响应行
- 响应头
- 空行
- 响应体
- 响应行: 由协议版本,状态码和状态码的原因短语组成,例如HTTP/1.1 200 OK。
- 响应头:响应部首组成
- 响应体:服务器响应的数据
讲一讲强缓存和协议缓存?
http的缓存分为强缓存和协商缓存
强缓存:
cache-control : max-age: 22222 //缓存时间
from memory cache // 内存
from disk cache // 硬盘
协商缓存
Last-modified // 当前服务器时间
ETag // 当前服务器的哈希
判断过程:先判断当前强缓存时间是否过期,没有过去就去请求本地的内存和硬盘,过期就去协商缓存,返回if-Modified-Since(Last-modified) 和 if-no-Match(ETag)来判断当前文件是否有更新,如果没有更新返回304,更新则返回200和当前更新文件
SSL 连接断开后如何恢复?
一共有两种方法来恢复断开的 SSL 连接,一种是使用 session ID,一种是 session ticket。
通过session ID
使用 session ID 的方式,每一次的会话都有一个编号,当对话中断后,下一次重新连接时,只要客户端给出这个编号,服务器如果有这个编号的记录,那么双方就可以继续使用以前的秘钥,而不用重新生成一把。目前所有的浏览器都支持这一种方法。但是这种方法有一个缺点是,session ID 只能够存在一台服务器上,如果我们的请求通过负载平衡被转移到了其他的服务器上,那么就无法恢复对话。
通过session ticket
session ticket 是服务器在上一次对话中发送给客户的,这个 ticket 是加密的,只有服务器能够解密,里面包含了本次会话的信息,比如对话秘钥和加密方法等。这样不管我们的请求是否转移到其他的服务器上,当服务器将 ticket 解密以后,就能够获取上次对话的信息,就不用重新生成对话秘钥了。
HTTP 重定向和跳转
主动跳转:跳转动作是由浏览器的使用者主动发起的;
被动跳转:跳转动作是由服务器发起的,浏览器使用者无法控制。
重定向状态码
- 301:俗称“永久重定向”,原URI已经“永久”性地不存在了,今后的所有请求都必须改用新的URI.
- 302: 俗称“临时重定向”,原URI处于“临时维护”状态,新的URI是起“顶包”作用的临时工。
- 303 See Other: 类似302,但要求重定向后的请求改为GET方法,访问一个结果页面,避免POST/PUT重复操作;
- 307 Temporary Redirect: 类似302,但重定向后请求里的方法和实体不允许变动,含义比302更明确;
- 308 Permanent Redirect: 类似307,不允许重定向后的请求变动,但它是301“永久重定向”的含义。
重定向的应用场景
一个最常见的原因就是“资源不可用”,需要用另一个新的URI来代替。
不可用的原因:如域名变更、服务器变更、网站改版、系统维护。
另一个原因就是“避免重复”,让多个网址都跳转到一个URI,增加访问入口的同时还不会增加额外的工作量。如:有的网站会申请多个名称类似的域名,然后把它们重定向到主站上。
301的含义是“永久”的,如果域名、服务器、网站架构发生了大幅度的改变,比如启用了新域名、服务器切换到了新机房、网站目录层次重构,这些都算是“永久性”的改变,原来的URI已经不能用了,必须用301“永久重定向”,通知浏览器和搜索引擎更新到新地址。
302的含义是“临时”的。原来的URI在将来的某个时间点还会恢复正常,常见的应用场景就是系统维护,把网站重定向到一个通知页面,告诉用户过一会儿再来访问。另一种用法就是“服务降级”,比如双十一促销的时候,把订单查询、领积分等不重要的功能入口暂时关闭,保证核心服务能够正常运行。
HTTP 传输大文件的方法
HTTP 的连接管理
HTTPS 的优化
HTTP 性能优化
总结
HTTP 只是表面上显得简单,其实底层的运行机制、工作原理非常复杂。只是我们平常总是“KPI 优先”,从网上抓到一个解决方案,用过就完事。但一名合格的工程师,一定得深究要点和细节。只有在大框架上有足够的视野,才不会被动的陷入「学不动了」的情绪。
🎁下面是目录,含有 HTTP 高频面试题目解析,有很多干货,自己体会了👇获取的方式很简单,“点击此处加技术群”通过后即可下载一份!
面试(由于文档内容丰富,无法一一完全展示出来,仅拿出了目录作为展示)
以上是关于一个HTTP打趴80%面试者,你是否也被面试官”虐“?的主要内容,如果未能解决你的问题,请参考以下文章