df63692a18
Deploy Examination / deploy (push) Successful in 31s
Cover 9 subtopics from the computer networking documentation: - http-handshake: TCP/TLS/HTTP2/HTTP3 handshakes - http-connection-cost: connection resource overhead & million concurrency - connection-pooling: pool reuse, HTTP/1.1 vs HTTP/2 - http-keepalive: Keep-Alive principle, head-of-line blocking - keepalive-scenarios: when to enable/disable Keep-Alive - domain-sharding: HTTP/1.1 hack, HTTP/2 obsolescence - cdn: edge nodes, caching, DDoS protection - cors: same-origin policy, preflight requests - go-build-strip: -s -w flags, binary size optimization
197 lines
8.1 KiB
JSON
197 lines
8.1 KiB
JSON
{
|
|
"topic": "domain-sharding",
|
|
"type": "fill_blank",
|
|
"schema_version": "1.0.0",
|
|
"generated": "2026-09-02T21:20:00+08:00",
|
|
"questions": [
|
|
{
|
|
"id": "fb-001",
|
|
"type": "fill_blank",
|
|
"question": "浏览器对同一域名最多只能同时建立 ____ 个 TCP 连接,这是域名分片技术产生的根本原因。",
|
|
"answer": [
|
|
"6"
|
|
],
|
|
"answer_rule": "any",
|
|
"difficulty": 1,
|
|
"tags": [
|
|
"域名分片",
|
|
"浏览器限制",
|
|
"TCP连接"
|
|
],
|
|
"explanation": "HTTP/1.1 协议下,浏览器对单个域名的并发 TCP 连接数限制为 6 个(Chrome、Firefox 等主流浏览器均遵循此限制)。这一限制会导致页面加载大量资源时出现排队等待,成为性能瓶颈。域名分片正是为了绕过这一限制而产生的优化手段。",
|
|
"source": null,
|
|
"related": []
|
|
},
|
|
{
|
|
"id": "fb-002",
|
|
"type": "fill_blank",
|
|
"question": "域名分片的核心思路是使用 ____ 个子域名,让浏览器误以为是不同域名,从而绕过单域名并发连接数限制。",
|
|
"answer": [
|
|
"多个",
|
|
"多个子域名"
|
|
],
|
|
"answer_rule": "any",
|
|
"difficulty": 1,
|
|
"tags": [
|
|
"域名分片",
|
|
"子域名"
|
|
],
|
|
"explanation": "域名分片(Domain Sharding)通过将资源分布到多个子域名上(如 img1.example.com、img2.example.com),利用浏览器按域名计算并发连接数的规则,使浏览器为每个子域名各分配独立的 TCP 连接池,从而突破单域名 6 连接的上限。",
|
|
"source": null,
|
|
"related": []
|
|
},
|
|
{
|
|
"id": "fb-003",
|
|
"type": "fill_blank",
|
|
"question": "如果使用 3 个子域名进行域名分片,每个子域名有 6 个 TCP 连接,则总共可以实现 ____ 个并行连接。",
|
|
"answer": [
|
|
"18"
|
|
],
|
|
"answer_rule": "any",
|
|
"difficulty": 1,
|
|
"tags": [
|
|
"域名分片",
|
|
"并行连接",
|
|
"计算"
|
|
],
|
|
"explanation": "计算公式非常直接:子域名数量 × 每域名并发连接数 = 总并行连接数。3 个子域名 × 6 个连接/域名 = 18 个并行连接。这意味着页面可以同时下载 18 个资源文件,相比单域名的 6 个连接,吞吐量理论上提升 3 倍。",
|
|
"source": null,
|
|
"related": []
|
|
},
|
|
{
|
|
"id": "fb-004",
|
|
"type": "fill_blank",
|
|
"question": "域名分片会增加额外的 ____ 开销,每次解析耗时约 ____ 毫秒,这是域名分片的主要代价之一。",
|
|
"answer": [
|
|
"DNS解析",
|
|
"5-50"
|
|
],
|
|
"answer_rule": "all",
|
|
"difficulty": 2,
|
|
"tags": [
|
|
"域名分片",
|
|
"DNS解析",
|
|
"性能开销"
|
|
],
|
|
"explanation": "每增加一个子域名就多一次 DNS 查询。首次解析需要向 DNS 服务器递归查询,耗时约 5-50ms(取决于 DNS 服务器距离和网络状况)。虽然浏览器有 DNS 缓存,但首次访问或缓存过期时仍需付出这一延迟。子域名越多,DNS 解析的累积开销越大。",
|
|
"source": null,
|
|
"related": []
|
|
},
|
|
{
|
|
"id": "fb-005",
|
|
"type": "fill_blank",
|
|
"question": "域名分片的代价除了 DNS 解析开销外,还包括 TLS 握手增加和 ____ 碎片化。",
|
|
"answer": [
|
|
"缓存"
|
|
],
|
|
"answer_rule": "any",
|
|
"difficulty": 2,
|
|
"tags": [
|
|
"域名分片",
|
|
"缓存碎片化",
|
|
"TLS"
|
|
],
|
|
"explanation": "域名分片的三大代价:①DNS 解析增加延迟;②每个新子域名都需要独立的 TLS 握手(HTTPS 场景下额外 1-2 个 RTT);③缓存碎片化——浏览器的 HTTP 缓存是按域名隔离的,同一资源分散到不同子域名后无法共享缓存,导致缓存命中率下降,重复下载增多。",
|
|
"source": null,
|
|
"related": []
|
|
},
|
|
{
|
|
"id": "fb-006",
|
|
"type": "fill_blank",
|
|
"question": "使用域名分片时,所有子域名的 DNS 记录应解析到 ____ ,即同一台服务器。",
|
|
"answer": [
|
|
"同一台机器",
|
|
"同一台服务器",
|
|
"同一个IP",
|
|
"同一IP"
|
|
],
|
|
"answer_rule": "any",
|
|
"difficulty": 2,
|
|
"tags": [
|
|
"域名分片",
|
|
"DNS配置",
|
|
"服务器"
|
|
],
|
|
"explanation": "域名分片的目的是欺骗浏览器多开连接,而非真的将资源部署到不同服务器。因此所有子域名(如 img1.example.com、img2.example.com)的 A 记录或 CNAME 应指向同一台服务器(或同一个负载均衡地址)。这样资源还是由同一台机器提供,只是浏览器认为它们来自不同域名而已。",
|
|
"source": null,
|
|
"related": []
|
|
},
|
|
{
|
|
"id": "fb-007",
|
|
"type": "fill_blank",
|
|
"question": "使用域名分片时,子域名数量建议控制在 ____ 个为宜,过多反而得不偿失。",
|
|
"answer": [
|
|
"3-4",
|
|
"3到4"
|
|
],
|
|
"answer_rule": "any",
|
|
"difficulty": 3,
|
|
"tags": [
|
|
"域名分片",
|
|
"最佳实践",
|
|
"子域名数量"
|
|
],
|
|
"explanation": "一般推荐 3-4 个子域名。太少(1-2 个)提升不明显,太多(6+)则 DNS 解析和 TLS 握手的开销会超过并行连接带来的收益,缓存碎片化问题也更严重。3-4 个子域名 × 6 连接 = 18-24 个并行连接,对于大多数页面已经足够,且开销可控。",
|
|
"source": null,
|
|
"related": []
|
|
},
|
|
{
|
|
"id": "fb-008",
|
|
"type": "fill_blank",
|
|
"question": "在前端实现域名分片时,需要在 HTML 中将资源 URL 的域名部分替换为不同的 ____ 来实现。",
|
|
"answer": [
|
|
"子域名"
|
|
],
|
|
"answer_rule": "any",
|
|
"difficulty": 2,
|
|
"tags": [
|
|
"域名分片",
|
|
"前端实现",
|
|
"HTML"
|
|
],
|
|
"explanation": "实现域名分片需要在前端代码层面修改:将原来统一的资源域名(如 static.example.com)替换为多个子域名(如 static1.example.com、static2.example.com)。通常通过配置一个子域名列表,然后在加载图片、JS、CSS 等资源时轮询(round-robin)分配不同子域名。这要求前端构建工具或模板引擎支持动态替换。",
|
|
"source": null,
|
|
"related": []
|
|
},
|
|
{
|
|
"id": "fb-009",
|
|
"type": "fill_blank",
|
|
"question": "HTTP/2 引入了 ____ 技术,允许在一个 TCP 连接上并发传输多个请求和响应,这使得域名分片变得不再必要。",
|
|
"answer": [
|
|
"多路复用",
|
|
"multiplexing"
|
|
],
|
|
"answer_rule": "any",
|
|
"difficulty": 3,
|
|
"tags": [
|
|
"HTTP/2",
|
|
"多路复用",
|
|
"域名分片淘汰"
|
|
],
|
|
"explanation": "HTTP/2 的多路复用(Multiplexing)允许在单个 TCP 连接上同时传输多个请求/响应流,彻底解决了 HTTP/1.1 的队头阻塞问题。既然一个连接就能并行处理所有资源请求,通过域名分片多开连接就失去了意义。加上域名分片的 DNS 开销和缓存碎片化代价,HTTP/2 时代域名分片已被视为反模式。",
|
|
"source": null,
|
|
"related": []
|
|
},
|
|
{
|
|
"id": "fb-010",
|
|
"type": "fill_blank",
|
|
"question": "域名分片的所有子域名最终都需要通过 DNS 解析到 ____ ,资源实际由同一台机器或集群提供服务。",
|
|
"answer": [
|
|
"同一台机器",
|
|
"同一个IP",
|
|
"同一个服务器",
|
|
"同一个地址"
|
|
],
|
|
"answer_rule": "any",
|
|
"difficulty": 1,
|
|
"tags": [
|
|
"域名分片",
|
|
"DNS解析",
|
|
"服务器部署"
|
|
],
|
|
"explanation": "域名分片的本质是一种「欺骗」浏览器的技巧:虽然使用了不同的子域名,但这些子域名的 DNS 记录最终都指向同一台服务器(或同一个 CDN 地址/负载均衡器)。资源并没有真正分散部署,只是利用浏览器按域名分配连接池的机制来获得更多的并发下载通道。",
|
|
"source": null,
|
|
"related": []
|
|
}
|
|
]
|
|
} |