# HTTP

# 横向对比
# 1. HTTP/1.0 和 HTTP/1.1 的区别
- 长连接: HTTP/1.1 支持长连接和请求的流水线,在一个 TCP 连接上可以传送多个 HTTP 请求,避免了因为多次建立 TCP 连接的时间消耗和延时
- 缓存处理: HTTP/1.1 引入
Entity tag,If-Unmodified-Since,If-Match,If-None-Match等新的请求头来控制缓存 - 带宽优化及网络连接的使用: HTTP1.1 则在请求头引入了
range头域,支持断点续传功能 - Host 头处理: 在 HTTP/1.0 中认为每台服务器都有唯一的 IP 地址,但随着虚拟主机技术的发展,多个主机共享一个 IP 地址愈发普遍,HTTP1.1 的请求消息和响应消息都应支持
Host头域,且请求消息中如果没有 Host 头域会 400 错误
# 2. GET 和 POST 的区别
标准答案:
- GET 请求参数放在 URL 上,POST 请求参数放在请求体里
- GET 请求参数长度有限制,POST 请求参数长度可以非常大
- POST 请求相较于 GET 请求安全一点点,因为 GET 请求的参数在 URL 上,且有历史记录
- GET 请求能缓存,POST 不能
其实 HTTP 协议并没有要求 GET/POST 请求参数必须放在 URL 上或请求体里,也没有规定 GET 请求的长度,目前对 URL 的长度限制,是各家浏览器设置的限制。GET和POST的根本区别在于:GET请求是幂等性的,而POST请求不是。
我们经常说 get 请求参数的大小存在限制,而 post 请求的参数大小是无限制的。这是一个错误的说法,实际上 HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对 get 请求参数的限制是来源与浏览器或 web 服务器,浏览器或 web 服务器限制了 url 的长度。为了明确这个概念,我们必须再次强调下面几点:
- HTTP 协议 未规定 GET 和 POST 的长度限制
- GET 的最大长度显示是因为 浏览器和 web 服务器限制了 URI 的长度
- 不同的浏览器和 WEB 服务器,限制的最大长度不一样
- 要支持 IE,则最大长度为 2083byte,若只支持 Chrome,则最大长度 8182byte
幂等性
指的是对某一资源进行一次或多次请求都具有相同的副作用。例如搜索就是一个幂等的操作,而删除、新增则不是一个幂等操作。
由于 GET 请求是幂等的,在网络不好的环境中,GET 请求可能会重复尝试,造成重复操作数据的风险,因此,GET 请求用于无副作用的操作(如搜索),新增/删除等操作适合用 POST
# 3. HTTP 和 HTTPS 有何区别
| HTTP | HTTPS | |
|---|---|---|
| 端口 | 80 端口 | 443 端口 |
| 证书 | 不需要 | 需要 |
| 协议 | 超文本传输协议,是明文传输 | SSL 加密的协议,传输更安全 |
| 速率 | TCP 握手的三个包 | 除了 TCP 握手的三个包 ,还要加上 SSL 握手的九个包 |
# 4. 多路复用和长连接复用的区别
# 5. tcp 和 udp 有什么区别?
# 解析和渲染
# 1. 浏览器有哪些进程,渲染进程中都有什么线程
#
# 请求和响应
# 1. HTTP 常见请求/响应头
# 1.1通用头
请求头和响应头都有的首部。
Cache-Control: 控制缓存- private(默认值):响应只能被单个客户缓存,不能被代理服务器缓存
- public:表示响应可以被任何对象缓存(包括客户端/代理服务器)
- no-cache:缓存要经过服务器验证,在浏览器使用缓存前,会对比
ETag,若没变则返回304,使用缓存 - no-store:禁止任何缓存
Connection: 是否需要持久连接(HTTP 1.1 默认持久连接)- keep-alive
- close
Transfer-Encoding: 报文主体的传输编码格式- chunked(分块)
- identity(未压缩和修改)
- gzip(LZ77 压缩)
- compress(LZW 压缩,弃用)
- deflate(zlib 结构压缩)
# 1.2请求头
Accept: 告知(服务器)客户端可以处理的内容类型。- text/html
- image/*
- /
If-Modified-Since: 将Last-Modified的值发送给服务器,询问资源是否已经过期(被修改),过期则返回新资源,否则返回304。// 示例: If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT1
2If-Unmodified-Since: 将Last-Modified的值发送给服务器,询问文件是否被修改,若没有则返回 200,否则返回 412 预处理错误,可用于断点续传。通俗点说If-Unmodified-Since是文件没有修改时下载,If-Modified-Since是文件修改时下载。// 示例: If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT1
2If-None-Match: 将ETag的值发送给服务器,询问资源是否已经过期(被修改),过期则返回新资源,否则返回 304。// 示例: If-None-Match: "bfc13a6472992d82d"1
2If-Match: 将ETag的值发送给服务器,询问文件是否被修改,若没有则返回 200,否则返回 412 预处理错误,可用于断点续传。// 示例: If-None-Match: "bfc13a6472992d82d"1
2Range: 告知服务器返回文件的哪一部分, 用于断点续传。// 示例: Range: bytes=200-1000, 2000-6576, 19000-1
2Host: 指明了服务器的域名(对于虚拟主机来说),以及(可选的)服务器监听的 TCP 端口号。// 示例: Host:www.baidu.com1
2User-Agent: 告诉 HTTP 服务器, 客户端使用的操作系统和浏览器的名称和版本。// 示例: User-Agent: Mozilla/<version> (<system-information>) <platform> (<platform-details>) <extensions>1
2
# 1.3通用头
Location: 需要将页面重新定向至的地址。一般在响应码为 3xx 的响应中才会有意义。// 示例: Location: <url>1
2ETag:资源的特定版本的标识符,如果内容没有改变,Web 服务器不需要发送完整的响应。// 示例: ETag: "<etag_value>"1
2Server: 处理请求的源头服务器所用到的软件相关信息。// 示例: Server: <product>1
2
# 1.4 实体头
针对请求报文和响应报文的实体部分使用首部
Allow: 资源可支持 http 请求的方法。// 示例: Allow: GET, POST, HEAD1
2Last-Modified: 资源最后的修改时间,用作一个验证器来判断接收到的或者存储的资源是否彼此一致,精度不如ETag。// 示例: Last-Modified: Wed, 21 Oct 2020 07:28:00 GMT1
2Expires: 响应过期时间。// 示例: Expires: Wed, 21 Oct 2020 07:28:00 GMT1
2-
# 2. Option请求的作用
# 3. 简单请求和复杂请求的区别
# 4. Https第一次请求会携带什么?
# 5. 常见 HTTP 状态码有哪些
2xx 开头(请求成功)
200 OK:客户端发送给服务器的请求被正常处理并返回
3xx 开头(重定向)
301 Moved Permanently:永久重定向,请求的网页已永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置302 Moved Permanently:临时重定向,请求的网页已临时移动到新位置。服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求304 Not Modified:未修改,自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容
4xx 开头(客户端错误)
400 Bad Request:错误请求,服务器不理解请求的语法,常见于客户端传参错误401 Unauthorized:未授权,表示发送的请求需要有通过 HTTP 认证的认证信息,常见于客户端未登录403 Forbidden:禁止,服务器拒绝请求,常见于客户端权限不足404 Not Found:未找到,服务器找不到对应资源
5xx 开头(服务端错误)
500 Inter Server Error:服务器内部错误,服务器遇到错误,无法完成请求501 Not Implemented:尚未实施,服务器不具备完成请求的功能502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。503 service unavailable:服务不可用,服务器目前无法使用(处于超载或停机维护状态)。通常是暂时状态。
# 6. HTTP 的请求报文组成部分
请求报文**4**个部分组成
- 请求行(request line)
- 请求头(header)
- 空行
- 请求数据
响应报文和请求报文结构类似,不再赘述。
# 7.HTTP所有请求方法
# 8.304页面的原理
## 连接
# 1. TCP的三次握手
# 2. tcp 怎样确保数据正确性?
# 3. tcp 头包含什么?tcp 属于那一层?
# 4. DNS 解析的具体过程
# 5. CDN 是什么? CDN 原理?为什么要用 CDN?
# 缓存
# 1. 说下缓存策略
# 2. 强缓存和协商缓存
# 3. cookie解决什么问题
# 4. cookie和token都放在header里,为什么值劫持cookie
# 5. 强缓存有哪些方法来控制
# 6. 协商缓存有哪些参数
# 协议
# 1. 传输层和网络层分别负责什么,端口在什么层标记
# 2. 网络 OSI 七层模型,TCP/IP 和 HTTP 分别位于哪一层

| 模型 | 概述 | 单位 |
|---|---|---|
| 应用层 | 各种应用软件 | -- |
| 表示层 | 数据格式标识,基本压缩加密功能 | -- |
| 会话层 | 控制应用程序之间会话能力,区分不同的进程 | -- |
| 传输层 | 负责将数据进行可靠或者不可靠传递,建立端口到端口的通信 | 数据段 |
| 网络层 | 定义 IP 地址,定义路由功能,建立主机到主机的通信 | 数据包 |
| 数据链路层 | 数据链路层将比特封装成数据帧并传递 | 帧 |
| 物理层 | 网络连接介质,如网线、光缆,数据在其中以比特为单位传输 | bit |
# HTTPS
# 1. HTTPS原理
# 2. HTTPS协议握手大概过程
# 3. HTTPS是如何进行加密的
我们通过分析几种加密方式,层层递进,理解 HTTPS 的加密方式以及为什么使用这种加密方式:
# 对称加密
- [ ] 客户端和服务器公用一个密匙用来对消息加解密,这种方式称为对称加密。客户端和服务器约定好一个加密的密匙。客户端在发消息前用该密匙对消息加密,发送给服务器后,服务器再用该密匙进行解密拿到消息。
这种方式一定程度上保证了数据的安全性,但密钥一旦泄露(密钥在传输过程中被截获),传输内容就会暴露,因此我们要寻找一种安全传递密钥的方法。
# 非对称加密
采用非对称加密时,客户端和服务端均拥有一个公钥和私钥,公钥加密的内容只有对应的私钥能解密。私钥自己留着,公钥发给对方。这样在发送消息前,先用对方的公钥对消息进行加密,收到后再用自己的私钥进行解密。这样攻击者只拿到传输过程中的公钥也无法破解传输的内容。
尽管非对称加密解决了由于密钥被获取而导致传输内容泄露的问题,但中间人仍然可以用篡改公钥的方式来获取或篡改传输内容,而且非对称加密的性能比对称加密的性能差了不少。

# 第三方证书
上面这种方法的弱点在于,客户端不知道公钥是由服务端返回,还是中间人返回的,因此我们再引入一个第三方认证的环节:即第三方使用私钥加密我们自己的公钥,浏览器已经内置一些权威第三方认证机构的公钥,浏览器会使用第三方的公钥来解开第三方私钥加密过的我们自己的公钥,从而获取公钥,如果能成功解密,就说明获取到的自己的公钥是正确的。
但第三方认证也未能完全解决问题,第三方认证是面向所有人的,中间人也能申请证书,如果中间人使用自己的证书掉包原证书,客户端还是无法确认公钥的真伪。

# 数字签名
为了让客户端能够验证公钥的来源,我们给公钥加上一个数字签名,这个数字签名是由企业、网站等各种信息和公钥经过单向 hash 而来,一旦构成数字签名的信息发生变化,hash 值就会改变,这就构成了公钥来源的唯一标识。
具体来说,服务端本地生成一对密钥,然后拿着公钥以及企业、网站等各种信息到 CA(第三方认证中心)去申请数字证书,CA 会通过一种单向 hash 算法(比如 MD5),生成一串摘要,这串摘要就是这堆信息的唯一标识,然后 CA 还会使用自己的私钥对摘要进行加密,连同我们自己服务器的公钥一同发送给我我们。
浏览器拿到数字签名后,会使用浏览器本地内置的 CA 公钥解开数字证书并验证,从而拿到正确的公钥。由于非对称加密性能低下,拿到公钥以后,客户端会随机生成一个对称密钥,使用这个公钥加密并发送给服务端,服务端用自己的私钥解开对称密钥,此后的加密连接就通过这个对称密钥进行对称加密。
综上所述,HTTPS 在验证阶段使用非对称加密+第三方认证+数字签名获取正确的公钥,获取到正确的公钥后以对称加密的方式通信
# HTTP/2.0
# 介绍一下 HTTP/2.0 新特性
- 多路复用: 即多个请求都通过一个 TCP 连接并发地完成
- 服务端推送: 服务端能够主动把资源推送给客户端
- 新的二进制格式: HTTP/2 采用二进制格式传输数据,相比于 HTTP/1.1 的文本格式,二进制格式具有更好的解析性和拓展性
- header 压缩: HTTP/2 压缩消息头,减少了传输数据的大小