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

问题由来:错误的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是什么流程发出来的? 跟应用层有关吗? 又或者是容器的一些特性? 看了一些帖子和试验也有相关的记录,但是根本原因还是不大清楚,欢迎讨论指教!

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

双十一预售活动分析

2022年双十一促销活动已经开始,大家应该都提前开始关注今年双十一活动的时间表了吧?2022年10月24日晚8:00天猫双11预售时间,第一波销售时间10月31日晚8:0,第二波销售时间11月10日晚8:00;天猫双11的优惠力度是跨店每满30050

TCP滑动窗口消息堆积

线上问题:客户端不能推送数据到服务端。排查:pingip或者telnetport全是正常的,不奏效。通过wireshark抓取报文查看,发现一个奇怪现象是窗口不固定,但是整体趋势是逐渐减小,直到为0.服务端报文如下:至

Linux服务器下的HTTP抓包分析

说到抓包分析,最简单的办法莫过于在客户端直接安装一个Wireshark或者Fiddler了,但是有时候由于客户端开发人员(可能是第三方)知识欠缺或者其它一些原因,无法顺利的在客户端进行抓包分析,这种情况下怎么办呢?本文中,我们将给大家介绍在服务端进行抓包分析的方法,使用tcpdump抓包,配合Wireshark对HTTP请求进行分析,非常简单有效。本

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0