Catalogue
time_wait
指的是在四次挥手的最后一步中,主动关闭的一方,回复完ack后,所处于的状态,它有两个作用:
- 等待重传ack,因为可能会存在丢包
- 避免链接中还有在途中的数据包,当另一个新链接重用这个端口建立后,接受到之前的数据包,污染数据
这个状态会持续,两个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