golang/go http配置中常见的几个超时时间配置的作用

golang/go https配置中常见的几个超时时间配置的作用

背景: 经常有同事搞混golang/go中http相关几个超时配置的作用,所以记录下这几个超时配置的作用。
备注:下面的配置只针对http 1.1,http2.0可能略有不同

通过WireShark抓包获取的基本信息

总览

角色字段含义备注
clientClient.Timeout从建链到读完响应体的总超时时间,0表示不设置超时时间包括抓包信息中的"tcp握手"+“tls证书交换”+“业务报文”
clientTransport.TLSHandshakeTimeoutTLS证书交换总超时时间客户端错误日志:net/http: TLS handshake timeout
clientTransport.ResponseHeaderTimeout等待服务端响应的超时时间客户端错误日志:net/http: timeout awaiting response headers
clientTransport.IdleConnTimeout链路空闲超时时间,超时后自动断链
clientTransport.ExpectContinueTimeout控制 HTTP 客户端在发送 Expect: 100-continue 头后,等待服务器 100 Continue 响应的最大时长,一般用于大文件上传
clientDialer.Timeout建链超时时间,这个超时时间会设置为建链的context.
clientDialer.DeadlineDialer.Timeout功能类似,是个具体的时间点.
clientDialer.KeepAlivetcp keepAlive超时时间和周期. 如果链路在keepAlive时间段内没有业务报文,连接层会发送keepalive存活探测报文,如果连续9次没有对端没有响应,则认为此链路已经过时,关闭端链接。
ServerServer.ReadTimeout服务端收到请求后读取header和body的超时时间
ServerServer.ReadHeaderTimeout服务端收到请求后读取header的超时时间
ServerServer.WriteTimeout服务端写入响应体的超时时间
ServerServer.IdleTimeout链路空闲超时时间。

Transport.TLSHandshakeTimeout

tls握手超时时间.在server端建链部分sleep 10s,将Transport.TLSHandshakeTimeout设置为6s,抓包发现6s后超时断链。
在这里插入图片描述

Transport.ResponseHeaderTimeout

请求发送后,等待服务端响应的时间.因为此时链接已经建立,通常是因为业务处理超时导致.
设置为3s
在这里插入图片描述

Transport.IdleConnTimeout

链路空闲超时时间.
设置为3s
在这里插入图片描述

Transport.ExpectContinueTimeout

控制 HTTP 客户端在发送 Expect: 100-continue 头后,等待服务器 100 Continue 响应的最大时长,一般用于大文件上传.

Dialer.Timeout

建链超时时间,这个超时时间会设置为建链的context.

func (d *Dialer) deadline(ctx context.Context, now time.Time) (earliest time.Time) {
    if d.Timeout != 0 { // including negative, for historical reasons // Dialer.Timeout
        earliest = now.Add(d.Timeout) // 当前时间加上Dialer.Timeout
    }
    if d, ok := ctx.Deadline(); ok {
        earliest = minNonzeroTime(earliest, d) // 取earliest和ctx超时时间中两者中的小值
    }
    return minNonzeroTime(earliest, d.Deadline)
}
func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn, error) {
    //...
    deadline := d.deadline(ctx, time.Now())
    if !deadline.IsZero() {
        testHookStepTime()
        if d, ok := ctx.Deadline(); !ok || deadline.Before(d) {
            subCtx, cancel := context.WithDeadline(ctx, deadline) // 设置给context
            defer cancel()
            ctx = subCtx
        }
    }
    //...
}

Dialer.Deadline

Dialer.Timeout功能类似,是个具体的时间点.

Dialer.KeepAlive

tcp keepAlive超时时间和周期. 如果链路在keepAlive时间段内没有业务报文,连接层会发送keepalive存活探测报文,如果连续9次没有对端没有响应,则认为此链路已经过时,关闭端链接。
在这里插入图片描述

Server.ReadTimeout

服务端收到请求后读取header和body的超时时间

Server.ReadHeaderTimeout

服务端收到请求后读取header的超时时间

Server.WriteTimeout

服务端写入响应体的超时时间

Server.IdleTimeout

链路空闲超时时间。
设置为3s,服务端主动断链。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值