【Discuss】FIN_WAIT2状态下到底能不能收数据包?

子桓
• 阅读 163

问题由来:错误的keepalived时间设置 服务端设置了http_keepalived 时间 1s,客户端时间大于server端,客户端反应某些请求没有响应,查看服务日志一些http请求根本没有收到,但是客户端确实记录发送了,只好抓包看在哪里丢弃了

服务端:python+flask+gunicorn 客户端:java

抓包分析:

server端conn到期之后调用了close,且client回应了ack,此时server进入fin_wait2阶段; 之后服务端在此连接上收到了新的http请求,抓包看server直接回应了RST给客户端,强制断开连接,理论上该状态是可以接受数据包的;

代码分析: 在kernel tcp_rcv_state_process func中找到了各个状态收报处理的流程,此时sock应该根本没有RCV_SHUTDOWN,收到fin ack是更新socket SEND_SHUTDOWN;

case TCP_FIN_WAIT2:
        /* RFC 793 says to queue data in these states,
         * RFC 1122 says we MUST send a reset.
         * BSD 4.4 also does reset.
         */
        if (sk->sk_shutdown & RCV_SHUTDOWN) {
            if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq &&
                after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt)) {
                NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA);
                tcp_reset(sk, skb);
                return 1;
            }
        }
        fallthrough;

所以这个RST是什么流程发出来的? 跟应用层有关吗? 又或者是容器的一些特性? 看了一些帖子和试验也有相关的记录,但是根本原因还是不大清楚,欢迎讨论指教!

点赞
收藏
评论区
推荐文章
双十一预售活动分析
2022年双十一促销活动已经开始,大家应该都提前开始关注今年双十一活动的时间表了吧?2022年10月24日晚8:00天猫双11预售时间,第一波销售时间10月31日晚8:0,第二波销售时间11月10日晚8:00;天猫双11的优惠力度是跨店每满30050
Stella981 Stella981
2年前
Loadrunner压测时,出现的问题汇总
【问题1】Error27728:Stepdownloadtimeout(120seconds)hasexpired错误分析:对于HTTP协议,默认的超时时间是120秒(可以在RuntimeSettings中修改),客户端发送一个请求到端还没有返回结果,则出现超时错误。解决办法:首先在运行环境中对超时进行设置,默认的超时时间可
Stella981 Stella981
2年前
AssemblyScript 入门指南[每日前端夜话0xEB]
每日前端夜话0xEB每日前端夜话,陪你聊前端。每天晚上18:00准时推送。正文共:2459 字预计阅读时间:10分钟作者:DannyGuo翻译:疯狂的技术宅来源:logrocket!(https://oscimg.oschina.net/oscnet/b880277c594152a503
Wesley13 Wesley13
2年前
TCP滑动窗口消息堆积
线上问题:客户端不能推送数据到服务端。排查:pingip或者telnetport全是正常的,不奏效。通过wireshark抓取报文查看,发现一个奇怪现象是窗口不固定,但是整体趋势是逐渐减小,直到为0.服务端报文如下:至
Wesley13 Wesley13
2年前
Linux服务器下的HTTP抓包分析
说到抓包分析,最简单的办法莫过于在客户端直接安装一个Wireshark或者Fiddler了,但是有时候由于客户端开发人员(可能是第三方)知识欠缺或者其它一些原因,无法顺利的在客户端进行抓包分析,这种情况下怎么办呢?本文中,我们将给大家介绍在服务端进行抓包分析的方法,使用tcpdump抓包,配合Wireshark对HTTP请求进行分析,非常简单有效。本
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Spring Cloud 学习笔记
Eureka客户端的服务注册       Eureka客户端在运行时会向Eureka服务端发送周期性的心跳,Eureka服务端利用客户端周期性的心跳续约请求来保证注册表的实时性。其中客户端会向服务端提供一个如果多久没有向服务端发送心跳请求,就不再维护这个客户端的时间阈值。!eureka.instance.leaserenew
Stella981 Stella981
2年前
Netty 4.0 实现心跳检测和断线重连
一实现心跳检测原理:当服务端每隔一段时间就会向客户端发送心跳包,客户端收到心跳包后同样也会回一个心跳包给服务端一般情况下,客户端与服务端在指定时间内没有任何读写请求,就会认为连接是idle(空闲的)的。此时,客户端需要向服务端发送心跳消息,来维持服务端与客户端的链接。那么怎么判断客户端在指定时间里没有任何读写请求呢?netty中为我们提供一
Stella981 Stella981
2年前
Netty(7)
改造timer,即客户端与服务端建立连接后,服务端主动向客户端发送当前时间。server:ch.pipeline().addLast(newTimeEncoder());ch.pipeline().addLast(newTimeServerHandler());TimeServerHandlerpubliccl
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
子桓
子桓
Lv1
年年跃马长安市。客舍似家家似寄。
文章
1
粉丝
0
获赞
0
热门文章

暂无数据