【问题标题】:Error: ssh: handshake failed: read tcp read: connection reset by peer错误:ssh:握手失败:读取 tcp 读取:对等方重置连接
【发布时间】:2021-07-15 07:27:25
【问题描述】:

我正在尝试使用以下 golang 代码连接到我的供应商的 SFTP 服务器。

    config := &ssh.ClientConfig{
        User:            user,
        Auth:            []ssh.AuthMethod{ssh.PublicKeys(signer)},
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }
    config.SetDefaults()

    // connect
    conn, err = ssh.Dial(network, address+port, config)
    if err != nil {
        return err
    }
    defer conn.Close()

我随机得到 ssh: handshake failed: read tcp :->:: read: connection reset by peer ssh.Dial() 方法中的错误。它在 5 次中有 2 次有效,但其他 3 次失败。这可能是由于 FTP 服务器从其他客户端获得的大量连接请求造成的吗?在这些情况下是否建议使用指数退避重试?

【问题讨论】:

    标签: go tcp ftp sftp


    【解决方案1】:

    这可能是因为 FTP 服务器从其他客户端获得大量连接请求吗?

    golang/go issue 20960 "net/http: read: connection reset by peer under high load" 确实建议了这一点:(获得 HTTPS,但限制也适用于 SSH 连接)

    如果您的网络连接中断,它们可能是真实的(对等点确实断开了连接),或者它们可能是由于其中一方达到了内核限制。

    例子:

    我正在运行 1000 个并发连接,最终在 OSX 上也遇到了这个问题,文件描述符从默认 (256) 增加到 4096。

    server configuration 很重要。

    或者:

    我在 macOS 下也看到了这个问题,其中服务器和客户端通过 localhost 进行通信。我不知道问题的确切原因,但在高负载期间运行 netstat 会显示大量处于 TIME_WAIT 状态的连接。

    要么耗尽文件描述符,要么耗尽本地端口。
    或两者兼而有之。

    我一直看到对等方重置连接,直到TIME_WAIT 连接数约为 7k。如果我让测试进一步运行,我最终会收到connect: can't assign requested address 错误,这表明我用尽了本地端口。
    TIME_WAIT 连接数为 15k。

    对于我不需要的项目,我可以通过限制并发连接数来解决问题。通过限制 goroutine 的数量来解决我的代码中的问题似乎是武断的,但偶尔还是会失败。
    在 http 传输中限制 MaxConnsPerHost 确实成功了,问题完全消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-25
      • 2013-08-01
      • 1970-01-01
      • 2016-12-09
      • 2014-11-01
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      相关资源
      最近更新 更多