深入分析HTTP、HTTPS协议

HTTP

  • 含义:超文本传输协议,作用于应用层。
  • 使用端口:80。
  • 基于的运输层协议:TCP。
  • HTTP发起网络请求使用到的方法:GET、POST。这两个方法的区别如下:
  1. GET 方法进行数据传输是不安全的,因为传输的参数都会放在URL中导致数据暴露;而使用POST方法进行数据传输是安全的,因为POST中的所有操作对用户来说都是不可见的。
  2. GET方法传输的URL参数长度有限制;而POST没有限制。
  3. GET方法只能传输ASCII类型的参数;而POST没有限制。
  4. GET方法只能使用URL编码方式;而POST可以使用多种编码方式。
  5. GET请求可以被浏览器主动cache;而POST不可以,需要手动设置。
  6. GET参数放在URL中,POST参数放在Request Body中。
  7. GET方法传输的效率较高;使用POST方法传输的效率较低。

前6个区别比较好看懂,但第7个区别可能让人不太理解。

为什么GET效率更高呢?

因为GET只产生一个TCP数据包,而POST产生两个TCP数据包。详细地说,GET请求发送时,浏览器会把头信息和数据一并发送,服务器响应200(成功返回数据)。而POST请求发送时,浏览器会先发送头信息,然后服务器响应100(表示请求已收到),接着浏览器会继续发送数据,服务器最终响应200(成功返回数据)。因为GET少了一步,时间消耗少了一些,效率更高。

HTTP请求报文的数据结构

GET /index.jsp HTTP/1.1
Accept-Language: zh-cn
Connection: Keep-Alive 
Host: www.jxsd.cn
Content-Length: 28 

userName=tom&password=123456
复制代码

如上所示,HTTP请求报文的数据结构分为请求行、请求头部、空白行、请求数据。

请求行:

  • 请求方法字段:GET、POST等。
  • URL字段:要访问的相对,如/index.jsp。
  • HTTP版本号字段:HTTP/1.1或HTTP/1.0。

请求头部:

  • Accept-Language:浏览器可接受的语言类型,如zh-cn表示简体中文,zh表示中文。
  • Connection:处理完这次请求是继续保持连接还是断开连接。
  • Host:客户机通过这个头信息告诉服务端,自己想要访问的主机的域名。
  • Content-Length:表示请求消息正文的长度。
  • User-Agent:浏览器类型。
  • Accept-Charset:浏览器可接受的字符集,如UTF-8,它表示Unicode字符编码。
  • Accept-Encoding:浏览器可进行解码的编码方式,如gzip。
  • 注意点:大多数请求头信息并不是必需的,但对于POST方法Content-Length必须使用,对于HTTP/1.1来说Host必须存在。

空白行:

  • 通过一个空行,将请求头和请求数据隔开,向服务器表示请求头到此为止。

请求数据:

  • 若请求的方法是GET,则此项为空,没有数据。
  • 若请求的方法是POST,则此项放置要提交的数据。

HTTP响应报文的数据结构

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
复制代码

如上所示,HTTP响应报文的数据结构包含响应行、响应头和响应体。

响应行:

  • HTTP版本号
  • HTTP状态码
  • 状态码的描述
  • HTTP常见的状态码如下:

响应头:

扫描二维码关注公众号,回复: 15193566 查看本文章

响应头用于描述服务器的基本信息,以及数据的描述,服务器通过对这些数据的描述来通知客户端如何对数据进行操作。

  • Date:世界的标准时,
  • Content-Type:后面的文档属于哪种MIME类型,如“text/html”。
  • Content-Length:内容长度。
  • Allow:服务器支持的请求方法(如GET、POST等)
  • Content-Encoding:文档的编码方法。
  • Location:和状态码302连用,用于重定向接收者到一个新的url。表示浏览器应到哪接收文档。
  • Expires:告诉浏览器把返回的数据缓存多长时间,0或-1表示不缓存。
  • Last-Modified:文档最后一次修改的时间。
  • Refresh:告诉浏览器刷新的时间,以秒计。
  • Sever:告诉浏览器服务器的类型。

响应体:

响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码。

HTTP建立、断开连接的过程

  1. TCP通过三次握手建立连接。
  2. 浏览器向服务器发送请求报文和请求数据。
  3. 服务器向浏览器发送响应报文和响应数据。
  4. TCP通过四次挥手断开连接。

示意图如下:

HTTP是否每次请求都要进行三次握手?

  • 如果是HTTP/0.9或HTTP/1.0,HTTP每次请求都要进行三次握手。
  • 而目前使用的HTTP/1.1协议,是不用的。它支持keep-alive参数,使客户端和服务器之间保持持久连接,客户端会定时发送一个心跳包给服务端表示客户端依旧活跃。

