我理解,如果客户端和服务器都支持持久连接,可以通过第一个请求中的
我不清楚的是编程模型。考虑以下go代码中的客户端:
据我所知,
Q1:这两个请求是否使用同一个TCP连接?
在服务器端:
当一个请求到来时,Go HTTP框架会将其分派给处理程序,然后由于keep-alive,框架应该为同一TCP连接准备下一个请求。但是,在处理程序中我没有看到任何阻塞读取代码。所以,
Q2:Go HTTP框架是否使用某种非阻塞模式来处理keep-alive?
我的意思是,处理程序不会阻塞读取,而只是在完成请求后返回,然后框架将轮询每个非阻塞TCP连接,如果其中一个有数据到达,则将其分派给关联的处理程序,依此类推。仅当请求具有
Connection:keep-alive
标头来使用它。之后,当客户端和服务器完成第一个请求/响应后,他们仍将保持底层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框架会将其分派给处理程序,然后由于keep-alive,框架应该为同一TCP连接准备下一个请求。但是,在处理程序中我没有看到任何阻塞读取代码。所以,
Q2:Go HTTP框架是否使用某种非阻塞模式来处理keep-alive?
我的意思是,处理程序不会阻塞读取,而只是在完成请求后返回,然后框架将轮询每个非阻塞TCP连接,如果其中一个有数据到达,则将其分派给关联的处理程序,依此类推。仅当请求具有
Connection: Close
头时,框架才会在处理程序返回时关闭TCP连接。
func (c *conn) serve()
中,位于http/server.go。 - JimB