| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 大厂计划 | 计算机网络高频面试题01:应用层 HTTP -> 正文阅读 |
|
[网络协议]大厂计划 | 计算机网络高频面试题01:应用层 HTTP |
? 目录 HTTP 是什么?HTTP 是 Web 客户端与服务器之间进行传输文字、图片、音频、视频等超文本数据的约定和规范。 百度百科:超文本传输协议(Hyper Text Transfer Protocol)是一个简单的请求-响应协议,它通常运行在 TCP 之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以 ASCII 形式给出;而消息内容则具有一个类似 MIME 的格式。这个简单模型是早期 Web 成功的有功之臣,因为它使开发和部署非常地直截了当。 HTTP 常见的状态码有哪些?
1XX 信息
2XX 成功
3XX 重定向
301 和 302 都会在响应头中使用字段 Location 来表示要跳转的 URL ,浏览器会自动重定向至该 URL 。
4XX 客户端错误
5XX 服务端错误
HTTP 常见首部字段有哪些?HTTP 有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。 首部字段是 请求报文 / 响应报文 中的 请求头 / 响应头 中的字段。 请求头和响应头也称为首部行(参考《计算机网络:自顶向下方法》P69)。 通用首部字段
请求首部字段
响应首部字段
实体首部字段
GET 和 POST 请求方法的区别?GET 和 POST 都是请求报文的请求行中的请求方法字段,用来表明使用何种请求方法。 作用
参数
不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)进行查看。 安全 安全的 HTTP 方法是只读的,它不会改变服务器的状态。
安全的方法除了 GET 之外还有:HEAD、OPTIONS。 不安全的方法除了 POST 之外还有 PUT、DELETE(但它们可以是幂等的)。 幂等性 幂等的 HTTP 请求方法,表明同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。
DELETE 是幂等的,因为数据只有一个,删除一次之后就算继续连续调用也无法再删除了,此时响应回来的状态码可能由 200 变为 404 。 对 HTTP 的了解?HTTP 特性 HTTP 协议是无状态协议。
HTTP/1.1 引入了 Cookie 将用户信息保存在客户端浏览器中:客户端浏览器第一次发送请求时,服务端会响应回一个 Cookie ,浏览器在之后的请求中只要携带该 Cookie 便可被服务器所认出。 除了可以将用户信息通过 Cookie 存储在用户浏览器中,也可以利用 Session 存储在服务器端,存储在服务器端的信息更加安全。比如 Session 可以存储在服务器上的文件、数据库或者内存中。也可以将 Session 存储在 Redis 这种内存型数据库中,效率会更高。 HTTP 优点
HTTP 缺点 不安全,存在安全问题:
对 HTTPS 的了解?由于 HTTP 协议存在安全性问题,所以有了 HTTPS :通过在 HTTP 协议与 TCP 协议之间加入了 SSL/TLS 协议,通过隧道的方式让 HTTP 与 SSL/TLS 先通信,再由 SSL/TLS 与 TCP 通信。 应该注意到 HTTPS 并不是一个新的协议,只是通过引入 SSL/TLS 协议,使 HTTP 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)的功能,这也就是 HTTPS 。 ? 加密:HTTPS 使用混合加密的方式,既保证了安全性又提高了效率 1. 对称密钥加密:加密和解密使用同一密钥。
? 2. 非对称密钥加密:加密和解密使用不同的密钥,分为公钥和私钥。 接收方的公钥所有人都可以获取,但私钥只有它自己拥有;任一发送方获得接收方的公钥之后,就可以使用公钥对通信内容进行加密然后传输,接收方收到通信内容后就可以使用自己的私钥对其进行解密。 非对称密钥除了用来加密,还可以用来进行数字签名。因为私钥无法被他人获取,因此发送方使用其私钥进行数字签名,接收方使用发送方的公钥对签名进行解密,即可判断这个签名是否属于发送方。
3. TTPS 采用混合加密的形式
发送方获取到接收方的公钥后就可对自己的私钥进行加密,从而保证了发送方的私钥可以安全地传输给接收方,接收方再用自己的私钥进行解密,即可安全地获得发送方的私钥。此后发送方和接收方都可用发送方的私钥进行对称密钥加密的方式来通信。 采用混合加密的形式,既保证了安全性又提高了效率。 (下图中的 Session Key 就是私钥 (Secret Key)) ? 认证:使用 CA 经私钥数字签名后携带服务器公钥的证书来认证服务器身份 CA:数字证书认证机构 CA(Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。 数字签名:发送方使用自己的私钥对通信内容进行签名,接收方使用发送方的公钥进行解密,若解密成功,则证明了通信内容就是该发送方发过来的。由此可见,私钥不仅可以用来解密,也可以用来加密,数字签名就是使用私钥进行加密,另一方可以使用其公钥解密,解密成功即可认证其身份。 证书:服务器将自己的公钥发送给 CA,CA 会生成一个将其公钥和身份绑定起来的证书,接着 CA 会使用自己的私钥对证书进行数字签名,随后 CA 就将经由自己的私钥进行数字签名后的证书发送给服务器。 认证过程:服务器发送证书给客户端,客户端获取到证书后使用浏览器或操作系统自带的 CA 公钥对证书的数字签名进行真实性确认即解密,确认无误后便可信任该服务器的身份,可以使用携带在证书中的服务器的公钥。 ? 完整性保护:SSL/TLS 提供报文摘要算法生成指纹来进行完整性保护 SSL/TLS 提供的摘要算法能够为通信内容明文生成第一无二的指纹,明文与指纹一同加密后发送给接收方,接收方解密后对解密后的明文再进行一次摘要算法计算出另一个指纹,如果此时计算出来的指纹与接收到的指纹相同,则说明接收到的报文是完整的从发送方发送过来的,没有经过篡改。 注意:HTTP 也提供了 MD5 报文摘要功能,但不是安全的。例如报文内容被篡改之后,同时重新计算 MD5 的值,通信接收方是无法意识到发生篡改的。 HTTPS 的缺点?
HTTPS 如何建立连接?其间交互了什么?HTTPS 与 HTTP 不同的地方在于多了 SSL/TLS 协议握手阶段的四次通信来产生会话密钥进而进行后序的加密通信。 1. ClinetHello TCP 三次握手建立连接之后,客户端向服务器发起加密通信 HTTPS 请求:ClientHello。 这一步中,客户端向服务器发送的消息有:
2. ServerHello 服务器收到客户端请求后,向客户端发出响应:ServerHello。 这一步中,服务器响应给客户端的内容有:
3. 客户端回应 客户端先通过浏览器或操作系统中自带的 CA 公钥对服务器发来的证书进行真实性验证。 如果验证通过,客户端就会从证书中取出服务器的公钥,用公钥加密报文,回应服务器以下内容:
客户端回应给服务器端后,服务器端和客户端就都有了3个随机数,接着就用它们协商好的加密算法,各自生成本次通信的会话密钥。 4. 服务器的最后回应 服务器收到客户端的第三个随机数之后,通过协商的加密算法,计算出本次通信的会话密钥,然后向客户端发送最后的信息:
至此,整个 SSL/TLS 的握手阶段全部结束,接下来,客户端与服务器进去加密通信,就完全是使用普通的 HTTP 协议,只不过用会话密钥加密内容。 HTTP 与 HTTPS 的区别?
HTTP/1.1 比 HTTP/1.0 多了哪些优化?
HTTP/2.0 对 HTTP/1.1 做了哪些优化?首先应该清楚:HTTP/2.0 是基于 HTTPS 的,所以安全性也有了保证。 HTTP/1.1 存在以下缺点:
HTTP/2.0 据此做了如下优化: 首部压缩 HTTP/2.0 使用了 HPACK 算法:由字典(静态字典+动态字典)+ Huffman 编码构成。
二进制分帧层 + 数据流 实现低延迟的并发传输 HTTP/2.0 优秀的地方就在于它使用了二进制格式进行数据传输,不再像 HTTP/1.1 中的纯文本式的报文;还将报文分成了 HEADERS 帧和 DATA 帧,也都是二进制格式的。 服务器收到报文后就可以直接解析二进制格式的帧,极大地提高了数据解析和传输效率。 HTTP/2.0 总共定义了 10 种类型的帧,一般分为数据帧和控制帧两类 。 ? 其次,HTTP/2.0 另一个强大的地方是:在一条 TCP 连接中使用多条 Stream 数据流来代替 HTTP/1.1 中需要使用多条 TCP 连接才能实现并发的问题。 也就是说在客户端和服务器进行通信时,仅仅只需要一条 TCP 连接即可,该连接里面可以同时存在多个 Stream 数据流来实现客户端与服务器的通信从而实现并发。 并且多个 Stream 数据流互不干扰,数据流既可以从客户端发出来也可以从服务端发出来,并且每个数据流都有一个 Stream ID,要求从客户端发出来的 Stream 数据流的 ID 是奇数的,而从服务端发出来的 Stream 数据流的 ID 是偶数的;注意,Stream ID 会携带在每一个帧的头部;并且同一个连接中的 Stream ID 是不能复用的,只能顺序递增,所以当 Stream ID 耗尽时,需要发一个控制帧 GOAWAY ,用来关闭 TCP 连接。 HTTP/2.0 的 Stream 数据流解决了 TCP 并发连接数量受限制的问题也减少了多条 TCP 连接时的握手消耗问题;并且 Stream 数据流的设计也解决了 HTTP/1.1 的队头阻塞问题降低了延迟,多个请求可以分别包含在 Stream 数据流中,谁到了服务器谁就可以被处理然后响应回客户端,不必互相进行等待;还可以为每个 Stream 流设置优先级,同时到达的 Stream 流可以根据优先级进行响应处理。 每条 Stream 数据流中包含消息(Message),消息里面又是一系列的帧(Frame)
服务端主动推送资源 HTTP/2.0 在服务端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 page.html 页面,服务端就把 script.js 和 style.css 等与之相关的资源一起发给客户端。 客户端发起的请求,必须使用奇数号 Stream ID,服务器主动的推送,使用的是偶数号 Stream ID。 服务器在响应回客户端一开始仅需要的资源时,如果服务端有附加的资源需要推送,就会连带着响应一个 PUSH_PROMISE 帧,帧中 HTTP 首部字段 Promised Stream ID 字段告知客户端,接下来会在哪个偶数号 Stream ID 中发送附带的资源。 应该注意:此时响应给客户端的消息会在两个 Stream 中,这两个 Stream 完全可以做到并发到达客户端:一个是客户端原先的奇数 Stream ,服务器正常返回一个客户端需要的资源;另一个是服务器附带的偶数 Stream,里面包含着服务器附带的资源需要推送给客户端。 ? 至此 HTTP/2.0 基于 HTTPS 的模型图可以抽象的表示为 ? |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:42:14- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |