网络那些事【下】

1,738 阅读17分钟

承接上篇网络那些事【上】,本篇将着重讲解HTTP以及如何一步一步演变成为HTTPS,以及HTTPS为什么更安全,里面到底做了什么事情?

一、HTTP

1. 简介

HTTP协议(HyperText Transfer Protocol)-超文本传输协议,它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。HTTP是一种无状态协议,HTTP协议本身不会对发送过的请求或者相应的通信状态做持久化处理。这样做的目的是为了保持HTTP协议的简单性,快速处理大量的事物,从而提高了效率。

然而,在许多应用场景中,我们需要保持用户登录的状态,由于HTTP是无状态协议,所以必须引入一些技术来记录管理状态,例如Cookie。

什么是超文本(HyperText)?包含有超链接(Link)和各种多媒体元素标记(Markup)的文本。这些超文本文件彼此链接,形成网状(Web),因此又被称为网页(Web Page)。这些链接使用URL表示。最常见的超文本格式是超文本标记语言HTML。

什么是URL? 

URL即统一资源定位符(Uniform Resource Locator),用来唯一标识万维网中的某一个文档。URL由协议、主机和端口(默认为80)以及文件名三部分构成。

2. 工作原理与过程

在用户点击URL为*********** 的链接后,浏览器和Web服务器执行如下的动作:

  • 地址解析:

    从中分析出协议名、主机名、端口、对象路径等部分,对于这个地址,解析得到如下:协议名:http域名:端口号:8080对象路径:/index.html

  • DNS将解析出的IP地址【假如是202.2.16.21】返回浏览器

  • 浏览器与服务器建立TCP连接【80端口】

    在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。这里是8080端口

  • 浏览器请求文档:GET/index.html

  • 服务器给出响应,将文档index.html发送给浏览器

  • 释放TCP连接

    一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-aliveTCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

  • 浏览器显示index.html的内容

3. HTTP请求

下面是表达HTTP请求所发送的数据格式

3.1 请求行

请求行由请求Method, URL 字段和HTTP Version三部分构成, 总的来说请求行就是定义了本次请求的请求方式, 请求的地址, 以及所遵循的HTTP协议版本例如:

GET /example.html HTTP/1.1 (CRLF)

拓展:HTTP请求协议方法:

3.2 消息报头

消息报头由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或者客户端自身的信息,主要包括:

3.3 请求正文

只有在发送POST请求时才会有请求正文,GET方法并没有请求正文。

4. HTTP响应

状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:

HTTP/1.1 200 OK (CRLF)

状态码(status-code)

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值: 1xx指示信息 - 表示请求已接收,继续处理 2xx成功 - 表示请求已被成功接收、理解、接受 3xx重定向 - 要完成请求必须进行更进一步的操作 4xx客户端错误 - 请求有语法错误或请求无法实现 * 5xx服务器端错误 - 服务器未能实现合法的请求

常见状态代码、状态描述、说明: 200OK - 客户端请求成功 400Bad Request - 客户端请求有语法错误,不能被服务器所理解 401Unauthorized - 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403Forbidden - 服务器收到请求,但是拒绝提供服务 404Not Found - 请求资源不存在,eg:输入了错误的URL 500Internal Server Error - 服务器发生不可预期的错误 * 503Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常

5. HTTP的特点

  1. 支持客户/服务器模式。
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GETHEADPOST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。后来通过Connection: Keep-Alive实现长连接
  5. 无状态HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

拓展:

在实际的应用中,客户端往往会发出一系列请求,接着服务器端对每个请求进行响应。对于这些请求|响应,如果每次都经过一个单独的TCP连接发送,称为非持久连接。反之,如果每次都经过相同的TCP连接进行发送,称为持久连接。
非持久连接在每次请求|响应之后都要断开连接,下次再建立新的TCP连接,这样就造成了大量的通信开销。例如前面提到的往返时间(RTT) 就是在建立TCP连接的过程中的代价。非持久连接给服务器带来了沉重的负担,每台服务器可能同时面对数以百计甚至更多的请求。持久连接就是为了解决这些问题,其特点是一直保持TCP连接状态,直到遇到明确的中断要求之后再中断连接。持久连接减少了通信开销,节省了通信量。

6.不足

  • 通信使用明文(不加密),内容可能会被窃听

  • 不验证通信方的身份,因此有可能遭遇伪装

  • 无法证明报文的完整性,所以有可能已遭篡改

