小艾的自留地

Stay foolish, Stay hungry

计算机网络学习——04 HTTP 篇

HTTP 基本概念

HTTP 是什么

HTTP 是超文本传输协议,也就是 HyperText Transfer Protocol。

什么是超文本传输协议

超文本传输协议可以拆成三个部分:

  • 超文本
  • 传输
  • 协议

1. 协议
协议的概念是:必须有两个以上的参与者,同时对参与者的一种行为约定和规范

针对 HTTP 协议,可以这么理解:
HTTP 是一个用在计算机世界里的协议。它使计算机能够理解的语言确立了一种计算机之间交流通信的规范(两个以上的参与者),以及相关的各种控制和错误处理方式(行为约定和规范)。

2. 传输
HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。

3. 超文本
超文本就是超越了普通的文本,它是文字、图片、视频等的混合体,最关键有超链接,能从一个超文本跳转到另外一个超文本。

对于超文本传输协议,下面这个解释更为准确:

HTTP 是一个在计算机世界里专⻔在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。

HTTP 常见的状态码


1xx

1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。

2xx

2xx 类状态码表示服务器成功处理了客户端的请求。

  • 「200 OK」是最常⻅的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。
  • 「204 No Content」也是常⻅的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
  • 「206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而 是其中的一部分,也是服务器处理成功的状态。

3xx

3xx 类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。

  • 「301 Moved Permanently」表示永久􏰂定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
  • 「302 Found」表示临时􏰂定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
  • 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存􏰂定向,用于缓存控制。

4xx

4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。

  • 「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
  • 「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
  • 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

5xx

5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。

  • 「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,只知道服务器发生了错误,但是具体发生了什么错误,并不清楚。
  • 「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
  • 「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,WebService 发生了错误。
  • 「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试试”的意思。

常见的首部字段

首部字段 含义 示例值
Host 字段 服务器的域名 www.baidu.com
Content-Length 服务器回应的数据⻓度(字节) 1357
Connection 客户端要求服务器使用 TCP 持久连接 keep-alive
Content-Type 服务器响应时,告诉客户端本次数据是什么格式以及编码 text/html; charset=utf-8
Content-Encoding 服务器返回的数据使用了什么压缩格式 gzip

HTTP 的工作原理

HTTP 的特性

这里讨论的 HTTP,指的是 HTTP(1.1)。

HTTP 最凸出的优点是「简单、灵活和易于扩展、应用广泛和跨平台」。

1. 简单
HTTP 基本的报文格式就是 header + body ,头部信息也是 key-value 简单文本的形式,易于理解,降低了学 习和使用的⻔槛。

2. 灵活和易于扩展
HTTP协议里的各类请求方法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发人员自定义和扩充。

3. 应用广泛和跨平台
互联网发展至今,HTTP 的应用非常广泛,从台式机的浏览器到手机上的各种 APP,HTTP 的应用遍地开花,同时天然具有跨平台的优越性。

HTTP 的优缺点

HTTP 协议里有优缺点一体的双刃剑,分别是「无状态、明文传输」,同时还有一大缺点「不安全」。

1. 无状态

无状态的好处,因为服务器不会去记忆 HTTP 的状态,所以不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务。

无状态的坏处也很明显,服务器没有“记忆能力”,没法知道用户的身份。

2. 明文传输

明文意味着在传输过程中的信息,是可方便阅读的,通过浏览器的 F12 控制台或 Wireshark 抓包都可以直接肉眼查看,为我们调试工作带了极大的便利性。

但是这正是这样,HTTP 的所有信息都暴露在了光天化日下,相当于信息裸奔。在传输的漫⻓的过程中,信息的内 容都毫无隐私可言,很容易就能被窃取。

3. 不安全

HTTP 比较严重的缺点就是不安全:

  1. 通信使用明文(不加密),内容可能会被窃听
  2. 不验证通信双方身份,因此可能遭遇伪装
  3. 无法证明报文的完整性,所以可能已遭篡改

HTTP 的安全问题,可以用 HTTPS 的方式解决,也就是通过引入 SSL/TLS 层,使得在安全上达到了极致。

HTTP 的性能

HTTP 协议是基于 TCP/IP,并且使用了「请求 - 应答」的通信模式,所以性能的关键就在这两点里。

1. 长连接

早期 HTTP/1.0 性能上的一个很大的问题,那就是每发起一个请求,都要新建一次 TCP 连接(三次握手),而且是串行请求,做了无谓的 TCP 连接建立和断开,增加了通信开销。

为了解决上述 TCP 连接问题,HTTP/1.1 提出了⻓连接的通信方式,也叫持久连接。这种方式的好处在于减少了 TCP 连接的􏰂复建立和断开所造成的额外开销,减轻了服务器端的负载。

持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。

2. 管道网络传输

HTTP/1.1 采用了⻓连接的方式,这使得管道(pipeline)网络传输成为了可能。

即可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第 二个请求出去,可以减少整体的响应时间。

举例来说,客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送 A 请求,然后等待服务器做 出回应,收到后再发出 B 请求。管道机制则是允许浏览器同时发出 A 请求和 B 请求。

但是服务器还是按照顺序,先回应 A 请求,完成后再回应 B 请求。要是前面的回应特别慢,后面就会有许多请求 排队等着。这称为「队头堵塞」。

3. 对头阻塞

「请求 - 应答」的模式加剧了 HTTP 的性能问题。

因为当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞了,会导致客户端一直请求不到数据,这也就是「队头阻塞」。好比上班的路上塞⻋。

HTTP 与 HTTPS

HTTP 与 HTTPS 的区别

  1. HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决了 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
  2. HTTP 连接建立相对简单, TCP 三次握手之后便可以进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需要建立 SSL/TLS 的握手过程,才能进行加密报文传输。
  3. HTTP 的端口号是 80,HTTPS 的端口号是 443。
  4. HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

HTTPS 解决了哪些问题

HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议,可以很好的解决了上述的⻛险:

  • 信息加密:通信内容进行加密。混合加密的方式实现信息的加密传输,解决了窃听的风险
  • 校验机制:无法篡改通信内容。摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了 篡改的⻛险。
  • 身份证书:将服务器公钥放入到数字证书中,解决了冒充的⻛险。

1. 混合加密

混合加密的方式实现信息的加密传输,解决了窃听的风险。

HTTP 采用的是对称加密非对称加密结合的『混合加密』方式:

  • 在通信建立前,采用非对称加密的方式交换『会话密钥』,后续通信就不使用非对称加密了
  • 在通信过程中,全部使用对称加密的『会话密钥』的方式加密明文数据。

之所以这么做的原因是因为:

  • 对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。
  • 非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但速度慢。

2. 摘要算法
摘要算法用来实现完整性,能够为数据生成独一无二的「指纹」,用于校验数据的完整性,解决了篡改的⻛险。

客户端在发送明文之前会通过摘要算法算出明文的「指纹」,发送的时候把「指纹 + 明文」一同加密成密文后,发 送给服务器,服务器解密后,用相同的摘要算法算出发送过来的明文,通过比较客户端携带的「指纹」和当前算出 的「指纹」做比较,若「指纹」相同,说明数据是完整的。

3. 数字证书
客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

这就存在一些问题,如何保证公钥不被篡改和信任度?

所以这里就需要借助第三方权威机构 CA (数字证书认证机构),将服务器公钥放在数字证书(由数字证书认证 机构颁发)中,只要证书是可信的,公钥就是可信的

通过数字证书的方式保证服务器公钥的身份,解决冒充的⻛险。

评论