- 第一次握手:客户端发送一个带 SYN=1,Seq=x 的数据包到服务器端口 第一次握手,由浏览器发起,告诉服务器我要发送请求了 SYN(synchronous):请求建立连接 seq(sequence):随机序列号 请注意TCP规定SYN被设置为1的报文段不能携带数据但要消耗掉一个序号。
- 第二次握手:服务器发回一个带 SYN=1, ACK=1, seq=y, ack= x 1 的响应包以示传达确认信息 第二次握手,由服务器发起,告诉客户端我准备接受了,你赶紧发送吧 ACK(acknowledgement):确认,是一个确定字符 ack:ack=上一次的seq 1,作用是接受上一次远端主机传来的seq,加一然后再传给客户端,提示客户端已经成功接收上一次所有数据 请注意这个报文段不能携带数据,因为它是SYN被设置为一的报文段但同样要消耗掉一个序号
- 第三次握手:客户端再回传一个带 ACK,seq = x 1, ack = y 1 的数据包,代表“握手结束” 第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧 确认报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下所发送的下一个数据报文段的序号仍是x 1
然后双方就正确建立连接,开始传输数据
SSL/TLS四次握手HTTPS 建立连接的过程,先进行 TCP 三次握手,再进行 TLS 四次握手(仅对https)
因为 HTTPS 都是基于 TCP 传输协议实现的,得先建立完可靠的 TCP 连接才能做 TLS 握手的事情。
第一次握手:客户端发出请求Client Hello- 首先,客户端先向服务器发出加密通信的请求,这被叫做clienthello请求。
- 在这一步,客户端主要向服务器提供以下信息:
- 支持的协议版本,比如TLS1.0版本
- 支持的加密方法,比如RSA公钥加密
- 一个客户端生成的随机数(client random), 稍后用于生成对话密钥(session key)
- 服务器收到客户端请求后,向客户端发出回应,这叫做serverhello
- 这一步服务器主要干三件事:
- 确认使用的加密通信协议版本,比如TLS1.00版本。如果游览器与服务器支持的版本不一致,服务器关闭加密通信
- 确认使用的加密方法(客户端所支持),比如RSA公钥加密
- 将服务器证书、非对称加密的公钥,以及一个随机数(Server random)发送给客户端游览器
客户端收到服务器回应以后,首先验证服务器证书,验证手段就是执行如下三种检查:
- 检查证书是否已过期;
- 检查证书中的域名与实际域名是否一致
- 检查证书是否是可信机构颁布的
如果,上述过程中有任何一个环节发现问题,那么浏览器就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串新的随机数(Premaster secret )。
第三次握手:客户端回应此时,浏览器会根据前三次握手中的三个随机数:
- Client random
- Server random
- Premaster secret
通过一定的算法来生成 “会话密钥” (Session Key),这个会话密钥就是接下来双方进行对称加密解密使用的密钥!
第四次握手:服务端回应服务端收到客户端的回复,利用已知的加密解密方式进行解密,服务器收到客户端的第三个随机数( Premaster secret) 之后,使用同样的算法计算出 “会话密钥” (Session Key)。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用 “会话密钥” 加密内容。(非对称加密解密将不再使用,接下来完全由对称加密接手了,因为密钥已经安全的传送给了通信的双方)
总结- 客户端请求建立SSL链接,并向服务发送一个随机数–Client random和客户端支持的加密方法,比如RSA公钥加密,此时是明文传输
- 服务端回复一种客户端支持的加密方法、一个随机数–Server random、授信的服务器证书和非对称加密的公钥
- 客户端收到服务端的回复后利用服务端的公钥,加上新的随机数–Premaster secret 通过服务端下发的公钥及加密方法进行加密,发送给服务器
- 服务端收到客户端的回复,利用已知的加解密方式进行解密,同时利用Client random、Server random和Premaster secret通过一定的算法生成HTTP链接数据传输的对称加密key – session key
连接建立成功之后,浏览器向服务器发送HTTP请求报文,来获取自己想要的数据
请求报文由请求行、请求头、空行、请求体四部分组成
- 请求行:有请求方法、请求的url、http协议及其版本
- 请求头:把浏览器的一些基础信息告诉服务器。比如包含了浏览器所使用的操作系统、浏览器内核等信息,以及当前请求的域名信息、浏览器端的 Cookie 信息等
- 空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头
- 请求体(报文主体/请求中文):当使用POST, PUT等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中。在请求包头中有一些与请求正文相关的信息,例如: 现在的Web应用通常采用Rest架构,请求的数据格式一般为json。这时就需要设置Content-Type: application/json。
服务器对http请求报文进行解析,并给客户端发送HTTP响应报文对其进行响应
HTTP响应报文也是由状态行、响应头、空行、响应体四部分组成