TCP三次握手四次挥手

Catalogue
  1. 1. time_wait
  2. 2. 绕过三次握手
  3. 3. 参考资料

time_wait

指的是在四次挥手的最后一步中,主动关闭的一方,回复完ack后,所处于的状态,它有两个作用:

  1. 等待重传ack,因为可能会存在丢包
  2. 避免链接中还有在途中的数据包,当另一个新链接重用这个端口建立后,接受到之前的数据包,污染数据

这个状态会持续,两个msl,一个msl是2分钟,msl指的是最大段生存周期,即当新链接收到之前链接的数据包时,因为超过它的生存时间,也会丢弃。

绕过三次握手

在 Linux 3.7 内核版本之后,提供了 TCP Fast Open 功能,这个功能可以减少 TCP 连接建立的时延。

三次握手建立连接造成的后果就是,HTTP 请求必须在一个 RTT(从客户端到服务器一个往返的时间)后才能发送。

通过cookie实现,默认情况下是,当半连接队列满时,为了能继续建立连接,会采用cookie方式,分首次建立链接和非首次

  • 首次链接时:

    • 客户端发送syn + 请求cookie
    • 服务端收到后生成cookie, 响应ack + cookie
    • 客户端存储cookie, 传输数据
  • 非首次:

    • 客户端发送syn + cookie值 + 请求方法
    • 服务端校验cookie, 响应ack + sync, 再响应数据
    • 客户端接收数据,再回复ack

参考资料