为什么会有这篇文章
在 plantegg 大佬的知识星球里看到了 应用断开连接的时候如何让 OS 走 RST 流程?提问,想着写前一篇balancer刚好看到了 kubernetes 关于 tcp 探测的优化,所以顺便实验下巩固下,顺便推荐下 plantegg 大佬的星球性能优化的干货很多。
SO_LINGER 参数说明
https://man7.org/linux/man-pages/man7/socket.7.html
这里说明的很详细了,如果设置了 linger
的 l_onoff
为 1,在设置 l_linger
单位秒,在调用close或者shutdown的时候,在 l_linger 规定的时间内 发送/接收 完数据,或者达到了 l_linger
规定的时间,会直接发送 rst 结束请求,所以这个l_linger
大小的设置需要谨慎,不然会出现数据还没发送或者接收完就关闭链接了,不过一般场景不会直接这么用rst请求。
实验
- 本地随便启动个 8080 端口的服务
- 运行如下程序 https://github.com/OnlyPiglet/blog_code_pratice/blob/main/network/direct_rst_connect.go
效果展示
可以看到第一次在ack完之后调用close直接 rst 掉了链接,第二次调用close是正常的4次挥手流程。
使用场景
在k8s中存在一个tcp探针偶发失败的问题,原因就是由于k8s管理的pod数量过多时,短时间内会进行大量的tcp探测,如果走默认的timewait默认60s关闭,会导致单台kubelet 机器上的 很多资源比如 socket, ephemeral port, conntrack entry 等等会被占用 ,导致后续探测失败,具体的issue可以参考
https://github.com/kubernetes/kubernetes/pull/115143
如果你看不到评论,那么就真的看不到评论w(゜Д゜)w