二、HTTPS

上面已经知道HTTP在通信过程中是 不安全的,下面将介绍HTTPS的概念,发展以及细节。

2.1 前提知识

2.1.1 对称加密

有流式、分组两种,加密和解密都是使用的同一个密钥。

例如:DES、AES-GCM、ChaCha20-Poly1305等

2.1.2 非对称加密

加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。

例如:RSA、DSA、ECDSA、 DH、ECDHE

2.1.3 哈希算法

将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。

例如:MD5、SHA-1、SHA-2、SHA-256 等

2.1.4 密钥对

在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。

2.1.5 公钥

如下:

公钥用来给数据加密,用公钥加密的数据只能使用私钥解密。

2.1.6 私钥

如下

用来解密公钥加密的数据

2.1.7 摘要

对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得。

2.1.8 签名

使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名。

2.1.9 签名验证

数据接收端,拿到传输文本,但是需要确认该文本是否就是发送发出的内容,中途是否曾经被篡改。因此拿自己持有的公钥对签名进行解密(密钥对中的一种密钥加密的数据必定能使用另一种密钥解密。),得到了文本的摘要,然后使用与发送方同样的HASH算法计算摘要值,再与解密得到的摘要做对比,发现二者完全一致,则说明文本没有被篡改过。

2.2 概念

HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。

HTTP 协议中没有加密机制,但可以通 过和 SSL(Secure Socket Layer, 安全套接层 )或 TLS(Transport Layer Security, 安全层传输协议)的组合使用,加密 HTTP 的通信内容。属于通信加密,即在整个通信线路中加密。

可以表示为:

HTTP + 加密 + 认证 + 完整性保护 = HTTPS(HTTP Secure )

下面是HTTP与HTTPS比较:

如上图所示 HTTPS 相比 HTTP 多了一层 SSL/TLS

SSL(Secure Socket Layer,安全套接字层):1994年为 Netscape 所研发,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。

TLS(Transport Layer Security,传输层安全):其前身是 SSL,它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,1999年从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到。TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2。

上面仅仅是概念,下面将讲述如何演变的?

2.3 HTTP-> HTTPS

2.3.1 HTTP最开始通信

HTTP的客户端<---->服务器交互时,不会有任何的防护措施,这样就可能被黑客或者其他方式拦截。如下:

从上面再次看出HTTP传输面临的风险有:

  1.  窃听风险:黑客可以获知通信内容。

  2.  篡改风险:黑客可以修改通信内容。

  3.  冒充风险:黑客可以冒充他人身份参与通信。

2.3.2  对传输的信息加密

【即使黑客截获,也无法破解】

如上图所示:此种方式属于对称加密,双方拥有相同的密钥信息得到了安全传输,但这种方式的缺点:

  1. 不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高

  2. 因每个客户端、服务器的安全级别不同,密钥极易泄露

2.3.3 上面维护密钥麻烦,可以尝试使用非对称加密

如上图所示,客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然,但上述过程也存在缺点:

公钥是公开的(也就是黑客也会有公钥),所以私钥加密的信息,如果被黑客截获,其可以使用公钥进行解密,获取其中的内容

2.3.4 对称加密和非对称加密结合

**使用非对称加密传输一个对称密钥K,让服务器和客户端都得知。然后两边都使用这个对称密钥K来加密解密收发数据。因为传输密钥K是用非对称加密方式,很难破解比较安全。而具体传输数据则是用对称加密方式,加快传输速度。两全其美。
**

  1. 这是对称加密的算法和对称密钥)这段话用公钥进行加密,然后传给服务器

  2. 服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,服务器说:(好的)对称密钥加密

  3. 后续两者之间信息的传输就可以使用对称加密的方式了

2.3.5 获取公钥与确认服务器身份

  1. 客户端如何获得公钥

  2. 如何确认服务器是真实的而不是黑客

回答1 :

(1)提供一个下载公钥的地址,回话前让客户端去下载。(缺点:下载地址有可能是假的;客户端每次在回话前都先去下载公钥也很麻烦)
(2)回话开始时,服务器把公钥发给客户端(缺点:黑客冒充服务器,发送给客户端假的公钥)

回答2:

那有木有一种方式既可以安全的获取公钥,又能防止黑客冒充呢? 那就需要用到终极武器了:SSL 证书

