客户端Connection reset by peer怎么办?——可能只是服务端挂了

cdn线网运营总会遇到有各种各样的奇怪问题,而导致这些问题却对应的各种各样的原因。有些原因查出来却总叫人哭笑不得,比如本案例所说的,服务端的程序挂了导致的connection reset by peer问题。这种最基础的原因却往往最能怀疑到,我个人觉得主要原因有以下两点。

一,定式思维总会让人最先排出掉最接近真相到原因。有点类似高中做题,总容易先入为主,陷入死胡同。

二,没有人对各种原因做归纳总结,不同的原因导致的虽然都是连接失败这一现象,但如果深入研究,一定有独特的特征。需要有人说出“白马”和“黑马”的各自独特性。网上搜索了下connection reset by peer关键字,发现只有应用层原因说明各种原因,并没有这种问题的tcp层的原因介绍。那就我来根据线网运营遇到的案例来分析具体tcp层发生来什么,各种connection reset by peer的原因在tcp层有啥不同的特征来区分。

废话不多扯,直接开始说事。下图是某下载业务在第三方竞速平台的错误点,错误类型是建立连接失败。幸好第三方测试平台自带错误点抓包功能,保留了错误发生的现场。

从图中可以看到,客户端没发送一个syn包都会回复一个reset包。很直观的感觉三次握手阶段,连接还没建立肯定还没有到应用层,必然跟应用层没有关系。并且如果应用层有问题,必然会导致大面积的连接失败,而第三方测试平台显示只是两个错误点。而我首先怀疑的是前一条连接的time_wait一直存在,导致的新链接被reset,因为我们从入门就有意无意的被灌输“前一条流会影响后一条流的建联,尤其是time_wait状态的连接总是充满着各种神秘”。

首先tcp层发送的reset是分为两种——active_reset和非active_reset, active_reset是调用tcp_send_active_reset()进行发送的,而非active_reset是调用tcp_v4_send_reset()进行发送。那从抓包来看怎么确认是哪种类型的reset呢? 关键是要看Win值是否有设置, tcp_send_active_reset()调用的是tcp_transmit_skb()进行发送的,在tcp_transmit_skb()会计算和设置接收窗口。而tcp_v4_send_reset()函数设置的Win是零。

void tcp_send_active_reset(struct sock *sk, gfp_t priority)

{
    struct sk_buff *skb;

    /* NOTE: No TCP options attached and we never retransmit this. */
    skb = alloc_skb(MAX_TCP_HEADER, priority);
    if (!skb) {
        NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTFAILED);
        return;
    }

    /* Reserve space for headers and prepare contro
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Connection reset by peer”这个问题通常发生在网络通信过程中,一般是由于服务器端对客户端请求的响应被中断而产生的。这个问题通常会导致客户端和服务器端之间的连接中断,而导致无法正常通信和数据传输。 解决这个问题主要需要从以下几个方面考虑: 1.检查网络连接:如果出现“Connection reset by peer”的提示,首先需要检查一下网络连接是否正常。可以尝试使用网络诊断工具检查网络是否有故障或连接是否存在异常,以及服务器和客户端之间的网络连接是否稳定。 2.检查服务端程序:如果网络连接正常,而仍然出现“Connection reset by peer”的提示,就需要检查服务器端的应用程序是否存在异常。需要检查应用程序的日志文件、配置文件等常见问题,如果发现存在问题,需要及时调整。 3.检查客户端程序:如果服务器端没有问题,则需要检查客户端程序是否存在异常。检查客户端程序的异常日志,确定是否存在代码问题,如果有,需要及时修复。 总的来说,解决“Connection reset by peer”的问题需要逐步排除网络和应用程序上的可能问题,确定具体问题的原因,然后针对具体问题进行相应的调整和修复。同时,针对此问题,建议进行日志的记录和分析,结合实际情况进行相应的优化和调整,保证网络通信的稳定性和可靠性,提升应用程序的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值