SYN握手期间的RST

这是一个关于TCP的小问题。

现象

客户端发现某些连接Redis失败,抓包后如下图:

  • 客户端发送SYN
  • 服务端1秒后回复SYN+ACK
  • 客户端返回RST

分析

客户端返回RST可能因为:

  • 应用层主动关闭socket时带了SO_LINGER参数,这会主动发送RST
  • 应用层已经关闭了socket,这时内核收到了对方数据包,这会导致内核回复RST

查看客户端连接超时配置正好为1秒,说明大概率是客户端先关闭了socket,此后收到对方SYN+ACK,内核直接回复RST。

将客户端连接超时调为2秒,RST问题消失,这样问题原因就明确了。

延伸

在SYN握手期间关闭socket,协议栈不会发FIN,这个由TCP状态机转移图可以看出:

处于SYN_SENT状态下close,那么立即就会结束这条连接,不会发FIN。

这也解释了上面客户端连接超时关闭socket后,为什么没有抓到FIN包。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~