去http.Client的DialContext KeepAlive和Transport IdleTimeout的区别

时间:2017-10-11 10:50:52

标签: go httpclient

client := &http.Client{
        Transport: &http.Transport{
            DialContext: (&net.Dialer{
                KeepAlive: 5 * time.Second,
            }).DialContext,
            IdleConnTimeout: 3 * time.Second,
        },
    }

KeepAlive和IdleConnTimeout之间有什么区别?

他们中的哪一个究竟做了什么?

1 个答案:

答案 0 :(得分:1)

从文档中:

https://github.com/golang/go/blob/go1.13.8/src/net/dial.go#L72

KeepAlive指定活动网络连接的保持活动探测之间的间隔。如果为零,则在协议和操作系统支持的情况下,将使用默认值(当前为15秒)发送保持活动的探测。不支持保持活动状态的网络协议或操作系统将忽略此字段。如果为负,则禁用保持活动探测。

因此,如果将KeepAlive设置为大于0,它将表示从下一次探测开始经过的时间,以了解网络连接是否仍处于活动状态。

从另一面来看,IdleConnTimeout
https://github.com/golang/go/blob/go1.13.8/src/net/dial.go#L72

IdleConnTimeout是空闲(保持活动状态)连接在关闭自身之前将保持空闲状态的最长时间。零表示没有限制。

因此,如果将IdleConnTimeout设置为大于0,则表示连接仍处于打开状态的时间。