【问题标题】:Network/Golang - Anatomy of a "GET" requestNetwork/Golang - 解析“GET”请求
【发布时间】:2015-10-20 00:46:25
【问题描述】:

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

所以,问题是:

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

我之所以这么问,是因为我需要更好地了解如何处理我收到的各种错误,当事情没有按应有的方式运行时。

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

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

如果我收到一个错误说连接已被终止,这是否会影响一个请求,许多请求,我是否必须对客户端做任何事情才能获得另一个连接?

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

这个问题可能很漫无边际,可能没有意义。如果有人能回答它的任何部分,那将不胜感激。

【问题讨论】:

  • 您似乎只是在问“http 是如何工作的”? go 客户端处理 http/1.1(和 go1.6 中的 http/2)。如果您了解该协议,那么客户端所做的事情就会随之而来。这里不提供有关 http 的详细信息的教程。如果您想就如何使用客户端进行讨论,邮件列表是一个更好的论坛,但您应该在这里提出具体问题。

标签: http go https network-programming connection


【解决方案1】:

网络:

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

网络/http:

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

更新:

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

【讨论】:

  • 好的,谢谢!但是,一个问题是,当错误状态类似于“连接已关闭”时,是单个请求的连接还是更持久的连接,处理多个“GET”?
  • @bawjensen:连接可能是持久的,也可能不是持久的。这由客户端在协议级别处理,您无需担心。
  • 你说得对,我不必担心。但是由于我遇到了有关连接的错误,并且我花费 很多 时间围绕 HTTPS 连接建立加密,也许如果我可以根据我的具体情况优化连接的行为,我可以消除这些错误并加快我的代码速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多