如何用JavaScript耗尽HTTP连接池并使后续请求失败?
如何填满HTTP连接池并阻塞后续请求
之前代码无效的原因
- 浏览器对同域名HTTP/1.1连接池有默认并发限制(比如Chrome是6个),但你之前的请求响应太快,连接用完就被释放,无法持续占用连接池。
fetch的keepalive参数是用于页面卸载时发起后台请求,和连接池占用无关;Connection: keep-alive是浏览器默认启用的HTTP特性,手动设置不会改变连接池的行为。
实现方案:持续占用连接池
要填满连接池,核心是让每个请求长时间占用连接——让服务器延迟足够久响应,这样浏览器的所有可用连接都会被挂起,后续请求会因无可用连接被阻塞(或超时失败)。
示例代码
// 发起足够多的长耗时请求,占满连接池 async function fillConnectionPool() { const maxConnections = 6; // 浏览器同域名HTTP/1.1默认并发数,可根据实际调整 const pendingRequests = []; for (let i = 0; i < maxConnections; i++) { // 发起延迟30秒响应的请求,持续占用连接 const req = fetch('https://httpbin.org/delay/30', { method: 'GET' }); pendingRequests.push(req); // 不要用await,让请求同时发起,才能占满连接池 } return pendingRequests; } async function testBlockedRequest() { await fillConnectionPool(); // 此时连接池已被占满,发起后续请求会被阻塞或失败 try { const res = await fetch('https://httpbin.org/get'); console.log('后续请求成功:连接池未被占满'); } catch (err) { console.log('后续请求失败:连接池已填满', err); } } testBlockedRequest();
补充说明
- 不同浏览器的连接池上限略有差异(HTTP/1.1通常是6-8个),如果目标服务器用的是HTTP/2,由于多路复用特性,不存在连接池并发限制,需要改用仅支持HTTP/1.1的测试服务器。
- 必须确保请求是并行发起,如果用
await循环,请求会串行执行,永远无法占满连接池。
内容的提问来源于stack exchange,提问作者webhack31333
相关产品推荐
相关产品推荐

