这篇文章用来记录计算机网络相关的问题,以问题的形式来学习,目前计划每天学习一个知识点。
一、HTTP/HTTPS
1、HTTP与HTTPS有什么区别?(2020/11/23)
HTTPS 是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
HTPPS 和 HTTP 的概念:
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL, 因此加密的详细内容就需要 SSL。它是一个 URI scheme(抽象标识符体系),句法类同 http: 体系。用于安全的 HTTP 数据传输。https:URL 表明它使用了 HTTP,但 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP 与 TCP 之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
区别:
https 协议需要到 ca 申请证书,一般免费证书很少,需要交费。
1)http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
2)http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
3)http 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的,可进行加密传输、身份认证的网络协议,要比 http 协议安全。
HTTPS 解决的问题:
1)信任主机的问题。采用 https 的 server 必须从 CA 申请一个用于证明服务器用途类型的证书。该证书只有用于对应 server 的时候,客户端才信任此主机
2)防止通讯过程中数据泄密和被窜改
如下图所示,可以很明显的看出两个的区别:
![](https://img.haomeiwen.com/i9000209/7fb7d815b8647cb0.png)
注:TLS 是 SSL 的升级替代版,具体发展历史可以参考传输层安全性协议。
HTTP 与 HTTPS 在写法上的区别也是前缀的不同,客户端处理的方式也不同,具体说来:
如果 URL 的协议是 HTTP,则客户端会打开一条到服务端端口 80(默认)的连接,并向其发送老的 HTTP 请求。 如果 URL 的协议是 HTTPS,则客户端会打开一条到服务端端口 443 (默认)的连接,然后与服务器握手,以二进制格式与服务器交换一些 SSL 的安全参数,附上加密的 HTTP 请求。 所以你可以看到,HTTPS 比 HTTP 多了一层与 SSL 的连接,这也就是客户端与服务端 SSL 握手的过程,整个过程主要完成以下工作:
交换协议版本号 选择一个两端都了解的密码 对两端的身份进行认证 生成临时的会话密钥,以便加密信道。 SSL 握手是一个相对比较复杂的过程,更多关于 SSL 握手的过程细节,可以参考 TLS/SSL 握手过程。SSL/TLS 的常见开源实现是 OpenSSL。OpenSSL 是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛应用在互联网的网页服务器上。 更多 OpenSSL 的技术细节可以参考 OpenSSL。
2、Http1.1 和 Http1.0 及 2.0 的区别?(2020/11/24)
HTTP1.0 和 HTTP1.1 的一些区别
HTTP1.0 最早在网页中使用是在 1996 年,那个时候只是使用在一些较为简单的网页和网络请求上,而 HTTP1.1 则在 1999 年才开始广泛应用于现在的各大浏览器网络请求中,同时 HTTP1.1 也是当前使用最为广泛的 HTTP 协议。 主要区别体现在:
1)缓存处理
在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略,例如 Entity tag, If-Unmodified-Since,If-Match,If-None-Match 等更多可供选择的缓存头来控制缓存策略。
2)带宽优化及网络连接的使用
HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分, 即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
**3)错误通知的管理
在 HTTP1.1 中新增了 24 个错误状态响应码,如 409(Conflict) 表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
4)Host 头处理
在 HTTP1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此, 请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展, 在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个 IP 地址。HTTP1.1 的请求消息和响应消息都应支持 Host 头域,且请求消息中如果没有 Host 头域会报告一个错误(400 Bad Request)。
5)长连接
HTTP 1.1 支持长连接(PersistentConnection)和请求的流水线 (Pipelining)处理,在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟,在 HTTP1.1 中默认开启 Connection: keep-alive,一 定程度上弥补了 HTTP1.0 每次请求都要创建连接的缺点。
SPDY
在讲 Http1.1 和 Http2.0 的区别之前,还需要说下 SPDY,它是 HTTP1.x 的优化方案。
2012 年 google 如一声惊雷提出了 SPDY 的方案,优化了 HTTP1.X 的请求延迟,解决了 HTTP1.X 的安全性,具体如下:
1)降低延迟
针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。 多路复用通过多个请求 stream 共享一个 tcp 连接的方式,解决了 HOL blocking 的问题,降低了延迟同时提高了带宽的利用率。
2)请求优先级(request prioritization)
多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY 允许给每个 request 设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的 html 内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。
3)header 压缩
前面提到 HTTP1.x 的 header 很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
4)基于 HTTPS 的加密协议传输,大大提高了传输数据的可靠性。
5)服务端推送(server push)
采用了 SPDY 的网页,例如我的网页有一个 sytle.css 的请求,在客户端收到 sytle.css 数据的同时,服务端会将 sytle.js 的文件推送给客户端,当客户端再次尝试获取 sytle.js 时就可以直接从缓存中获取到,不用再发请求了。 SPDY 构成图:
![](https://img.haomeiwen.com/i9000209/1811eafec6c2c7e3.png)
SPDY 位于 HTTP 之下,TCP 和 SSL 之上,这样可以轻松兼容老版本的 HTTP 协议(将 HTTP1.x 的内容封装成一种新的 frame 格式),同时可以使用已有的 SSL 功能。
HTTP2.0 和 HTTP1.X 相比的新特性
1)新的二进制格式(Binary Format)
HTTP1.x 的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认 0 和 1 的组合。基于这种考虑 HTTP2.0 的协议解析决定采用二进制格式,实现方便且健壮。
2)多路复用(MultiPlexing)
即连接共享,即每一个 request 都是是用作连接共享机制的。一个 request 对应一个 id,这样一个连接上可以有多个 request,每个连接的 request 可以随机的混杂在一起,接收方可以根据 request 的 id 将 request 再归属到各自不同的服务端请求里面。
3)header 压缩
如上文中所言,对前面提到过 HTTP1.x 的 header 带有大量信息,而且每次都要重复发送,HTTP2.0 使用 encoder 来减少需要传输的 header 大小,通讯双方各自 cache 一份 header fields 表,既避免了重复 header 的传输,又减小了需要传输的大小。
4)服务端推送(server push)
同 SPDY 一样,HTTP2.0 也具有 server push 功能。
3、Https 请求慢的解决办法(2020/11/25)
1)不通过 DNS 解析,直接访问 IP
2)解决连接无法复用
http/1.0 协议头里可以设置 Connection:Keep-Alive 或者 Connection:Close,选择是否允许在一定时间内复用连接(时间可由服务器控制)。但是这对 App 端的请求成效不大,因为 App 端的请求比较分散且时间跨度相对较大。
方案 1
基于 tcp 的长连接 (主要)。移动端建立一条自己的长链接通道,通道的实现是基于 tcp 协议。基于 tcp 的 socket 编程技术难度相对复杂很多,而且需要自己定制协议。但信息 的上报和推送变得更及时,请求量爆发的时间点还能减轻服务器压力(避免频繁创建和销毁 连接)
方案 2
http long-polling 客户端在初始状态发送一个 polling 请求到服务器,服务器并不会马上返回业务数据,而是等待有新的业务数据产生的时候再返回,所以链接会一直被保持。 一但结束当前连接,马上又会发送一个新的 polling 请求,如此反复,保证一个连接被保持。 存在问题:
1)增加了服务器的压力
2)网络环境复杂场景下,需要考虑怎么重建健康的连接通道
3)polling的方式稳定性不好
4)polling的response可能被中间代理cache住 ……
方案 3
http streaming 和 long-polling 不同的是,streaming 方式通过在 server response 的头部增加“Transfer Encoding:chuncked”来告诉客户端后续还有新的数据到来,存在问题:
1)有些代理服务器会等待服务器的 response 结束之后才将结果推送给请求客户端。 streaming 不会结束 response
2)业务数据无法按照请求分割 ……
方案 4
web socket 和传统的 tcp socket 相似,基于 tcp 协议,提供双向的数据通道。它的优势是提供了 message 的概念,比基于字节流的 tcp socket 使用更简单。技术较新,不是所有浏览器都提供了支持。
3)解决 head of line blocking
它的原因是队列的第一个数据包(队头)受阻而导致整列数据包受阻使用。http pipelining,确保几乎在同一时间把 request 发向了服务器。
4、Http 的 request 和 response 的协议组成
1、Request 组成
客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式: 请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
![](https://img.haomeiwen.com/i9000209/ffa541220ed0c4c3.png)
请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI 和协议的版本。
Get 请求例子
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/,/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的 HTTP 版本.
GET 说明请求类型为 GET[/562f25980001b1b106000338.jpg]为要访问的资源
该行的最后一部分说明 使用的是 HTTP1.1 版本。
第二部分:请求头部,紧接着请求行(即第一行)之后的部分, 用来说明服务器要使用的附加信息 从第二行起为请求头部,
HOST 将指出请求的目的地.
User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等
第三部分:空行,请求头部后面的空行是必须的 即使第四部分的请求数据为空,也必须有空行。
第四部分:请求数据也叫 主体,可以添加任意的其他数据。 这个例子的请求数据为空。
POST 请求例子
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
2、Response 组成
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个 HTTP 的响应消息。 HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
![](https://img.haomeiwen.com/i9000209/462f3970b792beba.png)
第一部分:状态行,由 HTTP 协议版本号, 状态码, 状态消息 三部分组成。 第一行为状态行,(HTTP/1.1)表明 HTTP 版本为 1.1 版本,状态码为 200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息 第二行和第三行为消息报头, Date:生成响应的日期和时间;Content-Type:指定了 MIME 类型的 HTML(text/html),编码类型是 UTF-8
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。 空行后面的 html 部分为响应正文。
网友评论