目录
1. http
http超文本传输协议,是一种应用层协议。
特点
- 无状态:客户端访问完一次服务器再次访问的时候,服务器是无法知道这个客户端之前是否已经访问过了(所以有了Cookie和Session)。
- http 1.1 持久连接keepalive:服务器在响应后不关闭TCP连接,仍然在一段时间内保持这条连接,客户端可以通过这个连接继续请求。
- 简单快速(请求方法简单Get和POST)
- 灵活(数据对象随意)
存在的问题
- 耗时:传输数据每次都要建立连接
- 不安全:明文传输
- Header大:一般客户端的请求header变化较小,但是每次都要携带
- keepalive压力大:会给服务器造成大量的性能压力
http报文格式
报文:传输单元,即一次性发送的数据块。由一行一行组成的,纯文本,而且是明文
请求报文:
- 请求行:包括请求方法(如GET、POST等)、请求的URL、HTTP协议版本,这三者之间用空格分隔,并以CRLF(回车换行)结尾。
- 请求头部:由多个字段组成,每个字段都有“字段名: 字段值”,字段之间以CRLF分隔。请求头部用于告知服务器请求的更多信息。
- 请求主体(可选):这部分携带了本次请求需要发往服务端的信息,比如POST请求通常会包含请求主体。
响应报文:
- 状态行:包括HTTP协议版本、状态码、状态描述,来标识请求的处理结果,如200表示成功,404表示未找到资源等。
- 响应头部:由多个字段组成,每个字段都有“字段名: 字段值”,
- 响应主体(可选):通常包含服务器返回给客户端的数据。
常见状态码:
- 1xx:服务器已接收,但客户端可能仍要继续发送
- 2xx:成功
- 3xx:重定向
- 4xx:请求非法,或者请求不可达
- 5xx:服务器内部错误
request header常见字段
- Host:目标服务器的域名或IP
- User-Agent:发送请求的用户代理。通常是浏览器的标识,通过这个字段,服务器可以了解客户端的类型和版本
- Accept:客户端可以接受的内容类型。如html、json、xml
- Content-Type:请求体类型。如text/html、json
- Authorization:身份验证凭据,用于认证
- Cookie:上一次响应中设置的服务器的Cookie,用于跟踪用户的会话状态
- Content-Length:确定要接收多少数据(对HTTP/1.0 和 HTTP/1.1,HTTP/2 使用帧来分割数据)
2. https
HTTP+SSL协议组合的一种加密传输协议。
SSL
-
非对称加密算法(如RSA):交换密钥
-
消息认证码(MAC)校验数据:在传输过程中,数据会被加上一个MAC值,这个值是通过一个哈希函数和共享的密钥计算得出的。接收方在收到数据后,会重新计算MAC值并与发送方提供的MAC值进行比较。
-
服务器申请CA证书:服务器向一个可信的证书颁发机构(CA)申请一个数字证书,包含了服务器的公钥和一些其他信息,并由CA使用其私钥进行签名。当客户端与服务器建立SSL连接时,服务器会将其数字证书发送给客户端。客户端会验证这个证书的有效性,包括检查证书是否由受信任的CA颁发、证书是否过期、证书中的域名是否与正在访问的域名匹配等。
-
使用证书中的公钥与服务器交换密钥
SSL握手过程
ssl握手共9个包,过程:
-
Client Hello:client->server, 消息包含ssl版本、加密算法
-
Server Hello:server->client,server选择一个ssl版本和加密算法发给client,并发给client CA证书
-
客户端验证证书:把数字证书和本地的根证书进行比对检查合法性,如果验证通过,就从证书中取出服务器的公钥
-
客户端生成预主密钥并加密:客户端生成一个预主密钥(Pre-Master Secret),使用之前从CA中提取出的公钥对预主密钥进行加密,将加密后的预主密钥发送给服务器
-
服务器解密预主密钥:服务器使用自己的私钥解密客户端发送的加密预主密钥,得到原始的预主密钥。
-
生成会话密钥:客户端和服务器都拥有了相同的预主密钥,使用预主密钥等信息,计算出会话密钥(Session Key),用于后续的加解密
-
交换完成通知:客户端和服务器都会发送一个Change Cipher Spec消息给对方,告知对方后续传输将使用会话密钥进行加密
-
加密数据传输:完成以上步骤后,客户端和服务器就可以使用会话密钥进行加密通信了
注意:
-
CA申请是握手之前就已经完成的
-
关于根证书和数字证书:
-
根证书:证书颁发机构(CA)自己颁发的自签名证书,包含公钥,用于验证其他证书的有效性
-
数字证书:服务端向CA机构请求颁发的证书,包含用户身份和公钥,用于身份验证
-
客户端的CA公钥与CA对服务器提供的公钥进行签名的私钥是一对
-
握手后的后续数据通信都使用会话密钥,是对称加密方式
为什么数据传输过程不用非对称加密?
ssl的
连接过程,使用非对称加密(如RSA)
进行密钥交换和身份验证,但在
数据传输
阶段,用的是
对称加密。
原因:
-
非对称加密效率低: 加解密速度慢
-
非对称加密只能实现单向的加解密:一对公私钥,公钥用于加密,私钥用于解密。即 服务端向客户端发公钥,自己保留私钥,客户端利用公钥加密预主密钥,把预主密钥发给服务端,服务端利用自己的私钥解密。
为什么ssl是安全的不会被第三方攻击?
-
非对称加密进行密钥交换和身份验证: 只有拥有私钥的服务端能够解密预主密钥,生成会话密钥。 第三方即使截获了传输的数据也无法解密,因为没有私钥。
-
数字证书验证:客户端通过验证证书的有效性来确认服务器的身份,防止黑客冒充服务器与客户端进行通信。
-
消息鉴别码(MAC)验证数据的完整性:通过Hash函数实现,可以确保数据在传输过程中没有被篡改
http与https对比
http
|
https
| |
安全性
|
无状态、明文传输,没有
加密处理
|
SSL
对网站与客户端之间传输的数据进行加密,保证数据安全性
|
响应速度
|
更快,
只需三次握手
|
除了要三次握手,还需要
SSL
握手,一共需要12
个包
|
资源消耗
|
消耗少
|
连接过程更长,加解密消耗多
|