You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:36:04