feat: add 180 questions (90 sc + 90 fb) for networking subtopics
Deploy Examination / deploy (push) Successful in 31s
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
This commit is contained in:
@@ -0,0 +1,197 @@
|
||||
{
|
||||
"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": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"slug": "domain-sharding",
|
||||
"name": "Domain Sharding",
|
||||
"description": "",
|
||||
"tags": [
|
||||
"DNS解析",
|
||||
"DNS配置",
|
||||
"HTML",
|
||||
"HTTP/2",
|
||||
"TCP连接",
|
||||
"TLS",
|
||||
"前端实现",
|
||||
"域名分片",
|
||||
"域名分片淘汰",
|
||||
"多路复用",
|
||||
"子域名",
|
||||
"子域名数量",
|
||||
"并行连接",
|
||||
"性能开销",
|
||||
"最佳实践",
|
||||
"服务器",
|
||||
"服务器部署",
|
||||
"浏览器限制",
|
||||
"缓存碎片化",
|
||||
"计算"
|
||||
],
|
||||
"difficulty_range": [
|
||||
1,
|
||||
3
|
||||
],
|
||||
"schema_version": "1.0.0",
|
||||
"updated": "2026-09-02",
|
||||
"question_files": [
|
||||
"single_choice",
|
||||
"fill_blank"
|
||||
],
|
||||
"stats": {
|
||||
"total": 20,
|
||||
"by_type": {
|
||||
"single_choice": 10,
|
||||
"fill_blank": 10
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
{
|
||||
"topic": "domain-sharding",
|
||||
"type": "single_choice",
|
||||
"schema_version": "1.0.0",
|
||||
"generated": "2026-09-02T21:20:00+08:00",
|
||||
"questions": [
|
||||
{
|
||||
"id": "sc-001",
|
||||
"type": "single_choice",
|
||||
"difficulty": 2,
|
||||
"tags": [
|
||||
"域名分片",
|
||||
"浏览器限制"
|
||||
],
|
||||
"question": "浏览器对同一域名最多同时开多少个 TCP 连接?",
|
||||
"options": {
|
||||
"A": "2 个",
|
||||
"B": "4 个",
|
||||
"C": "6 个",
|
||||
"D": "10 个"
|
||||
},
|
||||
"answer": "C",
|
||||
"explanation": "浏览器对同一域名最多同时开 6 个 TCP 连接,这是浏览器厂商的经验值,不是协议规定。这个限制在 HTTP/2 时代已经过时。",
|
||||
"source": null,
|
||||
"related": []
|
||||
},
|
||||
{
|
||||
"id": "sc-002",
|
||||
"type": "single_choice",
|
||||
"difficulty": 3,
|
||||
"tags": [
|
||||
"域名分片",
|
||||
"原理"
|
||||
],
|
||||
"question": "域名分片的原理是什么?",
|
||||
"options": {
|
||||
"A": "增加服务器数量",
|
||||
"B": "用多个子域名指向同一服务器,每个域名都能开 6 个连接",
|
||||
"C": "使用 HTTP/2 协议",
|
||||
"D": "增大 TCP 窗口"
|
||||
},
|
||||
"answer": "B",
|
||||
"explanation": "域名分片用多个子域名指向同一台服务器,每个域名都能开 6 个连接。例如 3 个子域名 × 6 个连接 = 18 个并行连接。",
|
||||
"source": null,
|
||||
"related": []
|
||||
},
|
||||
{
|
||||
"id": "sc-003",
|
||||
"type": "single_choice",
|
||||
"difficulty": 3,
|
||||
"tags": [
|
||||
"域名分片",
|
||||
"代价"
|
||||
],
|
||||
"question": "域名分片的代价不包括以下哪项?",
|
||||
"options": {
|
||||
"A": "DNS 解析开销",
|
||||
"B": "TLS 握手开销",
|
||||
"C": "缓存碎片化",
|
||||
"D": "加密失败"
|
||||
},
|
||||
"answer": "D",
|
||||
"explanation": "域名分片的代价包括:DNS 解析开销(每个子域名都要单独解析,5-50ms)、TLS 握手开销(每个新域名要单独做 TLS 握手)、缓存碎片化(不同域名的缓存独立,不能共享)。",
|
||||
"source": null,
|
||||
"related": []
|
||||
},
|
||||
{
|
||||
"id": "sc-004",
|
||||
"type": "single_choice",
|
||||
"difficulty": 4,
|
||||
"tags": [
|
||||
"域名分片",
|
||||
"HTTP/2"
|
||||
],
|
||||
"question": "为什么 HTTP/2 不需要域名分片?",
|
||||
"options": {
|
||||
"A": "HTTP/2 支持更多连接",
|
||||
"B": "HTTP/2 的多路复用让一个 TCP 连接就能真正并行",
|
||||
"C": "HTTP/2 自动分片",
|
||||
"D": "HTTP/2 使用 UDP"
|
||||
},
|
||||
"answer": "B",
|
||||
"explanation": "HTTP/2 的多路复用让一个 TCP 连接就能真正并行处理多个请求/响应,不再需要多个 TCP 连接来并行,域名分片变成了负优化。",
|
||||
"source": null,
|
||||
"related": []
|
||||
},
|
||||
{
|
||||
"id": "sc-005",
|
||||
"type": "single_choice",
|
||||
"difficulty": 2,
|
||||
"tags": [
|
||||
"域名分片",
|
||||
"实现"
|
||||
],
|
||||
"question": "域名分片的实现方式是什么?",
|
||||
"options": {
|
||||
"A": "修改服务器配置",
|
||||
"B": "前端 HTML 里把资源 URL 的域名换掉",
|
||||
"C": "使用 CDN",
|
||||
"D": "修改 DNS 解析"
|
||||
},
|
||||
"answer": "B",
|
||||
"explanation": "域名分片只需在前端 HTML 里把资源 URL 的域名换掉(如 img1.example.com、img2.example.com),服务器端不用改动,所有子域名 DNS 解析到同一台机器就行。",
|
||||
"source": null,
|
||||
"related": []
|
||||
},
|
||||
{
|
||||
"id": "sc-006",
|
||||
"type": "single_choice",
|
||||
"difficulty": 4,
|
||||
"tags": [
|
||||
"域名分片",
|
||||
"缓存"
|
||||
],
|
||||
"question": "域名分片导致缓存碎片化的原因是什么?",
|
||||
"options": {
|
||||
"A": "缓存服务器过载",
|
||||
"B": "不同域名的缓存独立,不能共享",
|
||||
"C": "DNS 缓存过期",
|
||||
"D": "TLS 握手失败"
|
||||
},
|
||||
"answer": "B",
|
||||
"explanation": "域名分片导致缓存碎片化,因为不同域名的缓存独立,不能共享,可能重复下载相同资源。这是域名分片的主要代价之一。",
|
||||
"source": null,
|
||||
"related": []
|
||||
},
|
||||
{
|
||||
"id": "sc-007",
|
||||
"type": "single_choice",
|
||||
"difficulty": 3,
|
||||
"tags": [
|
||||
"域名分片",
|
||||
"数量"
|
||||
],
|
||||
"question": "域名分片的子域名数量一般是多少?",
|
||||
"options": {
|
||||
"A": "1-2 个",
|
||||
"B": "3-4 个",
|
||||
"C": "10-20 个",
|
||||
"D": "越多越好"
|
||||
},
|
||||
"answer": "B",
|
||||
"explanation": "域名分片的子域名数量一般 3-4 个就够了。过多子域名意味着更多 DNS 查询和 TLS 握手,反而拖慢加载速度。",
|
||||
"source": null,
|
||||
"related": []
|
||||
},
|
||||
{
|
||||
"id": "sc-008",
|
||||
"type": "single_choice",
|
||||
"difficulty": 2,
|
||||
"tags": [
|
||||
"域名分片",
|
||||
"DNS"
|
||||
],
|
||||
"question": "域名分片中,所有子域名的 DNS 解析应该指向什么?",
|
||||
"options": {
|
||||
"A": "不同的服务器",
|
||||
"B": "同一台机器",
|
||||
"C": "CDN 节点",
|
||||
"D": "负载均衡器"
|
||||
},
|
||||
"answer": "B",
|
||||
"explanation": "域名分片中所有子域名的 DNS 解析应该指向同一台机器,服务器端不用改动。前端只需把资源 URL 的域名换掉。",
|
||||
"source": null,
|
||||
"related": []
|
||||
},
|
||||
{
|
||||
"id": "sc-009",
|
||||
"type": "single_choice",
|
||||
"difficulty": 4,
|
||||
"tags": [
|
||||
"域名分片",
|
||||
"HTTP/2",
|
||||
"负优化"
|
||||
],
|
||||
"question": "在 HTTP/2 站点上使用域名分片会导致什么?",
|
||||
"options": {
|
||||
"A": "性能提升",
|
||||
"B": "负优化——多了 DNS 和 TLS 开销,还破坏了缓存统一性",
|
||||
"C": "没有影响",
|
||||
"D": "自动降级到 HTTP/1.1"
|
||||
},
|
||||
"answer": "B",
|
||||
"explanation": "HTTP/2 的多路复用让域名分片变成了负优化——多了 DNS 和 TLS 开销,还破坏了缓存统一性。如果站点已经上了 HTTP/2,应该去掉域名分片。",
|
||||
"source": null,
|
||||
"related": []
|
||||
},
|
||||
{
|
||||
"id": "sc-010",
|
||||
"type": "single_choice",
|
||||
"difficulty": 3,
|
||||
"tags": [
|
||||
"域名分片",
|
||||
"演进"
|
||||
],
|
||||
"question": "HTTP 连接复用的演进中,域名分片出现在哪个阶段?",
|
||||
"options": {
|
||||
"A": "HTTP/1.0 之前",
|
||||
"B": "HTTP/1.1 + Keep-Alive 之后,HTTP/2 之前",
|
||||
"C": "HTTP/2 之后",
|
||||
"D": "HTTP/3 之后"
|
||||
},
|
||||
"answer": "B",
|
||||
"explanation": "域名分片是 HTTP/1.1 时代的 hack,出现在 HTTP/1.1 + Keep-Alive 之后,HTTP/2 之前。HTTP/2 的多路复用从根本上解决了这个问题。",
|
||||
"source": null,
|
||||
"related": []
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user