那些年与面试官交手过的HTTP问题
「观感度:🌟🌟🌟🌟🌟」
「口味:剁椒鱼头」
「烹饪时间:20min」
本文已收录在Github
,https://github.com/Geekhyt/front-end-canteen,感谢Star。
从淡黄的长裙和蓬松的头发我察觉到,面前坐着的这位女面试官属实是有点东西。我的自我介绍也变得声情并茂起来。Skr~~~ 在此期间,小姐姐面无改色的看着我的简历。不过无所谓,这些都不重要。
还是咱们的原定计划,把面试官引到了咱们最擅长的领域。
你觉得自己最擅长的是什么?
HTTP 协议吧,我还算比较了解。
0.那你说一下OSI 网络分层模型是怎样分层的?
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
application layer、presentation layer、session layer、transport layer、network layer、data link layer、physical layer
1.TCP/IP 网络分层模型是怎样分层的?
应用层、传输层、网际层、链接层
application layer、transport layer、internet layer、link layer
2.TCP 和 UDP 区别?
TCP 和 UDP 都是传输层的协议,但二者有着截然不同的基因。
TCP:
面向连接 面向字节流 有状态 保证可靠交付 具备拥塞控制 点对点传播 有序
UDP:
无连接 面向数据报 无状态 不保证可靠交付 不具备拥塞控制 广播、多播 无序
3.TCP 的三次握手和四次挥手简单说一下
三次握手
1.客户端主动发起 SYN
2.服务端收到并返回 SYN 以及 ACK 客户端的 SYN
3.客户端收到服务端的 SYN 和 ACK 后,发送 ACK 的 ACK 给服务端,服务端收到后连接建立
Client -> SYN -> Server
Server -> SYN/ACK -> Client
Client -> ACK -> Server
四次挥手
1.客户端发送 FIN 给服务端
2.服务端收到后发送 ACK 给客户端
3.服务端发送 FIN 给客户端
4.客户端收到后,发送 ACK 的 ACK 给服务端,服务端关闭,客户端等待 2MSL 后关闭
Client -> FIN -> Server
Server -> ACK -> Client
Server -> FIN -> Client
Client -> ACK -> Server -> CLOSED
Client -> 2MSL 的时间 -> CLOSED
4.什么是HTTP协议?
(小白回答版)
HTTP 就是超文本传输协议
呀,它的英文是 HyperText Transfer Protocol。
敲黑板!
(罗剑锋老师的完美回答版)
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
(面试官:理解的不错)
5.你知道哪些 HTTP 的请求方法?
GET 获取资源 (幂等)
POST 新增资源 HEAD 获取HEAD元数据 (幂等)
PUT 更新资源 (带条件时幂等)
DELETE 删除资源 (幂等)
CONNECT 建立 Tunnel 隧道 OPTIONS 获取服务器支持访问资源的方法 (幂等)
TRACE 回显服务器收到的请求,可以定位问题。 (有安全风险)
6.说一下HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3各版本之间的区别?
请移步我的另一篇专栏。
7.说一下你对HTTPS的了解
HTTPS 就是在 HTTP 和 TCP 协议中间加入了 SSL/TLS 安全套接层。
结合非对称加密和对称加密的各自优点,配合证书。既保证了安全性,也保证了传输效率。
目前应用最广泛的是TLS1.2
,实现原理如下:
1.Client 发送 random1+对称加密套件列表+非对称加密套件列表
2.Server 收到信息, 选择 对称加密套件+非对称加密套件 并和 random2+证书(公钥在证书中)
一起返回3.Client 验证证书有效性,并用 random1+random2 生成 pre-master 通过服务器公钥加密+浏览器确认
发送给 Server4.Server 收到 pre-master
,根据约定的加密算法对random1+random2+pre-master(解密)生成 master-secret
,然后发送服务器确认5.Client 收到生成同样的 master-secert
,对称加密秘钥传输完毕
TLS1.3
则简化了握手过程,完全握手只需要一个消息往返,提升了性能。不仅如此,还对部分不安全的加密算法进行了删减。
8.你所谓的约定的加密算法应该是 ECDHE 椭圆算法吧?HTTP 传输消息都是明文的,黑客完全可以作为中间人劫持消息,再利用 ECDHE 算法,这样不就能破解密钥了吗?
ECDHE 算法利用了椭圆曲线和离散对数
等思想,按照当下的计算机算力,很难在短时间进行破解。且每次握手时生成的都是一对临时的公钥和私钥,这样就保证每次的密钥对也不同。
即使大费力气破解了一次的密钥,之前的历史消息也不会受到影响,保证了前向安全。
当然,TLS 协议的安全性受限于当下最快的计算机运行速度,理论上绝对安全的是量子通讯传递密钥
。
(面试官:小伙子有点东西)
(基操,勿6)
9.说一说你对DNS的理解?
DNS (Domain Name System)
是互联网中的重要基础设施,负责对域名的解析工作,为了保证高可用、高并发和分布式,它设计成了树状的层次结构。
由根DNS服务器、顶级域 DNS 服务器和权威 DNS 服务器组成。
解析顺序是首先从浏览器缓存
、操作系统缓存
以及本地 DNS 缓存 (/etc/hosts)
逐级查找,然后从本地 DNS 服务器
、根 DNS
、顶级 DNS
以及权威 DNS
层层递归查询。
还可以基于域名在内网、外网进行负载均衡。
不过传统的 DNS 有很多问题(解析慢、更新不及时),HTTPDNS
通过客户端 SDK 和服务端配合,直接通过 HTTP 调用解析 DNS 的方式,可以绕过传统 DNS 这些缺点,实现智能调度。
(面试官:小伙子理解的挺细啊)
10.说一说你对 CDN 的理解?
CDN(Content Delivery Network)
就是内容分发网络。
为了突破现实生活中的光速、传输距离等物理限制,CDN 投入了大量资金,在全球范围内各大枢纽城市建立机房,部署大量高存储高带宽的节点,构建跨运营商、跨地域的专用高速传输网络。
其中分为中心节点、区域节点、边缘节点等,在用户接入网络后,首先通过全局负载均衡 (Global Sever Load Balance)
,简称 GSLB 算法负责调度,找到离用户最合适的节点。然后通过 HTTP 缓存代理技术进行缓存,缓存命中就返回给用户,否则就回源站去取。CDN 擅长缓存静态资源(图片、音频等),当然也支持动态内容的缓存。
11.说一说你对 WebSocket 的理解?
WebSocket
是一种基于 TCP 的轻量级网络通信协议。和 HTTP/2 一样,都是为了解决 HTTP 某些方面的缺陷而诞生的。不过解决方式略有不同,HTTP/2 针对的是“队头阻塞 ”,WebSocket 针对的是“请求-应答”的通信模式。
我们知道“请求-应答”是半双工的通信模式,不具备服务器推送能力。这就限制了 HTTP 在实时通信领域的发展。虽然可以使用轮询来不停的向服务器发送 HTTP 请求,但是缺点也很大,反复的无效请求占用了大量的带宽和 CPU 资源。所以,WebSocket 应运而生。
WebSocket 是一个全双工通信协议,具备服务端主动推送的能力。本质上是对 TCP 做了一层包装,让它可以运行在浏览器环境里。
看过我这篇专栏「吐血整理」再来一打Webpack面试题 的同学们一定知道,Webpack 的热更新中就利用了这种协议。当然,在即时通讯、游戏以及可视化大屏展示等领域中也都有着 WebSocket 的身影。
(关于 WebSocket 的过多细节这里不再展开,后续有机会在专栏中详细介绍,感兴趣的同学们可以先自行学习)
12.HTTP 的缓存策略知道吗?
强缓存
服务器使用 Cache-Control
来设置缓存策略,常用 max-age
来表示资源的有效期。
(这里的 max-age 的时间计算起点是响应报文的创建时刻,而不是客户端收到报文的时刻。)
(浏览器也可以发送 Cache-Control 字段,使用 max-age=0 或 no-cache 来刷新数据)
如果想更精确的控制缓存策略,还可以使用 Cache-Control 的其他属性:
no-store:不允许缓存 (用于秒杀页面等变化频率非常高的场景) no-cache:可以缓存,使用前必须要去服务端验证是否过期,是否是最新版本 must-revalidate:如果缓存不过期就可以继续使用,过期了就必须去服务端验证
协商缓存
验证资源是否失效就需要使用条件请求
。常用的是 If-Modified-Since
和 If-None-Match
,收到 304
状态码就可以复用缓存里的资源。
(If-None-Match 比 If-Modified-Since 优先级更高)
验证资源是否被修改的条件有两个 Last-modified
和 ETag
(ETag 比 Last-modified 的精确度更高),需要预先在服务端的响应报文里设置,配合条件请求使用。
13.HTTP 如何进行内容协商?
内容协商就是每个 URI 指向的资源可以是任何事物,可以有很多不同的表述。对于文档来说,可以有不同的语言、不同的媒体格式,并针对不同的浏览器提供不同的压缩编码。
主动式内容协商 客户端在请求头部中提出需要的表述形式,服务器根据其来进行特定表述 响应式内容协商 服务端返回 300 或者 406,由客户端选择一种表述
协商要素
质量因子q:内容的质量、可接受类型的优先级 媒体资源的 MIME 类型 字符编码 (UTF-8) 内容编码 (Accept-Encoding:gzip,deflate,br) 表述语言 (Accept-Language:zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7) 国际化与本地化 (i18n,l10n)
14.说一说 HTTP 的重定向
重定向是服务器发起的跳转,要求客户端使用新的 URI 重新发送请求。在响应头字段 Location
中指示了要跳转的 URI。使用 Refresh
字段,还可以实现延时重定向。
301 / 302
是常用的重定向状态码。分别代表永久性重定向
和临时性重定向
。
除此之外还有:
303:类似于 302,重定向后的请求方法改为 GET
方法307:类似于 302,含义比 302 更明确,重定向后请求的方法和实体不允许变动 308:类似于 301,代表永久重定向,重定向后请求的方法和实体不允许变动 300:是一个特殊的重定向状态码,会返回一个有多个链接选项的页面,由用户自行选择 304:是一个特殊的重定向状态码,服务端验证过期缓存有效后,要求客户端使用该缓存
15.你知道哪些 HTTP 的常用的首部字段?
(上文中提到过一些,这里只列举一些常用的)
(开始报菜名)
通用首部字段
Cache-Control
控制缓存Connection
连接管理Transfor-Encoding
报文主体的传输编码格式Date
创建报文的时间Upgrade
升级为其他协议
请求首部字段
Host
请求资源所在的服务器 (唯一一个HTTP/1.1规范里要求必须出现的字段)Accept
客户端或者代理能够处理的媒体类型If-Match
比较实体标记 (ETag)If-None-Match
比较实体标记 (ETag),与 If-Match 相反If-Modified-Since
比较资源更新时间 (Last-Modified)If-Unmodified-Since
比较资源更新时间 (Last-Modified), 与 If-Modified-Since 相反Range
实体的字节范围请求User-Agent
客户端信息
响应首部字段
Accept-Ranges
能接受的字节范围Location
命令客户端重定向的 URIETag
能够表示资源唯一资源的字符串Server
服务器的信息
实体首部字段
Allow
资源可支持 HTTP 请求方法Last-Modified
资源最后修改时间Expires
实体主体过期时间Content-Language
实体资源语言Content-Encoding
实体编码格式Content-Length
实体大小Content-Type
实体媒体类型
16.你知道哪些 HTTP 状态码?
(上文中提到过一些,这里只列举一些常用的)
(开始报菜名)
1xx
1xx:请求已经接收到,需要进一步处理才能完成,HTTP/1.0 不支持
100 Continue
:上传大文件前使用101 Switch Protocols
:协议升级使用102 Processing
:服务器已经收到并正在处理请求,但无响应可用
2xx
2xx:成功处理请求
200 OK
:成功返回响应201 Created
:有新资源在服务器端被成功创建202 Accepted
:服务器接受并开始处理请求,但请求未处理完成206 Partial Content
:使用range协议时返回部分响应内容时的响应码
3xx
请查阅上文重定向部分,这里不再赘述。
4xx
4xx:客户端出现错误
400 Bad Request
:服务器认为客户端出现了错误,但不明确,一般是 HTTP 请求格式错误401 Unauthorized
:用户认证信息确实或者不正确403 Forbidden
:服务器理解请求的含义,但没有权限执行407 Proxy Authentication Required
:对需要经由代理的请求,认证信息未通过代理服务器的验证404 Not Found
:服务器没有找到对应的资源408 Request Timeout
:服务器接收请求超时
5xx
5xx:服务器端出现错误
500 Internal Server Error
:服务器内部错误,且不属于以下错误类型502 Bad Gateway
:代理服务器无法获取到合法响应503 Service Unavailable
:服务器资源尚未准备好处理当前请求505 HTTP Version Not Supported
:请求使用的 HTTP 协议版本不支持
小姐姐拿起桌旁已经凉透的芋泥波波奶茶,喝了一口。
(精神小伙啊)
参考
透视 HTTP 协议 (罗剑锋) 趣谈网络协议 (刘超) Web 协议详解与抓包实战 (陶辉)
❤️爱心三连击
1.看到这里了就点个在看支持下吧,你的「在看」是我创作的动力。
2.关注公众号前端食堂,「你的前端食堂,记得按时吃饭」!
3.本文已收录在前端食堂Github https://github.com/Geekhyt/front-end-canteen,求个小星星,感谢Star。
公众号:前端食堂
掘金:童欧巴
知乎:童欧巴
这是一个终身学习的男人,他在坚持自己热爱的事情,欢迎加入前端食堂,和这个男人一起开心的变胖~
推荐阅读:
在看和转发是莫大鼓励❤️