Appearance
TCP三次握手四次挥手
三次握手
- 第一步:客户端发送
SYN
报文到服务端发起握手 - 第二步:服务端收到
SYN
报文之后回复SYN
和ACK
报文给客户端 - 第三步:客户端收到
SYN
和ACK
,向服务端发送一个ACK
报文
TCP 快速打开(TFO)
TFO
就是为了减少三次握手带来的延时,
- 在
TFO
的流程中,首轮三次握手服务端会计算得到一个TFO cookie
,放到TCP
报文的Fast Open
里面 - 客户端拿到这个
cookie
后缓存下来,并完成正常的三次握手; - 下一次的三次握手,客户端就会将之前的
cookie
和HTTP请求
、SYN
发给服务端 - 服务端验证
cookie
是否合法,如果合法就正常返回SYN+ACK
;并且返回HTTP响应
; - 最后完成三次握手的剩余流程;
三次握手的意义
客户端和服务端都需要直到各自可收发,因此需要三次握手
- 第一次握手成功让服务端知道了客户端具有发送能力
- 第二次握手成功让客户端知道了服务端具有接收和发送能力,但此时服务端并不知道客户端是否接收到了自己发送的消息(如果服务端这时立刻给客户端发送数据,这个时候客户端可能还没有准备好接收数据)
- 第三次握手让服务端知道了客户端做好了接收自己发送的消息的准备
为什么 TCP 建立连接需要三次握手,而不是两次
- 因为这是为了防止出现失效的连接请求报文段被服务端接收的情况,从而产生错误。
三次握手过程中可以携带数据吗
第一次
、第二次
握手不可以携带数据,因为一握二握
时还没有建立连接,会让服务器容易受到攻击(只需要在第一次握手的报文里放大量数据,服务器就会消耗更大的时间和内存空间去处理数据)- 而第三次握手,此时客户端已经处于
(已建立连接状态)
,对于客户端来说,已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也是没问题的。
四次挥手
为什么要四次挥手 & 四次挥手流程
因为TCP
是全双工通信,不能单方面完全断开连接
- 第一次挥手,客户端发送
FIN
给服务端 - 第二次挥手,服务端回复
ACK
给客户端,服务端还可以继续向客户端发送数据(若数据没有发送完) - 第三次挥手,服务端发送
FIN
给客户端 - 第四次挥手,客户端回复
ACK
给服务端,客户端经过2MSL
的时间后断开,服务端接收到了客户端发出的ACK
后立刻断开了到客户端的连接
至此TCP
连接才完全断开。
四次挥手结束等待 2MSL 的意义
- 虽然按道理,四个报文都发送完毕,就可以立即断开,但是我们必须假设网络是不可靠的,有可以最后一个
ACK
丢失。 - 如果最后一个
ACK
丢失了,那么服务端没有收到ACK
就会发起重传;再次发送FIN
给客户端; - 客户端收到重传的
FIN
后,会重发ACK
并重新等待2MSL
的时间来确保服务端收到了自己的ACK
;
总结:
- 1 个
MSL
确保第四次挥手
中主动关闭方
最后的ACK
报文最终能达到对端 - 1 个
MSL
确保对端没有收到ACK
重传的FIN
报文可以到达