Java HttpURLConnection

从访问一个网站看起

当你从浏览器敲入一个网址 www.tianxiaohui.com, 浏览器就自动给你建立一个到该服务器的 TCP 连接, 然后发送请求(request), 然后接受回应(response), 浏览器然后展示返回的结果.

你比较关心返回的页面, 但这次我们关心这个建立的 TCP 连接的命运. 它会被立马关掉吗? 还是一直开着就不管它了, 还是等个10分钟再关掉它?

了解一下 HTTP 的历史

在 HTTP 1.0 及之前, 每当发送一个请求, 必须新建一个 TCP 连接, 接收到响应之后, 立马关掉做个连接. 也就是每个 TCP 连接只能用一次, 这种模型称之为 Short-lived connections.

当然, 人们很快意识这种低效和浪费, 于是在原有的 HTTP 协议基础上新加了 Connection header. 常见的情况下, 它有2个值:

  1. close 一次请求/回应之后立马关掉, 指示浏览器/服务器这是 Short-lived connections.
  2. keep-alive 可以多次复用的连接, 后续请求/回应可以继续使用, 称之为 persistent connections.

在 HTTP 1.0, 没有 Connection header, 则默认是 close, 要持久连接必须添加 header Connection: keep-alive.
在 HTTP 1.1, 没有 Connection header, 则默认是 keep-alive, 要立马关掉连接必须添加 header Connection: close.

HTTP header Connection, Keep-Alive

上面提到的 Connection header, 当 Connection 的值是 keep-alive 的时候, 可以添加另外一个 header Keep-Alive, 它的值通常是这种格式: timeout=5, max=1000.
timeout: 表示可以容忍这个connection 空闲最少多少秒, 然后就关闭它. 一般大于这个数字关闭.
max: 通过这个连接最多可以发送的 request/response 的数量.
请注意, 这个2个数值只是提示两端的连接管理器, 并不一定要求两端连接管理器一定这么做.

Connection: Keep-Alive
Keep-Alive: timeout=5, max=1000

为什么要有 timeoutmax

既然持久连接高效又节省资源, 那么为什么还需要有 Keep-Alive header 的 timeoutmax.
假如一直保持连接, 可是客户端发送完1个或几个连接后, 可能再也不用了, 那么这个连接保持在无论客户端还是服务器端都没有任何意义, 只能带来资源的浪费. 所以要想办法在它空闲一段时间后, 就干掉它. 所以, 就有了 timeout 这个值.

那么为什么又要设置一个连接最多可以发送多少请求/响应呢? 岂不是通过它发送的请求/响应越多越好?

Java Socket close vs shutdown

https://www.baeldung.com/cs/sockets-close-vs-shutdown

HttpClient

KeepAliveCache

https://github.com/openjdk/jdk/blob/e1870d360e05c372e672b519d7de2a60c333675b/src/java.base/share/classes/sun/net/www/http/KeepAliveCache.java#L342

环境变量 http.maxConnections

when close the connection

refer:

  1. https://developer.mozilla.org/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x
  2. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection

标签: none

添加新评论