我有 Ubuntu 18.04 客户端,并尝试卷曲到网络上不存在的主机,例如:
curl 192.168.11.1 --connect-timeout 10
curl 192.168.11.1 --connect-timeout 35
为什么它有时会回应
curl: (7) Failed to connect to 192.168.11.1 port 80: No route to host
,
有时
curl: (28) Connection timed out after 35001 milliseconds
,
即使在相同的超时时间内?
我也尝试NodeJS
从同一个 Ubuntu 客户端使用 的 http 请求库发出 HTTP 请求。有时我会得到
Error: connect ETIMEDOUT 192.168.9.1:80
有时我会
Error: connect EHOSTUNREACH 192.168.9.1:80
。
答案1
一个错误消息告诉您无法访问整个 192.168.9.1(EHOSTUNREACH),另一个错误消息告诉您等待响应已超时(ETIMEDOUT),但您不可能知道主机是否可以访问(因此假定为 YES)。
EHOSTUNREACH 表示您的主机或中间的路由器告诉您没有路由可以到达该主机,因此该主机实际上无法到达。RFC 表示应将此类 ICMP 消息返回给发送者:http://www.networksorcery.com/enp/protocol/icmp/msg3.htm。
请注意 curl 如何通过添加“无到主机的路由”向消息添加额外信息。如果您在同一个广播域中,而 192.168.9.1 的 ARP 解析请求没有响应,也可能会出现这种情况。
ETIMEDOUT 表示流量已传送到主机但主机没有响应,或者流量由于任何可能的原因(例如防火墙/ACL 或甚至缺少路由,就像 EHOSTUNREACH)而被悄悄丢弃。也可能是路由器生成了所需的 ICMP,但路径上的另一个设备丢弃了该 ICMP(因为出于某种原因,人们喜欢阻止 ICMP 流量)