你用浏览器打开网页,点开一个视频网站,接着刷评论、点收藏、再切到另一个标签页——这些操作背后,其实很多请求都悄悄复用了同一个网络连接。这就是「长连接」在起作用。
什么是长连接?
简单说,长连接(Keep-Alive)就是客户端和服务器建立一次TCP连接后,不急着断开,而是让后续的多个HTTP请求复用它。不像早期HTTP/1.0默认每次请求完就关连接,现在主流浏览器和Web服务默认都支持长连接。
客户端真的能“请求”长连接吗?
能,而且很常见。比如你在发HTTP请求时,手动加上这行头:
Connection: keep-alive浏览器、curl、Postman这些工具默认就带这个头了。你用Chrome开发者工具的Network面板随便点一个资源,点开Headers,往下拉就能看到 Request Headers 里写着 Connection: keep-alive —— 它不是“申请”,而是明确告诉服务器:“咱别断,后面还有活儿。”
但光客户端喊没用
服务器得答应才行。如果后端是Nginx,默认开启Keep-Alive;如果是自己写的Python Flask服务,就得显式配置,比如用Gunicorn加参数 --keep-alive 5。否则客户端再热情,服务器回个 Connection: close,连接还是秒关。
一个小实验:对比看看
用命令行试试:
curl -v http://httpbin.org/get你会看到响应头里有 Connection: keep-alive。再试一次加关闭头:
curl -H "Connection: close" -v http://httpbin.org/get这次响应头可能变成 Connection: close,连接用完即弃。
长连接不是万能的
它省了三次握手和慢启动的时间,对频繁小请求(比如加载一堆图标、JS文件)特别友好。但要是某个请求卡死、超时或出错,整个连接可能被拖住;另外,空闲太久(比如几分钟没动静),中间代理或防火墙也可能主动断掉它。所以服务器通常会设个 Keep-Alive: timeout=5, max=100 —— 意思是最多空闲5秒,最多承载100次请求。
日常上网时你根本不用操心这事,浏览器和网站早已默契配合。只有当你写爬虫、调API、搭内网服务时,才需要多瞄一眼这个 Connection 头是不是还在那儿稳稳挂着。