这是一个关于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包。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~

怎么会有鱼儿如此完美的男人, 抓包刷刷解决问题,羡慕鱼嫂。
1
1
1
1
1
1
1