Go如何处理HTTP保持活力?

Go如何处理HTTP保持活力?,http,tcp,go,Http,Tcp,Go,我理解这样一条规则:如果客户端和服务器都支持持久连接,那么它们可以在第一个请求中通过连接:keep-alive头使用它。之后,客户端和服务器在处理完第一个请求/响应后仍将保持底层TCP连接打开,然后在以下请求/响应中使用相同的连接 我不清楚的是编程模型。在GO中考虑下面的客户端代码: resp, _ := client.Get("http://www.stackoverflow.com") // do some other things resp, _ = client.Get("http://

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

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

resp, _ := client.Get("http://www.stackoverflow.com")
// do some other things
resp, _ = client.Get("http://www.stackoverflow.com/questions")
据我所知,
保持活动状态
是HTTP/1.1中的默认策略

Q1:这两个请求使用相同的TCP连接吗?

在服务器端:

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

Q2:Go HTTP框架是否使用某种非块模式来处理保持活动状态?

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

问题1:这两个请求使用相同的TCP连接吗

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

问题2:GoHTTP框架是否使用某种非块模式来处理保持活动


默认情况下,go HTTP服务器处理keepalive连接。没有HTTP“非块模式”这样的东西。它以HTTP规范描述的串行方式处理单个连接上的请求和响应

从逻辑上讲,当GoHTTP框架处理完一个请求时,它应该从tcp中读取数据以等待下一个请求。我认为read会一直阻塞,直到数据出现,但我感觉不到框架阻塞。那么这是如何实现的呢?@H.W.Du:如果您想知道它是如何实现的,请阅读源代码。处理请求的实际循环当前位于来自的
func(c*conn)service()