cURL连接流程全解析:从URL到网络连接的完整技术路径
URL解析
初始步骤是从URL中提取主机名部分。URL中的主机名可以作为纯IP地址或域名提供。如果URL中没有提供数字IPv4或IPv6地址,cURL会检查主机名是否使用IDN(国际化域名),如果是,则将其转换为punycode以便后续处理。
现有连接检查
根据协议、主机名和端口号,cURL检查是否存在适合使用的现有活动连接。重用现有连接是启动新传输的最快方式,因此是首选方案。连接重用基于提供的名称而非IP地址进行,这样如果已有可用连接,cURL就可以跳过解析步骤。
连接重定向选项
–connect-to
当尝试连接到主机时,cURL首先检查是否选择了任何特殊选项,比如这个使cURL在请求连接到主机A时实际解析主机名B的选项。
alt-svc
cURL可能从之前的传输中填充了alt-svc缓存。这基本上是一个特定HTTP版本和主机名到另一个HTTP版本和主机名的映射,在一定时间内有效。这可以将主机名A更改为主机名B。
–resolve
这是一个用给定主机名的一个或多个用户提供的IP地址填充DNS缓存的选项。
DNS解析流程
DNS缓存
在cURL将主机名解析为一组IP地址之前,它会检查是否已在其DNS缓存中拥有该信息,因为这通常比再次请求数据要快得多。条目通常在此缓存中仅保留一分钟就会被清除。
解析过程
当cURL解析主机名时,它需要A、AAAA和HTTPS DNS记录数据。A和AAAA记录提供要尝试连接的IP地址列表,而HTTPS字段提供HTTP版本信息、端口号、ECH配置等。
安全传输机制
HSTS
cURL可能还有一个HSTS缓存,这是另一个映射,用于在内部将纯HTTP访问升级为使用HTTPS。这会更改要使用的协议和默认端口号。
并行连接竞争
根据上述步骤确定的cURL应尝试使用的IP版本和HTTP版本,cURL启动连接竞争,可能包含多个并行连接尝试,每个尝试都在前一个之后稍微延迟启动:
- 基于IPv6的QUIC连接尝试首先启动
- 基于IPv4的QUIC连接尝试作为第二个运行
- 基于IPv6的TCP连接尝试排在第三位
- 基于IPv4的TCP连接尝试排在第四位
当然,如果任何尝试无法完成或失败,它们会立即被跳过,下一个尝试开始。如果前一个连接在特定时间内没有建立,每个尝试也可能启动新的连接。
第一个成功连接到主机的竞争者获胜,其他尝试被快速丢弃。
TLS握手
如果协议是HTTPS(如果选择了HTTP/3,则始终如此),在TCP连接建立后执行TLS握手。对于HTTP/3,TLS握手集成到QUIC连接设置中。
TLS握手可以使cURL重用现有会话、决定ALPN、使用ECH并发送早期数据。
会话ID/票据处理也是cURL持有的一个缓存,允许更快地重新连接到之前连接过的主机。
连接建立
一旦cURL建立了要使用的连接,它就开始发送HTTP请求,从而开始传输。