服务器发送了一个SSL证书给客户端,SSL 证书中包含的具体内容有:

(1)证书的发布机构CA

(2)证书的有效期

(3)公钥

(4)证书所有者

(5)签名

客户端在接受到服务端发来的SSL证书时,会对证书的真伪进行校验,以浏览器为例说明如下:

(1)首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验

(2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发

(3)如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。

(4)如果找到,那么浏览器就会从操作系统中取出 颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密

(5)浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比

(6)对比结果一致,则证明服务器发来的证书合法,没有被冒充

(7)此时浏览器就可以读取证书中的公钥,用于后续加密了

2.4 HTTP工作流程

  • 在使用HTTPS首先是需要保证服务端配置了正确对应的安全证书

  • 客户端发送请求到服务器端

  • 服务端返回公钥和证书等到客户端

  • 客户端接受后,首先会验证证书的安全性和一致性,如果通过则会随机生成一个随机数,用公钥将其解密, 发送给服务端

  • 服务端接受到加密后的随机数后,会用私钥对其进行解密,从而得到真正的随机数,然后利用调用这个随机数当作私钥对需要发送的数据进行对称加密。

  • 客户端接收到加密后的数据然后使用私钥(之前生成的随机值)对数据进行解密,最后解析数据呈现给客户端

2.5 总结

通过上面的流程图可看出:发送SSL证书的形式,既解决了公钥获取问题,又解决了黑客冒充问题,一箭双雕,HTTPS加密过程也就此形成。所以相比HTTP,HTTPS 传输更加安全。

优点:

  1. 所有信息都是加密传播,黑客无法窃听。

  2. 具有校验机制,一旦被篡改,通信双方会立刻发现。

  3. 配备身份证书,防止身份被冒充。

缺点:

  1. CA机构颁发的证书都是需要年费的【要花钱撒--不好不好哈哈哈哈】

  2. https加重了服务端的负担,降低了用户的访问速度

可能很多人还不理解CA机构,服务端Server和客户端Client的到底是如何工作的?本人花了2h左右给大家整理出来了一个图和文字【字有点丑,哈哈哈,字如其人哈】

3. 拓展知识【问题】

3.1 HTTPS的四次握手协议【SSL的四次握手】

  1. 客户端请求建立SSL链接,并向服务端发送一个随机数–Client random和客户端支持的加密方法,比如RSA公钥加密,此时是明文传输。

  2.  服务端回复一种客户端支持的加密方法、一个随机数–Server random、授信的服务器证书和非对称加密的公钥。 

  3. 客户端收到服务端的回复后利用服务端的公钥,加上新的随机数–Premaster secret 通过服务端下发的公钥及加密方法进行加密,发送给服务器

  4.  服务端收到客户端的回复,利用已知的加解密方式进行解密,同时利用Client random、Server random和Premaster secret通过一定的算法生成HTTP链接数据传输的对称加密key – session key。

3.2 Charles如何实现HTTPS的拦截?

Charles要实现对https的拦截,需要在客户端安装Charles的证书并信任它,然后Charles扮演中间人,在客户端面前充当服务器,在服务器面前充当客户端。

3.3 HTTP协议中GET和POST的区别

  1. GET在浏览器回退时是无害的,而POST会再次提交请求。 

  2. GET产生的URL地址可以被Bookmark,而POST不可以。 

  3. GET请求会被浏览器主动cache,而POST不会,除非手动设置。 

  4. GET请求只能进行url编码,而POST支持多种编码方式。

  5. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。 

  6. GET请求在URL中传送的参数是有长度限制的,而POST么有。对参数的数据类型,GET只接受ASCII字符,而POST没有限制。 

  7. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

  8. GET参数通过URL传递,POST放在Request body中。

  9. GET产生一个TCP数据包;POST产生两个TCP数据包。【对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)】

机会❤️❤️❤️🌹🌹🌹

如果想和我一起共建抖音,成为一名bytedancer,Come on。期待你的加入!!!

截屏2022-06-08 下午6.09.11.png

总结

上面大致讲完了HTTP的基本内容,以及HTTPS如何演变过来的,最后面讲解了一下Interview 经常问到的,希望对大家有所帮助!!!今天是中秋国庆小家国家团圆之夜,祝愿大家阖家欢乐!!!