Webcourse/14-前端面试/04-HTTP协议.md
2021-04-10 11:03:41 +08:00

217 lines
5.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

一面中如果有笔试考HTTP协议的可能性较大
## 前言
一面要讲的内容
- HTTP协议的主要特点
- HTTP报文的组成部分
- HTTP方法
- get post的区别
- HTTP状态码
- 什么是持久连接
- 什么是管线化
二面要讲的内容
- 缓存
- CSRF攻击
## HTTP协议的主要特点
- 简单快速
- 灵活
- **无连接**
- **无状态**
通常我们要答出以上四个内容如果实在记不住一定要记得后面的两个**无连接无状态**
我们分别来解释一下
### 简单快速
**简单**每个资源比如图片页面都通过 url 来定位这都是固定的在http协议中处理起来也比较简单想访问什么资源直接输入url即可
### 灵活
http协议的头部有一个`数据类型`通过http协议就可以完成不同数据类型的传输
### 无连接
连接一次就会断开不会继续保持连接
### 无状态
客户端和服务器端是两种身份第一次请求结束后就断开了第二次请求时**服务器端并没有记住之前的状态**也就是说服务器端无法区分客户端是否为同一个人同一个身份
有的时候我们访问网站时网站能记住我们的账号这个是通过其他的手段比如 session做到的并不是http协议能做到的
## HTTP报文的组成部分
![](http://img.smyhvae.com/20180306_1400.png)
在回答此问题时我们要按照顺序回答
- 先回答的是http报文包括**请求报文****响应报文**
- 再回答的是每个报文包含什么部分
- 最后回答每个部分的内容是什么
### 请求报文包括
![](http://img.smyhvae.com/20180228_1505.jpg)
- 请求行包括请求方法请求的urlhttp协议及版本
- 请求头一大堆的键值对
- **空行**指的是当服务器在解析请求头的时候如果遇到了空行则表明后面的内容是请求体
- 请求体数据部分
### 响应报文包括
![](http://img.smyhvae.com/20180228_1510.jpg)
- 状态行http协议及版本状态码及状态描述
- 响应头
- 空行
- 响应体
## HTTP方法
包括
- GET获取资源
- POST传输资源
- put更新资源
- DELETE删除资源
- HEAD获得报文首部
HTTP方法有很多但是上面这五个方法要求在面试时全部说出来不要漏掉
get post 比较常见
put delete 在实际应用中用的很少况且业务中一般不删除服务器端的资源
head 可能偶尔用的到
## get post的区别
![](http://img.smyhvae.com/20180306_1415.png)
区别有很多如果记不住面试时至少要任意答出其中的三四条
有一点要强调**get是相对不隐私的而post是相对隐私的**
我们大概要记住以下几点
1浏览器在回退时get**不会重新请求**但是post会重新请求重要
2get请求会被浏览器**主动缓存**而post不会重要
3get请求的参数会报**保留**在浏览器的**历史记录**而post不会做业务时要注意为了防止CSRF攻击很多公司把get统一改成了post
4get请求在url中传递的参数有大小限制基本是2kb不同的浏览器略有不同而post没有注意
5get的参数是直接暴露在url上的相对不安全而post是放在请求体中的
## http状态码
http状态码分类
![](http://img.smyhvae.com/20180306_1430.png)
常见的http状态码
![](http://img.smyhvae.com/20180306_1431.png)
部分解释
- 206的应用`range`指的是请求的范围客户端只请求某个大文件里的一部分内容比如说如果播放视频地址或音频地址的前面一部分可以用到206
- 301重定向永久
- 302重定向临时
- 304我这个服务器告诉客户端你已经有缓存了不需要从我这里取了
![](http://img.smyhvae.com/20180306_1440.png)
400和401用的不多403指的是请求被拒绝404指的是资源不存在
## 持久链接/http长连接
> 如果你能答出持久链接这是面试官很想知道的一个点
- **轮询**http1.0客户端每隔很短的时间都会对服务器发出请求查看是否有新的消息只要轮询速度足够快例如1秒就能给人造成交互是实时进行的印象这种做法是无奈之举实际上对服务器客户端双方都造成了大量的性能浪费
- **长连接**HTTP1.1通过使用Connection:keep-alive进行长连接客户端只请求一次但是服务器会将继续保持连接当再次请求时避免了重新建立连接
注意HTTP 1.1默认进行持久连接在一次 TCP 连接中可以完成多个 HTTP 请求但是对**每个请求仍然要单独发 header**Keep-Alive不会永久保持连接它有一个保持时间可以在不同的服务器软件如Apache中设定这个时间
## 长连接中的管线化
> 如果能答出**管线化**则属于加分项
### 管线化的原理
长连接时**默认**的请求这样的
```
请求1 --> 响应1 -->请求2 --> 响应2 --> 请求3 --> 响应3
```
长连接中的管线化请求是这样的
```
请求1 --> 请求2 --> 请求3 --> 响应1 --> 响应2 --> 响应3
```
管线化就是我把现在的请求打包一次性发过去你也给我一次响应回来
### 管线化的注意事项
面试时不会深究管线化如果真要问你就回答我没怎么研究过准备回去看看~