哈喽大家好呀~ 我最近感觉记忆
比年龄
先到中年
学而不思则"忘"
,学了又思还是"忘"
,还是得写写水文,保持记录"证据"的习惯呀。
好嘞,废话不多说,搜刮一下HTTP
常见面试题
出发点是方便记忆
,简洁、直观展示,可能有很多细节没补充到~ 见谅撒~~

1.什么是HTTP? HTTP 和 HTTPS 的区别?
《图解HTTP》中解释道:
Web使用一种名为HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器等一系列运作流程。而协议是指规则的约定。可以说,Web是建立在HTTP协议上通信的。

看着有点懵。。简单来说
设计HTTP最初的目的是:为了提供一种发布和接收
HTML
页面的方法,它有以下特点:
- 基于
TCP/IP
通信协议明文
传递数据,内容可能会被窃听。 - 灵活:
报文
可按照其规则自定义字段,且传输的数据并不是计算机底层中的二进制包,而是文本、HTML文件、图片、视频、压缩包
等等。 - 无连接:
无连接
并不是指 不连接,而是限制每次连接只处理一个请求
,当服务器返回本次请求的应答后便立即关闭连接
,下次请求再重新建立连接。 - 无状态:无法根据之前的状态进行本次的请求处理。
1.1 小结:HTTP 和 HTTPS 的区别
- 默认端口不同,HTTP是80,HTTPS是443
- HTTPS相对来说更安全,HTTPS使用了SSL/TLS协议做了加密处理
- HTTP相对来说性能更高,HTTPS需要做服务器、客户端加密解密处理,消耗更多的CPU及内存资源
- 使用HTTPS成本更高,HTTPS需要SSL,SSL证书需要钱
1.2 扩展:为什么说HTTPS更安全?
上述提到HTTP通过明文传输
,不够安全,然后加了SSL/TLS
搞了个升级版(HTTPS),核心有3点:

(1)混合加密(对称加密+非对称加密):实现通信加密
- 对称加密(也叫私钥加密):通信双方使用
相同的密钥
去加密/解密数据。 - 非对称加密(也叫公钥加密):使用一对密钥,
公钥加密
的密文只有对应的私钥
才能解密
。

- 客户端发起请求(默认443端口)
- 服务器返回
公钥
证书(服务器中有一对公钥和私钥,只发公钥
给客户端) - 客户端
验证证书
- 客户端生成
对称密钥
,使用公钥
加密后发给服务器 - 服务器使用
私钥
解密,得到对称密钥 - C/S双方使用对称密钥:
- 加密
明文
并发送 - 解密
密文
得到明文
- 加密
(2)摘要算法(哈希算法):确保传递真实的信息,防止数据被篡改
实现完整性的手段主要是摘要算法,摘要算法又称哈希算法、散列算法。它通过一个函数,把
任意长度
的数据转换为一个长度固定
的数据串。
由于不管原始数据是什么样的,得到的哈希值都是固定长度的,也就是说哈希值并不是原始数据加密后的密文,只是一个验证身份的令牌,比较常用的摘要算法有:MD5、SHA-1、SHA-256等。

(3)数字签名:身份验证
奉天承运,皇帝诏曰! 等等。。这圣旨不会是伪造的吧?
漏漏漏 大漏特漏,大人请看章印和画押!
数字签名
的作用等同于签名
和指纹
,是独一无二
的,为了证明我是"我"。

《图解HTTP》中 HTTPS 工作流程如下所示:
2.HTTP1.0/1.1/2.0 的区别?
HTTP1.0:
- 浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接
HTTP1.1:
- 引入了持久连接,即TCP连接默认不关闭,可被多个请求复用
- 在同一个TCP连接里面,客户端可以同时发送多个请求
- 虽然允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的,服务器只有处理完一个请求,才会接着处理下一个请求。如果前面的处理特别慢,后面就会有许多请求排队等着
- 新增了一些请求方法
- 新增了一些请求头和响应头
HTTP2.0:
- 采用二进制格式而非文本格式
- 完全多路复用,而非有序并阻塞的、只需一个连接即可实现并行
- 使用报头压缩,降低开销
- 服务器推送
3.HTTP 常见的状态码有哪些?
响应分为五类:信息响应(100--199),成功响应(200--299),重定向(300--399),客户端错误(400--499)和服务器错误 (500--599):
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见的有十几种:
状态码 | 状态码英文名称 | 场景 |
---|---|---|
200 | OK | 请求成功 |
201 | Created | 新增或修改数据成功 |
202 | Accepted | 请求已进入任务队列,被异步处理 |
203 | Non-Authoritative Information | 令牌或登录状态失效 |
204 | No Content | 删除数据成功 |
301 | Moved Permanently | 请求的资源被永久重定向到新的位置,将从新的地址重新请求 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
403 | Forbidden | 得到访问授权,但访问是被禁止 |
404 | Not Found | 访问资源不存在 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 请求的数据格式不是服务接收的类型 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
502 | Bad Gateway | 服务器网关错误 |
503 | Service Unavailable | 超载或系统维护 |
4.GET 和 POST 的区别?
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 会被浏览器主动cache | 不会缓存,除非手动设置 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data 为二进制数据使用多重编码 |
历史 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
对数据长度的限制 | 限制长度(最大长度是 2048 个字符) | 无限制 |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制,也允许二进制数据 |
安全性 | 安全性较差,参数直接暴露在URL上 | 更安全,参数不会被保存在浏览器历史或 web 服务器日志中 |
可见性 | 参数通过URL传递,对所有人都是可见的 | POST放在Request body中 |
5.在地址栏输入 URL 后发生了什么?(总结成了4步)

- URL解析: 先判断输入的是
URL
还是要搜索的关键字
,若是URL则解析获取协议、主机、端⼝、path等信息。 - IP寻址: 根据
URL
进行DNS域名解析
,找到真实IP
- 请求/返回数据:
-
向服务器发起
连接请求
,进行三次握手
建立TCP链接,连接后发送HTTP
请求,服务器返回相应数据 -
然后进行
四次挥手
断开TCP链接
-

- 渲染展示:
- 浏览器接收
HTTP响应
,对响应进行解码 - 解析
HTML
文件创建DOM树
,解析CSS
构建CSSOM树
- 结合
DOM
、CSS
构建渲染树,最后布局和绘制渲染树
- 浏览器接收