Java HttpURLConnection
从访问一个网站看起
当你从浏览器敲入一个网址 www.tianxiaohui.com
, 浏览器就自动给你建立一个到该服务器的 TCP
连接, 然后发送请求(request), 然后接受回应(response), 浏览器然后展示返回的结果.
你比较关心返回的页面, 但这次我们关心这个建立的 TCP
连接的命运. 它会被立马关掉吗? 还是一直开着就不管它了, 还是等个10分钟再关掉它?
了解一下 HTTP 的历史
在 HTTP 1.0 及之前, 每当发送一个请求, 必须新建一个 TCP
连接, 接收到响应之后, 立马关掉做个连接. 也就是每个 TCP
连接只能用一次, 这种模型称之为 Short-lived connections
.
当然, 人们很快意识这种低效和浪费, 于是在原有的 HTTP 协议基础上新加了 Connection
header. 常见的情况下, 它有2个值:
- close 一次请求/回应之后立马关掉, 指示浏览器/服务器这是
Short-lived connections
. - 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
为什么要有 timeout
和 max
既然持久连接高效又节省资源, 那么为什么还需要有 Keep-Alive
header 的 timeout
和 max
.
假如一直保持连接, 可是客户端发送完1个或几个连接后, 可能再也不用了, 那么这个连接保持在无论客户端还是服务器端都没有任何意义, 只能带来资源的浪费. 所以要想办法在它空闲一段时间后, 就干掉它. 所以, 就有了 timeout
这个值.
那么为什么又要设置一个连接最多可以发送多少请求/响应呢? 岂不是通过它发送的请求/响应越多越好?
Java Socket close
vs shutdown
https://www.baeldung.com/cs/sockets-close-vs-shutdown
HttpClient
KeepAliveCache
环境变量 http.maxConnections
when close the connection
refer: