之前遇到了很多 timeout,但是仔细看错误提示好像不完全一样,于是就做了个简单的试验:
Client 上看到的错误
找不到服务器(no such host
)的几种情况:
# 域名不存在,瞄了下代码,应该是 dns 包返回的
Get http://a.b/abc: dial tcp: lookup a.b: no such host
# ip 不合法不会直接检查,也会返回同样错误
Get http://127.0.0.1888:8080/abc: dial tcp: lookup 127.0.0.1888: no such host
# 端口瞎填会直接报错,都不会发请求
Get http://127.0.0.1:65536/abc: dial tcp: address 65536: invalid port
拒绝连接,对方端口未监听、进程挂掉等等
Get http://127.0.0.1:8080/abc: dial tcp 127.0.0.1:8080: connect: connection refused
建立连接超时
Get http://127.0.0:8080/abc: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
等待返回 header, 一般是接口还在处理逻辑,没有返回任何数据;或者对方只是个普通的 tcp 服务,但不是 http
Get http://127.0.0.1:8080/abc: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
客户端读取超时:已建立好连接,已经开始返回数据,但是body 太大太慢:
wait_test.go:48: net/http: request canceled (Client.Timeout exceeded while reading body)
Server 上看到的错误
客户端主动断开连接,服务器端在调用 Write(p []byte) (n int, err error)
时会返回:
wait_test.go:21: write tcp 127.0.0.1:8080->127.0.0.1:49290: write: broken pipe
客户端主动断开连接,通常会直接使用 ctx.Done()
检测到,这个时候 ctx.Err()
里会拿到这个信息:
context canceled
参考链接: