http - Go 是如何处理 HTTP keep-alive 的?

标签 http tcp go

我理解的规则是,如果客户端和服务器都支持持久连接,则它们可以通过第一个请求中的 Connection:keep-alive header 使用它。之后,客户端和服务器在完成第一个请求/响应时仍将保持底层 TCP 连接打开,然后在后续请求/响应中使用相同的连接。

我不清楚的是编程模型。在 go 中考虑以下客户端代码:

resp, _ := client.Get("http://www.stackoverflow.com")
// do some other things
resp, _ = client.Get("http://www.stackoverflow.com/questions")

据我所知,keep-alive 是 HTTP/1.1 中的默认策略。

Q1:这两个请求是否使用同一个TCP连接?

在服务器端:

当一个请求到来时,Go HTTP 框架将其分派(dispatch)给一个处理程序,然后由于保持事件状态,该框架应该为同一 TCP 连接上的下一个请求做好准备。但是我在处理程序中没有看到任何 block 模式读取代码。所以,

Q2:Go HTTP 框架是否使用了某种非阻塞模式来处理keep-alive?

我的意思是,处理程序不会阻塞读取,而只是在完成请求后返回,然后框架将轮询每个非阻塞 TCP 连接,如果其中一个有数据到达,它会将其分派(dispatch)给关联的处理程序, 等等。只有当请求的 header 为 Connection:Close 时,框架才会在处理程序返回时关闭 TCP 连接。

最佳答案

Q1: Do these two requests use the same TCP connection?

是的,如果连接没有被服务器关闭,http.Transport 可以在默认配置中重新使用连接。

Q2: Does the go http framework use some kind of non-block mode to deal with keep-alive?

go HTTP 服务器默认处理保持连接。没有 HTTP“非阻塞模式”这样的东西。它按照 HTTP 规范所述以串行方式处理单个连接上的请求和响应。

关于http - Go 是如何处理 HTTP keep-alive 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26633220/

相关文章:

java - 为 SSLSocket 握手设置超时

templates - Golang索引模板包括

java - 如何用Java构造JSON数据

http - 使用 http 加载 html 时无法显示 "file"协议(protocol) url src 的 iframe

angular - 是否可以使用 ChatGPT API 处理 Angular 中的流 api 调用?

c - 拆分 TCP 流上的 Winsock2 错误 10014

按名称的android tcp连接

Java - HTTP Post,使用 cookie 登录网站,与此 PHP cURL 代码等效的 java?

linux - 如何下载Go on pixelbook/chromebook/Linux(debian)

go - 如何使用 Go Web 服务器提供静态 html 文件?