Network/Golang - "GET" 请求剖析

Network/Golang - Anatomy of a "GET" request

我想这是以前有人问过并回答过的问题,但我不知道要搜索什么才能找到它。这对我来说就像是大学计算机网络课程的一部分——我从来没有上过。如果有人能指出我的答案,那就太好了。

所以,问题是:

在许多语言中,例如 Go 和 JavaScript,通过 http/https 向 API 发出 "GET" 请求相对简单。但是在相对 high-level 的描述中,在表面之下发生了什么?

我问是因为我需要更好地理解如何处理当事情不正常时我收到的各种错误。

为了了解我要寻求的答案类型,我将参考 Golang 进行 http 调用的方法。在 Golang 中,您可以导入 net/http 包并这样调用 http.Get("http://www.example.com")。但是您也可以指定一个 "client",您可以将其配置为具有特定自定义 headers 等内容。您可以在客户端中指定一些更复杂的内容,例如使用的传输等等,我除非它能解决我的问题,否则我真的不感兴趣。

基本上,归结为:Go 是完全并发的,在我的例子中是并行的。我每秒发出大约 300 个请求到一个 API。 golang docs 的建议是客户端可以安全地并发使用,因此应该只实例化一次 - 本质上,我有一个全局客户端,每个请求都通过它流动。

如果我收到一条错误消息,指出一个连接已被终止,这是否会影响一个请求,许多请求,我是否必须对客户端执行任何操作才能获得另一个连接?

此外,是一次每个连接一个请求,还是每个请求都建立一个新连接?请求之间的连接是否持久,什么决定了它们何时死亡?

这个问题可能很杂乱,可能没有意义。如果有人能回答其中的任何部分,将不胜感激。

网络:

dns->ip->tcp->http。 DNS 将域解析为 ip 地址; tcp 添加一个端口(如 HTTP 默认 80)和其他; http 添加 headers、表单数据等。最后,您的 ip 数据包中的 http 负载从您的网络适配器发送,并由 Internet 中的路由器很好地处理,并将到达正确的 http 服务器。

net/http:

我们在 golang 文档中回答了您所有的传输层问题,主要是 this。请仔细阅读。

更新:

一个连接错误只影响一个请求。即使多个请求使用相同的 tcp 连接,因为 request-reponse 对一个接一个,所以一个连接错误永远不会导致两个请求失败。