关于http的三次握手 和四次挥手
握手是双方连接所经历的步骤
挥手是双方取消连接所经历的步骤
客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西;
由于TCP不存在连接的概念,只存在请求和响应,请求和响应都是数据包,
它们之间都是经过由TCP创建的一个从客户端发起,服务器接收的类似连接的通道,这个连接可以一直保持,
http请求是在这个连接的基础上发送的;
在一个TCP连接上是可以发送多个http请求的,不同的版本这个模式不一样。
在HTTP/1.0中这个TCP连接是在http请求创建的时候同步创建的,http请求发送到服务器端,服务器端响应了之后,这个TCP连接就关闭了;
HTTP/1.1中可以以某种方式声明这个连接一直保持,一个请求传输完之后,另一个请求可以接着传输。
这样的好处是:在创建一个TCP连接的过程中需要“三次握手”的消耗,“三次握手”代表有三次网络传输。
如果TCP连接保持,第二个请求发送就没有这“三次握手”的消耗。HTTP/2中同一个TCP连接里还可以并发地传输http请求。
标识位说明
ACK 确认序号有效
SYN 发起一次链接
FIN 释放一个链接
Seq(sequence number)Seq序号,发送方对序号进行标记
Ack(acknowledgement number)Ack序号,接收方对序号进行确认,Ack = 发送方的数据序号Seq + 1
MSL (Maximum Segment Lifetime)一段TCP报文在传输过程中的最大生命周期
2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长
以客户端主动发起连接请求和发起解除连接请求为例
三次握手:
客户端发起请求 [SYN] Seq = 0
然后进入SYN-SENT状态
我要跟你通信,数据序号是0
服务端 接收消息 然后确认消息 [ACK SYN] Ack = 1 Seq = 0
然后从LISTEN进入SYN-RCVD状态
我接收到你的消息了,我也要跟你通信 确认你数据序号 我的数据序号是0
客户端接收到消息 然后确认消息 [ACK] Ack = 1 Seq = 1
然后进入ESTAB-LISHED状态
我也收到了你的消息了 确认你的数据序号 这次数据序号是0
服务端收到消息
进入ESTAB-LISHED状态
双端开始通信
四次挥手:
客户端发起解除请求 [FIN] Seq = 0
然后进入FIN-WAIT-1状态
我要解除这次TCP连接 数据序号是0
服务端收到消息 先对消息进行确认 [ACK] Ack = 1 Seq = 0
然后进入CLOSE-WAIT状态
我收到你的解除请求 确认数据序号
服务端向应用程序发送通知客户端要关闭连接,处理完成关闭操作之后
向客户端发送消息 [ACK FIN] Ack = 1 Seq = 1
然后进入LAST-ACK状态
我收到你的解除请求了 并且我也可以关闭通信了 确认你的数据序号 我的数据序号是1
客户端收到消息 [ACK] Ack = 2 Seq = 1
然后进入TIME-WAIT状态等待2MSL
我收到你的解除请求了 确认你的数据序号
服务端收到ACK消息之后直接进入CLOSE状态
如果在1MSL之内没有收到客户端的ACK消息,那么重新发送一次FIN消息
等待2MSL之后,如果没有收到服务端的FIN消息,那么就进入CLOSE状态,如果收到FIN消息,那么重新发送ACK消息
https原理 就是 http + TSL/SSL
① 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器 ;
② 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;
该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数 ;
③ 客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;
然后,再产生一个称作 pre_master_secret 的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加 / 解密),并将加密后的信息发送给服务器 ;
④ 客户端与服务器端根据 pre_master_secret 以及客户端与服务器的随机数值独立计算出加密和 MAC密钥(参考 DH密钥交换算法);
⑤ 客户端将所有握手消息的 MAC 值发送给服务器 ;
⑥ 服务器将所有握手消息的 MAC 值发送给客户端 。