Skip to content

TCP三次握手四次挥手

三次握手

  • 第一步:客户端发送SYN报文到服务端发起握手
  • 第二步:服务端收到SYN报文之后回复SYNACK报文给客户端
  • 第三步:客户端收到SYNACK,向服务端发送一个ACK报文

TCP 快速打开(TFO)

TFO 就是为了减少三次握手带来的延时,

  • TFO 的流程中,首轮三次握手服务端会计算得到一个 TFO cookie,放到 TCP 报文的 Fast Open里面
  • 客户端拿到这个 cookie 后缓存下来,并完成正常的三次握手;
  • 下一次的三次握手,客户端就会将之前的 cookieHTTP请求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 报文可以到达