哈喽大家好呀~ 我最近感觉记忆比年龄先到中年
学而不思则"忘",学了又思还是"忘",还是得写写水文,保持记录"证据"的习惯呀。
好嘞,废话不多说,搜刮一下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构建渲染树,最后布局和绘制渲染树
- 浏览器接收
