curl--parallel-immediate选项详解并行传输时优先新建连接而非等待多路复用【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl--parallel-immediate是 curl 命令行工具在并行传输--parallel/-Z模式下用于调整连接调度策略的开关。开启后curl 会倾向于为每个新传输直接建立独立连接而不是像默认行为那样先等待片刻、尝试把新传输复用到已有多路复用HTTP/2 与 HTTP/3连接上。本文结合 curl 仓库中的命令行解析、并行调度与连接复用源码完整讲解该选项的行为机制、底层实现、适用场景与配套参数。选项总览该选项在 curl 中属于连接connection类别的全局布尔选项从 7.68.0 版本开始提供。其完整定义位于 docs/cmdline-opts/parallel-immediate.md长选项--parallel-immediate短选项无帮助文本Do not wait for multiplexing不等待多路复用添加版本7.68.0分类connection curl global是否可重复boolean开关型可与--no-parallel-immediate反向使用作用域global全局生效它是--parallel-Z并行传输模式的辅助开关单独使用没有任何效果只有配合--parallel一起使用才有意义。官方给出的典型用法是curl --parallel-immediate -Z $URL -o file1 $URL -o file2默认行为倾向于等待并复用多路复用连接要理解--parallel-immediate必须先理解 curl 并行传输的默认连接策略。在没有该选项时当 curl 以--parallel模式同时发起多个传输默认最多 50 个并发见 docs/cmdline-opts/parallel.md 与--parallel-max它并不急于为每一个 URL 都建立全新的 TCP/TLS 连接而是优先考虑复用对每个待发起的传输先在连接池connection pool中查找指向同一目标destination的既有连接如果找到的连接已经具备多路复用能力例如通过 ALPN 协商出的 HTTP/2、HTTP/3就把新传输作为一条新 stream 挂到该连接上如果找到的是正在连接中pending的候选连接并且设置了CURLOPT_PIPEWAITcurl 会等待一小段时间观察该连接能否协商出多路复用能力再决定复用还是新建。这种策略的好处是把连接数量压到最低——大量传输共享少量连接减少握手开销与服务器连接数。代价是新传输的启动可能会有轻微延迟因为它要为等待多路复用机会付出等待时间。--parallel-immediate的行为放弃等待立即新建连接--parallel-immediate恰恰是对上述等待行为的反制。开启后curl 在并行传输时更倾向于立刻打开新的并行连接而不是停下来等待观察新传输能否搭上另一条连接的多路复用流。从效果上看这是连接数量与启动速度之间的权衡默认不加该选项连接数少但对复用不确定的连接会等待传输启动可能稍慢开启--parallel-immediate传输启动更快、更果断但同一时刻打开的连接数可能显著增多。源码实现从命令行开关到连接调度的完整链路1. 命令行解析与状态存储选项在 src/tool_getparam.c 中注册为布尔参数解析后写入全局配置结构{parallel-immediate, ARG_BOOL, , C_PARALLEL_IMMEDIATE},对应处理分支src/tool_getparam.ccase C_PARALLEL_IMMEDIATE: /* --parallel-immediate */ global-parallel_connect toggle; break;该布尔标志parallel_connect定义在全局配置结构 src/tool_cfgable.h 中BIT(parallel); BIT(parallel_connect);parallel_connect这个名字直观地表达了选项本质让并行传输直接去连接connect而不要等待。2. 关键生效点关闭 PIPEWAIT真正决定调度行为的是并行调度器在把每个 easy handle 加入 multi 句柄之前设置的CURLOPT_PIPEWAIT。在 src/tool_operate.c 的add_parallel_transfers()中有明确的实现注释/* parallel connect means that we do not set PIPEWAIT since pipewait makes libcurl prefer multiplexing */ (void)curl_easy_setopt(per-curl, CURLOPT_PIPEWAIT, global-parallel_connect ? 0L : 1L);这段代码直接揭示了两个模式的核心差异未开启--parallel-immediateparallel_connect为 0于是每个传输设置CURLOPT_PIPEWAIT 1L。libcurl 在找不到可用复用连接时会等待可能的复用机会见下节开启--parallel-immediateparallel_connect为 1于是CURLOPT_PIPEWAIT 0L传输不再为多路复用等待直接新建连接。3. PIPEWAIT 在连接池中的语义CURLOPT_PIPEWAIT是 libcurl 库层面的选项注册于 lib/easyoptions.c。它的作用体现在连接池查找逻辑中在 lib/url.c 的url_match_result()里当连接池中存在正在连接中的候选连接pending connection且设置了 PIPEWAIT 时libcurl 会决定等待else if(match-seen_pending_conn match-data-set.pipewait) { infof(match-data, Found pending candidate for reuse and CURLOPT_PIPEWAIT is set); match-wait_pipe TRUE; }wait_pipe置真意味着本次传输先不新建连接而是挂起等待那条 pending 连接完成握手——如果它协商出 HTTP/2/3 多路复用能力就把传输作为新 stream 复用到其上如果对方不支持复用再回退为新建连接代码中同样处理了已见 single-use 连接且未见 multiplex 连接即服务器不支持复用的情形见 lib/url.c。因此--parallel-immediate通过关闭 PIPEWAIT从根源上跳过了等待 pending 连接判定复用能力这一环节让每个传输立刻走新建连接路径。4. 与并发上限的联动并行传输的调度在 src/tool_operate.c 的add_parallel_transfers()中完成它根据global-parallel_max由--parallel-max控制默认 50决定同时挂载到 multi 句柄上的 easy handle 数量已有传输结束时再补充新的。--parallel-immediate影响的是这些传输如何获取连接而--parallel-max决定同时允许多少传输在跑两者相互独立、可自由组合。从源码结构可以推断开启--parallel-immediate后由于放弃复用等待同一时刻向同一目标建立的连接数会明显高于默认模式因此它更适合快速启动优先、连接数不敏感的场景。典型使用场景结合上述机制以下场景适合使用--parallel-immediate对启动延迟敏感的场景例如需要尽快发出所有请求的监控、探测类脚本不希望任何传输因为等待复用判定而延后目标服务器不支持或难以协商 HTTP/2 多路复用如果服务器每次握手才能确定是否支持复用等待往往只是浪费时间直接连接更快同一目标上的传输彼此独立传输间没有共享连接带来的收益时直接并行建连更省事配合多目标混合下载如官方示例那样同时对多个 URL 发起下载希望每个 URL 都立即获得独立连接curl --parallel-immediate -Z \ https://example.com/file1.bin -o file1.bin \ https://example.com/file2.bin -o file2.bin \ https://example.net/file3.bin -o file3.bin反之以下场景则应保持默认不要加该选项目标服务器支持 HTTP/2/3 多路复用且希望尽量少占用连接资源、降低服务器连接压力大量 URL 指向同一主机复用连接能显著减少 TLS 握手开销连接数受服务器或网络设备限制需要严格控制并发连接数量。配套参数一览--parallel-immediate通常与以下全局并行参数配合使用定义均位于 docs/cmdline-opts 目录选项作用说明-Z, --parallel启用并行传输并行模式的开关--parallel-immediate的前置条件--parallel-max num最大并发传输数默认 50详见 docs/cmdline-opts/parallel-max.md--parallel-max-host num单主机最大并发传输数限制指向同一主机的并行传输数量见 src/tool_getparam.c--parallel-immediate不等待多路复用优先新建连接本文主题在curl --help all的输出中这些选项位于并行传输分组内注册于 src/tool_listhelp.c。另外--parallel-immediate是布尔开关因此也支持--no-parallel-immediate形式用于脚本中覆盖先前设置。注意事项与版本边界必须配合--parallel该选项只影响并行传输模式的连接调度串行传输默认模式下无效最低版本 7.68.0低于该版本的 curl 无法识别该选项脚本跨版本使用时建议先用curl --version确认与--parallel-max-host联用如果既想快速建连、又需要限制单主机连接数可将--parallel-immediate与--parallel-max-host组合避免对同一服务器打爆连接网络开销上升开启后不再等待复用同一目标的连接数可能成倍增长TLS 握手、TCP 建连的系统开销相应增加适合内网或低延迟环境公共大流量环境下需评估服务器承载能力行为判定依赖 ALPN/HTTP 版本多路复用能力只有在连接握手如 ALPN 协商后才能确定这正是默认模式下等待存在的根本原因--parallel-immediate则彻底跳过这一等待阶段。小结--parallel-immediate本质上是 curl 并行传输调度中连接复用等待策略的开关默认开启等待通过CURLOPT_PIPEWAIT让传输等待 pending 连接的复用机会开启该选项后则关闭等待、为每个传输立即建立独立连接。从 src/tool_operate.c 的实现可见它最终只是把每个 easy handle 的CURLOPT_PIPEWAIT置为 0。理解这一机制后你可以在连接数最少与启动最快两种策略间按需切换让-Z并行下载在合适的场景发挥最大效率。【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考