首页 文章

Go如何处理HTTP keep-alive?

提问于
浏览
4

我理解规则,如果客户端和服务器都支持持久连接,他们可以在第一个请求中通过 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: Do these two requests use the same TCP connection?

在服务器端:

当一个请求到来时,Go HTTP框架将它分派给一个处理程序,然后由于keep-alive,框架应该准备在同一个TCP连接上的下一个请求 . 但是我没有在处理程序中看到任何块模式读取代码 . 所以,

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

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

1 回答

  • 3

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

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

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

    go HTTP Server处理keepalive连接是默认的 . 没有HTTP“非阻止模式”这样的东西 . 它按照HTTP规范的描述以串行方式处理单个连接上的请求和响应 .

相关问题