keep-alive作用

  • 检查死节点。主要是为了连接快速失败的情况被发现,然后重新进行连接。
  • 防止连接因不活跃而被断开连接。操作系统会为了节省资源释放掉不活跃的进程,而通过keep-alive不断定时发送心跳包,就是为了告诉操作系统我是活跃的,不要杀我。

HTTP的特点

  • 无连接:每次连接只会处理一个请求,处理结束后,断开连接。
  • 无状态:客户端的每次请求都是独立的。服务端不会保存客户端的状态。即客户端第二次向服务端发起请求时,服务端仍然像第一次请求时那样进行相同的响应。

有人会问,http/1.1是持久连接,然后又说http的特点之一是无连接,这是否矛盾?

  • 不矛盾。
  • http/1.1是持久连接,是指传输http数据的TCP连接不会断开,下一次传输http数据时,仍然会在这条TCP连接中进行。
  • 而http特点是无连接的,这里的无连接是指tcp建立连接之后的客户端和服务端之间的连接,即上文HTTP连接流程图中的第4、5步,一次请求并得到响应之后,便断开连接。

有人还会问,http的特点之一是无状态的,但假如服务端想要标识客户端来做特定的操作,这是否可以实现?

  • 能够实现。
  • 可以使用cookie对用户请求进行标识。通过cookie属性,当浏览器第二次向服务端发起请求时,服务端便能“认出”请求者。
  • cookie的实现是这样的:服务端会给使用浏览器的用户生成唯一标识码,这一标识码会通过响应报文的Set-cookie返回给用户。浏览器的cookie文件会对标识码进行存储,下一次用户发起请求时报文就会携带这一个值。

HTTP/1.0和HTTP/1.1的区别

  • HTTP/1.0对于每个连接只能进行一次请求和响应,没有Host字段。
  • HTTP/1.1对于每个连接可以进行多次请求和响应,必须有Host字段。

HTTP1.1的两种工作方式

  • 非流水线:浏览器在收到前一个响应之后,才会发送下一个请求。
  • 流水线:浏览器在发送第一次请求之后,不需要收到响应,就可以发送第二次请求。

HTTPS

它和HTTP的区别:

SSL层协议:SSL,即安全套接字层,它是一种安全协议,用于在传输层对网络连接进行加密。

https流程

一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步。

  1. 客户端向服务器发起HTTPS请求,连接到服务器的443端口。
  2. 服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。
  3. 服务器将自己的公钥发送给客户端。
  4. 客户端收到服务器端的公钥之后,会对公钥进行检查,验证其合法性,如果发现公钥有问题,那么HTTPS传输就无法继续。这里验证服务器发送的数字证书的合法性。如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥。然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。
  5. 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
  6. 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
  7. 然后服务器将加密后的密文发送给客户端。
  8. 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。

客户端如何验证数字证书的合法性

  • 数字证书包含颁布证书的机构,客户端获取到机构名称后,会在浏览器的根证书中进行检索,如果没有找到这一个数字证书对应的机构,说明机构没有得到认证,该数字证书是不合法的。

对称加密和非对称加密的含义及区别

  • 非对称加密/非对称解密,加密和解密用的是不同的秘钥;对称加密/对称解密,加密与解密用的是同样的密钥。
  • 非对称加密比对称加密安全,因为对后者来说,密钥丢失,加密的数据也会被暴露。
  • 非对称加密计算方式更复杂,涉及大数乘、大数模等运算,速度慢;对称加密采用位运算,速度快。

HTTPS建立过程中的三个随机数

  1. 客户端首次发出请求,生成随机数。
  2. 服务端回应请求时产生随机数。
  3. 客户端再次产生随机数,该随机数会被服务端公钥进行非对称加密。

HTTPS三个随机数的作用

  • 对于客户端来说,当验证了服务端的公钥的合法性之后,生成第3个随机数,这时候客户端就拥有了3个随机数,根据这3个随机数,客户端会生成一个新的密钥(Session Secret)。
  • 对于服务端来说,利用私钥对公钥进行非对称解密后,会获得客户端的第3个随机数,也就是说服务端也拥有了这3个随机数,根据这3个随机数,服务端也生成了一个新的密钥(Session Secret)。
  • 客户端和服务端的新密钥是相同的。他们以后的数据传输都会利用这一个密钥(Session Secret)进行对称加密和对称解密。

更多技术文章可关注公众号度熊君。

猜你喜欢

转载自blog.csdn.net/qq_40796375/article/details/122662936