涉及结构体
- Client、Transport、Dailer、Request、Resolver
Request
- ctx context.Context 可以设置超时时间
Client
- Timeout:整体超时设置,与Request的ctx取较小超时时间
Transport
- TLSHandshakeTimeout:tls握手的超时时间,通过AfterFunc实现,超时后,直接返回tlsHandshakeTimeoutError
- DisableKeepAlives:如果为true,不会有conn连接池,每次都是开启新连接,不会进行连接复用,与TCP的keep-alive没有关系
- persistConn的readLoop和writeLoop一个进行读数据,一个写数据
- MaxResponseHeaderBytes:获取返回的Header最大值,默认值为10M,返回的body没有限制,在persistConn里的Read函数实现
persistConn
- br和bw对应底层的persistConn和persistConnWriter,一个是reader,一个是writer,
Dialer
-
Timeout:获取conn的超时时间,与Request的ctx取较小超时时间。一般TCP的超时一般是3分钟 -
DialContext
Resolver
- lookupIPAddr:获取IP地址数组
- parseIPZone直接解析ip地址,不走dns
- 实际调用的函数为lookupIP
- PreferGo默认为false,实际最后都是调用goLookupIPCNAMEOrder,两种方式直接获取的order的不太一样
- prefergo
- true:只从systemConf里面获取Oder
- false:先从systemConf里面获取Oder,如果为hostLoopupCgo,则Cgo的方式获取
- 读取/etc/nsswitch.conf、/etc/resolv.conf和/etc/mdns.allow
- order有下面几种类型
- hostLookupCgo
- hostLoopupFilesDNS
- hostLoopupDNSFiles
- hostLoopupFiles
- hostLoopupDNS
- goLoopupIPCNAMEOrder
- 域名最大长度255
- 可以通过配置resolv.conf的useTCP强制使用TCP,否则先通过udp获取,获取不到再使用tcp
- dns的超时时间默认为5s,如果在resolv.conf配置了,使用配置中的
- 调用远端的dailer也是Dialer
TLS
- persistConn.addTLS:添加tls
- 握手
- clientHandshake
- serverHandshake
学习文章
- keepalive
- 理解TCP长连接(Keepalive)
|