Java程序员面试复习手册

HTTP应知应会知识点复习手册(上)

2019-02-14  本文已影响0人  蛮三刀酱

前言

本文快速回顾了常考的的知识点,用作面试复习,事半功倍。

上篇主要内容: 状态码、Http1.0/1.1/2.0、Https、GET和POST

下篇主要内容: Web攻击技术、HTTP基础概念、HTTP Header详解、HTTP应用

本文参考

本文内容主要参考来自CyC2018的Github仓库:CS-Notes,有删减,修改,补充额外增加内容

本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

状态码

图片文件夹两张图

有拓展参考:https://zhuanlan.zhihu.com/p/34648453

状态码 类别 原因短语
1XX Informational(信息性状态码) 接收的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器错误状态码) 服务器处理请求出错

1XX 信息

2XX 成功

3XX 重定向

4XX 客户端错误

5XX 服务器错误

Http1.0/1.1/2.0

参考:

  1. https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A

  2. https://github.com/CyC2018/Interview-Notebook/blob/master/notes/HTTP.md

1.1相比1.0

长连接和流水线(Pipelining)处理

HTTP 1.1支持长连接(PersistentConnection)和管线化(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。

如果要断开 TCP 连接,需要由客户端或者服务器端提出断开,使用 Connection : close

在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

Host头处理/虚拟主机

在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。(Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。)

支持分块传输编码

HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

另一种解释:可以把数据分割成多块,让浏览器逐步显示页面。

错误通知的管理/新增状态码

在HTTP1.1中新增了24个错误状态响应码,如:

缓存处理(协商缓存)

在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准。

HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

新增缓存处理指令 max-age

支持同时打开多个 TCP 连接

新增状态码 100

2.0相比1.1

https://mp.weixin.qq.com/s/NMhNVDP47npMqx5ruVy43w

HTTP/1.x 缺陷

HTTP/1.x 实现简单是以牺牲性能为代价的:

二进制分帧层

HTTP/2.0 将报文分成 HEADERS 帧和 DATA 帧,它们都是二进制格式的。

在通信过程中,只会有一个 TCP 连接存在,它承载了任意数量的双向数据流(Stream)。

在这里插入图片描述

和1.1区别在于:

在这里插入图片描述 在这里插入图片描述

二进制分帧:多路复用(MultiPlexing)

即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别?

关键点:一个是串行,一个是并行,一个阻塞不影响其他request。

header压缩

如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

在这里插入图片描述 在这里插入图片描述

服务端推送(server push)

同SPDY一样,HTTP2.0也具有server push功能。

在这里插入图片描述 在这里插入图片描述

SPYD相比1.1

多路复用

针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。

请求优先级(request prioritization)

多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。

header压缩

前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。

服务端推送(server push)

采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。

基于HTTPS的加密协议传输

大大提高了传输数据的可靠性。

HTTP2.0和SPDY的区别

HTTPs

HTTPS和HTTP的区别主要如下:

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议

3、用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证、完整性保护的网络协议,比http协议安全。

HTTP 有以下安全性问题:

HTTPs 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信。也就是说 HTTPs 使用了隧道进行通信。

隧道:它是将原始IP包(其报头包含原始发送者和最终目的地)封装在另一个数据包(称为封装的IP包)的数据净荷中进行传输。使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。

通过使用 SSL,HTTPs 具有了:

加密(防窃听)、认证(防伪装)和完整性保护(防篡改)

在这里插入图片描述

HTTPs认证

请看下面加黑字体是重点:

在这里插入图片描述

客户端:

在这个过程注意几点:

HTTPs认证后的传输

HTTPs 采用混合的加密机制,使用公开密钥加密用于传输对称密钥来保证安全性,之后使用对称密钥加密进行通信来保证效率。(下图中的 Session Key 就是对称密钥)

在这里插入图片描述

完整性保护

SSL 提供报文摘要功能来进行完整性保护。

HTTP 也提供了 MD5 报文摘要功能,但是却不是安全的。例如报文内容被篡改之后,同时重新计算 MD5 的值,通信接收方是无法意识到发生篡改。

HTTPs 的报文摘要功能之所以安全,是因为它结合了加密和认证这两个操作。试想一下,加密之后的报文,遭到篡改之后,也很难重新计算报文摘要,因为无法轻易获取明文。

HTTPs 的缺点

GET 和 POST 的区别

作用

GET 用于获取资源,而 POST 用于传输实体主体。

参数

GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1

POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

安全

安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。GET 方法是安全的,而 POST 却不是

因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。

安全的方法除了 GET 之外还有:HEAD、OPTIONS。

不安全的方法除了 POST 之外还有 PUT、DELETE。

幂等性

幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。

GET,HEAD,PUT 和 DELETE 等方法都是幂等的,

而POST 方法不是。所有的安全方法也都是幂等的。

可缓存

XMLHttpRequest

为了阐述 POST 和 GET 的另一个区别,需要先了解 XMLHttpRequest:

XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。

在使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data

但并不是所有浏览器会这么做,例如火狐就不会。而 GET 方法 Header 和 Data 会一起发送。

上一篇下一篇

猜你喜欢

热点阅读