☰
从输入URL到页面展示:计算机网络基础与HTTP、DNS核心链路拆解
2026/10/25 12:36:46 网站建设 项目流程

简介:面向后端与前端求职者的计算机网络面试复习资料,由代码随想录知识星球八股文体系整理,聚焦高频考点的理解与背诵。内容围绕三次握手与四次挥手、HTTP与HTTPS、DNS域名系统、HTTP缓存等核心概念展开,并把「输入URL后浏览器做了什么」这道超高频题拆为URL解析、DNS解析、TCP连接建立、请求与响应、页面渲染、断开连接等环节,逐段延伸可追问的细节;DNS部分还细讲集中式设计的单点故障、容量与时延弊端、域名层级结构,以及递归查询与迭代查询的区别。资源为单个PDF文件,约37.83MB,按高频重点深入讲解与一问一答补充细碎知识点两条线编排,便于按主题检索、对照面试要点自测。已有778人学习。

1. 从一个回车键说起:计算机基础到底指什么

在地址栏敲下一串网址、按下回车,进度条转半圈,页面就亮起来了。这件事顺滑到没人会多想一秒,可一旦有人问"这中间到底发生了什么",很多人会突然卡住——天天在用,却讲不出一句完整的话。计算机基础指的就是这类知识的总称:它不是某一门课的考纲,而是网络、操作系统、数据结构这些"底下那层"的公共常识,正是这些共识支撑着上层应用运行起来。面试官盯着这些问,并不是在考记忆力,他想确认的是:你遇到问题时,知不知道该往哪一层去查。这份计算机基础篇的整理稿,做的正是把那条链路一段段拆开、标出重点的事。

它最典型的讲法,就是从"在浏览器里输入 URL 并回车之后发生了什么"这一道题开始,因为这一道题几乎能把计算机网络的所有高频概念全部牵出来。

2. 一次回车背后的七步链路:从输入网址到页面亮起来

这道题之所以被反复问,是因为它像一根可以拉长的线,面试官从任意一个点往下拽,都能拽出你想要的方向。答得好,主动权就在你手上;答得糊,后面每一个追问都会变成突然的提问。所以关键不在于背下七个步骤的名字,而在于每一步都能说清楚"为什么必须有这一步"。

2.1 前三步:拆地址、翻通讯录、把连接握起来

浏览器拿到一串地址,比如https://www.example.com/blog/index.html?page=2,第一件事是把它解析清楚。https是协议,决定了后面走的是加密通道还是明文通道;www.example.com是主机名,也就是人记得住的那部分;端口没写就取默认值,http 默认 80,https 默认 443;/blog/index.html是路径,page=2是查询参数。解析完成,浏览器手上就有了一份构造 HTTP 请求所需的全部材料。

但拆完地址并不等于立刻发请求。浏览器会先查看自己的缓存记录,请求头里往往带着If-None-Match、If-Modified-Since这类字段,相当于问服务器一句"我手上这份还能不能用"。能用就直接读本地,网络一个字都不用发。这一步是很多人在答题时漏掉的,可它恰恰是"为什么第二次打开同一个网站快很多"的答案,也是最容易被追问的地方。

接着是 DNS 域名解析。域名是给人看的,机器只认 IP 地址,DNS 就是那本把www.example.com翻译成192.0.2.10的分布式通讯录。查询有先后顺序:先翻浏览器自己的缓存,再看本机 hosts 文件里有没有写死,都没有才去问本地 DNS 服务器,一路问到根、顶级域、权威服务器。这一整段链条是后面第 3 章的主角,这里先记住它的存在就够了。

拿到 IP 之后,才是三次握手。客户端先发一个 SYN,意思是"我想连你,我的初始序号是 x";服务端回一个 SYN+ACK,意思是"收到了,我的初始序号是 y,确认你的 x";客户端再回一个 ACK,"收到你的 y"。三步走完,双方都各自确认了两件事:我能发、你能收;你能发、我能收。

那为什么是三次,不是两次?因为如果只握两次,服务端发完 SYN+ACK 就单方面认为连接建好了,可它根本不知道客户端有没有收到这个报文。万一这个报文在网络里丢了,客户端会以为自己没连上,继续重发 SYN,服务端那边却已经占着一份连接资源干等——白白浪费。第三次 ACK 的价值就在于让服务端确认"对方确实收到了我的确认",这是一次成本极低却能消除歧义的补充确认。

至于为什么不是四次,答案更简单:服务端的 SYN 和 ACK 可以合并成一个报文发出去,没有拆开的必要。次数不是玄学,是被"能不能合并"决定的,这一点和第 2.3 节要讲的四次挥手刚好形成对照。

顺着"第一次握手丢了会怎样"继续往下想,也很能说明问题。客户端的 SYN 没到达服务端,它等不到 SYN+ACK,就会超时重传,重传间隔通常按指数退避拉长——1 秒、2 秒、4 秒这样翻倍,重传到一定次数还不行,就报连接超时。还有一种更绕的情况:客户端发的 SYN 到了,服务端回的 SYN+ACK 丢了,客户端重传 SYN,服务端会以为自己上次那个报文没被收到,于是再发一次。这类细节面试官很爱问,因为背过的人答不出。

还有一个常见的追问是"握手过程中能不能携带数据"。前两次不行,连接还没建立,带了也没人处理;第三次握手可以带,因为此时客户端已经确认链路通畅。这个知识点本身很小,但能答出来,说明你理解的是握手的目的,而不是三个报文的名称。

2.2 后四步:发请求、收响应、画页面、说再见

连接建好后,浏览器把构造好的请求报文发出去。一个最简的请求长这样:

GET /blog/index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html Accept-Encoding: gzip, deflate, br If-None-Match: "a1b2c3" Connection: keep-alive

第一行是请求行,三个部分:方法、路径、协议版本。Host决定了同一台服务器上你要访问哪个站点,虚拟主机全靠它区分。Accept-Encoding告诉服务器"我支持这些压缩格式",服务器才好决定用哪种方式压缩响应体,这也是响应头里出现Content-Encoding的原因。If-None-Match是协商缓存的凭证,服务器拿它和自己手上的版本比对,一致就返回 304,让浏览器继续用本地那份。Connection: keep-alive表示这条 TCP 连接别急着关,后面还要接着用。

服务器收到请求,交给对应的处理程序,返回响应报文。响应里最值得关注的是状态码:200 表示一切正常,301 和 302 是重定向,一个永久一个临时,304 表示"你本地那份还能用",404 是资源不存在,500 是服务端自己出错了。响应头里还常常带Cache-Control说明这份资源能缓存多久,带Set-Cookie让浏览器存下身份凭证。

浏览器拿到 HTML 之后开始渲染。HTML 被解析成一棵 DOM 树,CSS 被解析成 CSSOM,两棵树合成渲染树,然后计算每个元素的位置和大小,这一步叫布局,最后把像素画到屏幕上。这里有个容易被追问的区分:如果改动的是元素的尺寸、位置这类几何属性,浏览器得重新算一遍布局,叫回流;如果只改颜色、背景这类不影响布局的属性,重新画一遍就行,叫重绘。回流代价比重绘大得多,所以前端优化里常说"少动布局,多用 transform"。另外,<script>标签会阻塞 HTML 解析,这也是它通常被放在页面底部,或者加上defer、async的原因。

页面显示出来还不算完,连接要断开,走的是四次挥手。客户端发 FIN,"我这边没数据要发了";服务端回 ACK,"知道了";等服务端把剩下的数据也发完,再发一个 FIN,"我这边也发完了";客户端回最后一个 ACK,连接正式关闭。

为什么挥手要四次,握手只要三次?因为 TCP 是全双工的,两个方向的数据流要分别关闭。服务端收到客户端的 FIN 时,很可能自己还有数据没发完,所以只能先回一个 ACK 表示"收到你的关闭请求",等数据发完了再单独发 FIN。这两个动作没法合并,所以多了一次。对比一下握手就很清楚:握手时服务端没有"还没发完的数据"这层顾虑,SYN 和 ACK 可以合在一个报文里。

最后一个 ACK 发完之后,客户端还要进入 TIME_WAIT 状态,等 2MSL 才真正关闭。等的原因有两个:万一最后那个 ACK 丢了,服务端会重发 FIN,客户端还有机会再回一次;同时让这条连接上残留的报文在网络里自然消失,不至于串到后面一条用相同端口的新连接上去。

2.3 七步只是骨架,真正考的是延伸能力

把七步背下来,只是拿到了入场券。这道题的价值在于它是一条主干,每个节点都能长出一串分支:从 URL 解析能聊到 HTTP 缓存策略,从 DNS 能聊到递归与迭代的区别,从三次握手能聊到 SYN 洪泛和半连接队列,从 HTTP 请求能聊到 HTTPS 的加密过程,从渲染能聊到回流重绘和浏览器的事件循环。

所以答这道题有个很实用的策略:先按七步给一个完整但简洁的骨架,再主动挑一个自己最有把握的点展开一两句深一点的细节。这等于告诉面试官"往这个方向问,我接得住"。反过来,如果七步只是机械念完,中间不留任何可以停留的地方,面试官只能自己找地方切进去,那切到哪儿就不由你决定了。我见过不少人把这七步背得滚瓜烂熟,却在"第二次握手丢了会怎样"这种追问上卡住,问题就出在只记了流程,没记每一步存在的理由。

3. DNS 为什么不能只用一台服务器:域名到 IP 的翻译链条

3.1 DNS 是什么:互联网的通讯录

打个比方,DNS 就像手机通讯录。你按名字找人,手机负责把名字换成号码拨出去。你不会去记每个人的十一位数字,因为记不住,也没必要。DNS 干的是同一件事:把www.example.com这样的域名翻译成192.0.2.10这样的 IP 地址,让机器能互相找到。

域名的写法自带层级。www.server.com里那些句点就是层次的分界线,而且越靠右层级越高。.com是顶级域,server.com是二级域,www是最左边的主机名。这个方向和日常写地址刚好相反——我们写地址是从大到小,域名也是从大到小,只不过是从右往左读。搞清这个方向,后面理解解析顺序才不会乱。

为什么当初要设计成分布式?因为集中式的方案有四个绕不过去的坑。

3.2 集中式的四个坑:为什么一台服务器撑不住

第一是单点故障。全世界的域名解析都压在一台机器上,它一崩,整个网络就跟着瘫。这不是性能问题,是可用性问题,而且没有任何补救余地。

第二是通信容量。一台服务器要处理全球的查询请求,量级是每秒上百万甚至上千万次。这个数量不是靠堆硬件能解决的,网络带宽和单机处理能力都有物理上限。

第三是距离带来的时延。一台服务器不可能离所有人都近。假设它架在某个洲,另一个洲的用户查一次域名,请求要在低速拥堵的链路上来回跑,光是往返时延就够把页面加载拖慢一大截。这和内容分发要就近部署是同一个道理。

第四是维护。这么一份关键数据要频繁更新,还要保证不出错,集中维护的成本和风险都被放大到不可接受。

分布式的思路就是把这份通讯录拆开,按层级分给不同的服务器管:根服务器只管".com该问谁",顶级域服务器只管"server.com该问谁",权威服务器才真正存着某个域名对应的 IP。任何一台出问题,影响面都被限制在一个局部,而且每台服务器只承担自己那一份查询量,离用户也更近。

3.3 一次完整解析要经过几道手

从你敲下回车到拿到 IP,中间大概是这样一条路:

先是浏览器缓存。浏览器会把自己解析过的域名记一段时间,命中就直接用。其次是操作系统层面的 hosts 文件,这是个可以手工写死域名和 IP 对应关系的小文件,本地开发时改它比等 DNS 生效快得多。这两层都没命中,才向本地 DNS 服务器发查询——它一般由你的网络服务提供商维护,也可能是一个公共 DNS 服务。

本地 DNS 服务器收到请求,先看自己有没有缓存。有就直接返回;没有,就开始往上问。它先问根服务器,根服务器不负责具体解析,但它知道各个顶级域该找谁,于是回一个".com你去问那台"。本地 DNS 再问顶级域服务器,对方同样不解析具体域名,只告诉它"server.com归那台权威服务器管"。最后问到权威服务器,那里才真正存着域名和 IP 的映射关系,查到之后把结果回给本地 DNS。本地 DNS 把结果转给浏览器,同时自己留一份缓存,下次别人再问就快得多。

这条链路上每一层都有缓存,缓存都有有效期,也就是 TTL。TTL 设得长,解析快但改记录生效慢;设得短,切换灵活但查询压力大。做上线切换时遇到"域名改了但部分地区还访问旧地址",多半就是 TTL 在起作用——这是很典型的踩坑现场。

3.4 递归查询和迭代查询:谁在替你跑腿

这两个词最容易背串,因为它们的差别不在"查什么",而在"谁在跑"。

递归查询是"你托人办事,办到底"。客户端只发一次请求,然后等着,中间的来回奔波全部由被委托的那台服务器负责,最后给你一个确定的结果。日常用户到本地 DNS 服务器走的就是递归:你只问一次,本地 DNS 负责把答案拿回来。

迭代查询是"你问路,对方只告诉你下一站"。客户端每问一次,得到的是一台更具体的服务器地址,然后自己再去问下一台,一站一站往下走,直到问出结果。本地 DNS 服务器到根、顶级域、权威服务器之间的查询就是迭代。

用一句话记住分工:普通客户端用递归,省事;DNS 服务器之间用迭代,因为每台服务器只知道自己那一层的下一跳,让它替别人跑完全程既不合理也不现实。

对比项递归查询迭代查询
谁在跑腿被委托的服务器跑完全程查询方自己一站站问
请求次数客户端只发一次客户端发多次
结果直接给最终 IP给下一跳服务器地址
典型场景客户端到本地 DNS本地 DNS 到根/顶级/权威

4. HTTP 为什么要一路改版:从 1.1 到 3.0 的性能账本

4.1 HTTP 的性格:简单、灵活,以及无状态带来的麻烦

HTTP 的基本报文格式就是 header 加 body,头部是 key-value 形式的纯文本,看一眼就大概知道在说什么,这是它"简单"的地方。它的各个组成部分也没有被写死:请求方法、URI、状态码、头字段都允许自行扩展,所以它能从最早的网页文档传输,一路长成今天承载各种接口的东西。HTTP 工作在应用层,下面换成什么传输方式它原则上不太关心——HTTPS 就是在它和 TCP 之间插了一层安全传输层,HTTP/3 干脆把底下的 TCP 换成了基于 UDP 的 QUIC。

但它的性格里也有三个明显的短板。一是无状态:服务器不记得你上一次请求是谁发的,好处是不用为每个用户占资源,坏处是做有关联的操作时非常别扭。解决办法里最简单的是 Cookie,在请求和响应报文里带上一点标识,让服务器能把几次请求认成同一个人。二是明文传输:信息在网络里是能直接读的,用浏览器的开发者工具或者抓包软件都能肉眼看清。这在调试时是极大的便利,但也意味着内容容易被窃取。三是不验证身份、不保证完整性:通信双方不确认对方是谁,报文有没有被改过也无从证明。

这三个短板合起来,就是"不安全"这三个字的具体含义。HTTPS 的思路是在 HTTP 和 TCP 之间加一层 SSL/TLS,把明文变密文、把身份验证起来、把完整性校验加上,三个问题一起解决。

4.2 HTTP/1.1:长连接救了场,队头阻塞又拖后腿

最早的 0.9 版本只支持 GET,没有请求头,服务器只能返回 HTML。1.0 是第一个正式版本,引入了请求头和响应头,支持多种方法和状态码,但有个硬伤:不支持持久连接,每个请求都要重新建一次 TCP 连接。想想一次握手要几个往返,一个页面又有几十个资源,这个开销有多大。

1.1 最重要的改进就是长连接。只要客户端和服务器任意一端没有明确提出断开,TCP 连接就保持住,后续请求接着用。这一下省掉了大量重复握手的成本。

它还提出了管道化:在同一个连接里,客户端发完第一个请求不必等响应,就可以把第二个请求也发出去。听起来很美好,但服务器必须按接收顺序返回响应,如果第一个请求处理得慢,后面的全被堵住,这就是队头阻塞。

所以准确地说,1.1 的管道化解决了请求侧的队头阻塞,没解决响应侧的。而且管道化在实际中并没有默认开启,浏览器基本都不支持它——这是一个典型的"书上写了、现实里没落地"的知识点,答的时候如果只背"1.1 有管道化",很容易被追问到卡壳。

1.1 剩下的问题还有几个:头部冗余,每个请求都带一堆重复的头部字段,浪费带宽;响应必须按请求顺序来,前面慢后面就等着;没有请求优先级控制,重要的请求和次要的请求排一样长的队;请求只能由客户端发起,服务器没法主动推东西。

4.3 HTTP/2:把文本换成二进制,用 Stream 做并发

HTTP/2 建立在对 1.1 的兼容之上,同时从几个方向一起下手。

头部压缩用的是 HPACK 算法,由三部分组成:静态表、动态表和 Huffman 编码。静态表把高频出现的头部字段和值预先编号,写死在协议里,一共 61 组,不会变。客户端和服务器各自维护一份,发送时不再传字符串,只传索引号,长度从十几个字节压到一个字节。动态表则针对同一条连接上重复出现的头部,第一次传完整内容,后续只传索引。Huffman 编码负责把剩下的字面量再压一遍。

# HPACK 静态表节选(示意,非完整表) static_table = { 1: (":authority", ""), 2: (":method", "GET"), 3: (":method", "POST"), 4: (":path", "/"), 5: (":path", "/index.html"), 6: (":scheme", "http"), 7: (":scheme", "https"), # ... 共 61 组 } def encode_header(name, value): # 命中静态表时只发索引号,1 个字节搞定 # 未命中则先查动态表,再不行才用 Huffman 编码发字面量 for idx, (n, v) in static_table.items(): if n == name and (v == value or v == ""): return idx return None

这段示意代码只说明一件事:压缩的本质是"用编号代替字符串"。真实实现要复杂得多,但理解到这个程度就够答题了。

动态表有个前提:必须在同一条连接上重复传输完全相同的头部,否则建不起来。而动态表越大会占用越多内存,服务器性能会受影响,所以常见的 Web 服务器都提供类似http2_max_requests的配置,限制一条连接上能传多少个请求,到上限就关闭连接释放内存。这个参数名值得记一下,它能把你从"背概念"拉到"知道实际部署时怎么权衡"。

第二个改进是二进制帧。1.1 的报文是纯文本,解析起来要处理各种分隔符和大小写;2.0 把数据切成二进制帧,用位运算就能高效解析。协议定义了十种帧类型,大致分两类:头信息帧装压缩后的头部,数据帧装包体。每个帧带一个流标识符,标明它属于哪条流,接收方靠这个 ID 把乱序到达的帧重新拼回完整消息。

第三个是并发传输,也是 2.0 最核心的设计。这里有三层概念要分清:Stream 是一条逻辑上的双向通道,Message 是一次完整的请求或响应,Frame 是最小的传输单位。一条 TCP 连接上可以跑多个 Stream,每个 Stream 有唯一 ID,不同 Stream 的帧可以乱序发送,接收端再按 Stream ID 组装。这样一来,应用层的队头阻塞就解决了——某个请求慢,不会挡住别的请求。

第四个是服务器推送。客户端请求 HTML 时,服务器可以主动把 CSS 一起推过去,省掉一次往返。这个功能听起来很美,但实际收益要看场景,推错了反而浪费带宽,所以后来的实践中用得比较克制。

HTTP/2 还有流控制、流状态、依赖关系等机制,都属于更细的层面。

但 2.0 并没有彻底解决队头阻塞,只是把战场从应用层挪到了传输层。TCP 是字节流协议,它必须保证收到的字节完整且连续,内核才会把数据交给应用。只要前面有一个字节没到,后面收到的数据只能先堆在缓冲区里等着。对于 HTTP/2 来说,这意味着一条连接上所有 Stream 的数据都被同一个 TCP 连接捆在一起,一个包丢了,所有流一起等。用得越激进——连接复用得越彻底——这个问题的杀伤力越大。

4.4 HTTP/3:问题出在 TCP,那就换掉 TCP

既然队头阻塞的根子在 TCP 的有序字节流,那最彻底的解法就是不动 HTTP 的语义,只换底下的传输方式。HTTP/3 把 TCP 换成了基于 UDP 的 QUIC。

UDP 本身不可靠、不保序,听起来是倒退,但正因为如此,可靠性可以在用户态重新实现,而且实现得更聪明:QUIC 在传输层就实现了按流独立的可靠传输,一条流丢包只影响这一条流,其他流照常交付。这就在传输层解决了 HTTP/2 遗留的队头阻塞。

QUIC 还把加密握手和传输握手合并,减少了建立连接的往返次数,重连时甚至可以做到零往返。这对移动网络下频繁切换网络、反复重连的场景意义很大。

代价是 UDP 在一些网络环境里会被限制或限速,这让 HTTP/3 的实际部署比理论上的推进慢一些。但只要理解了"换掉 TCP 是为了摆脱字节流的强顺序约束"这一层,剩下的细节都可以顺着推出来。

4.5 四个版本放在一起看

版本连接方式主要改进遗留问题
HTTP/1.0每次请求新建连接引入请求头、响应头、状态码连接开销极大
HTTP/1.1长连接持久连接、管道化(实际未普及)响应侧队头阻塞、头部冗余、无优先级
HTTP/2单连接多 Stream头部压缩、二进制帧、并发、服务器推送TCP 层队头阻塞
HTTP/3QUIC over UDP按流独立可靠传输、握手往返更少部分网络对 UDP 有限制

5. 易混概念排查:五个最容易背串的知识点

5.1 误区一:握手三次、挥手四次,记住数字就够了

易混点在于,很多人把"3"和"4"当成两个需要硬背的常量,却不知道它们从哪来,一追问就露怯。会混是因为这两个数字太短、太好记,口诀一背就过去了。

真正的区分点是"能不能合并"。握手时服务端要回两件事:确认收到对方的 SYN(ACK),以及发出自己的 SYN。这两件事没有先后依赖,可以塞进一个报文,所以是三次。挥手时服务端收到客户端的 FIN,只能先回 ACK 表示收到,因为它可能还有数据没发完;等数据发完才能发自己的 FIN,这两个动作有先后顺序,不能合并,所以是四次。记住"能不能合并",比记住数字稳得多。

5.2 误区二:HTTP/1.1 的队头阻塞和 HTTP/2 的队头阻塞是一回事

名字一样,位置完全不同。1.1 的队头阻塞发生在应用层:响应必须按请求顺序返回,前面慢后面全等。2.0 把这个问题解决了,因为不同 Stream 的帧可以乱序发、乱序收。但 2.0 又冒出一个新的:多个 Stream 复用一条 TCP 连接,TCP 要求字节有序,前面缺一个字节,后面所有流的数据都卡在内核缓冲区里。

会混是因为两者都叫"队头阻塞",而且都表现为"后面的请求被前面的拖住"。区分的方法看层级:1.1 卡在"响应的顺序",2.0 卡在"字节的顺序"。前者靠 Stream 复用解决,后者只能靠换掉 TCP 解决,这也是 HTTP/3 存在的全部理由。

顺带说一句,1.1 的管道化常常被误认为解决了队头阻塞。它只解决了请求侧——请求可以先发出去,但响应侧仍然严格按序,问题依然存在,而且浏览器基本没实现它。这条血泪经验值得记住:协议里写了,不等于现实里能用。

5.3 误区三:递归查询和迭代查询,只是叫法不同

这两个概念的字面意思太接近,很容易混成"都是查询的两种说法"。真正的区别是"谁在干活":递归是委托方跑完全程,最后给你一个确定答案;迭代是你自己一站站问,每次只拿到下一站的地址继续问。

之所以会混,是因为在完整的 DNS 解析链路里,这两种方式同时存在,而且衔接得很自然。客户端到本地 DNS 是递归——你只发一次请求,本地 DNS 负责把结果找回来;本地 DNS 到根、顶级、权威是迭代——它每问一次拿到一个更具体的去处,再自己接着问。把"角色"和"环节"对上号,就不会再串。

5.4 误区四:强缓存和协商缓存,都是缓存所以差不多

差别在于"谁说了算"。强缓存是浏览器自己判断,看Cache-Control的max-age或者老一点的Expires,在有效期内直接读本地,一个请求都不发,开发者工具里显示的是 from disk cache 或 from memory cache。协商缓存是浏览器拿不准,带着If-None-Match或If-Modified-Since去问服务器,服务器比对之后回 304 表示"还能用",或者回 200 加新内容。

会混是因为两者最终效果都是"用了本地的东西",但过程完全不同:一个不发请求,一个发了请求但可能只回一个头部。区分的关键看有没有和服务器发生一次往返。另外要留意Expires是绝对时间,受客户端时钟影响;Cache-Control是相对秒数,更可靠,这也是后者逐渐取代前者的原因。做发布上线时遇到"用户看到的还是旧版本",第一件事就是查这两个头部的配置。

5.5 误区五:HTTP 无状态,所以它也不保持连接

这是两个被中文翻译搅在一起的词。无状态说的是 HTTP 协议本身不记录请求之间的上下文,服务器处理完一个请求就把这个请求忘了,下一次请求对服务器来说都是全新的。这跟 TCP 连接有没有被复用完全是两码事。

HTTP/1.1 引入了长连接,一条 TCP 连接可以承载很多次 HTTP 请求,但 HTTP 依旧是无状态的——服务器不会因为连接还在,就记得你上一次请求问了什么。要维持"这个人已经登录了"这种状态,得靠 Cookie、Session、Token 这些额外机制。把"连接"和"状态"分开看,这一整块就不会再糊涂。

6. 什么时候该翻这份计算机基础资料,什么时候别指望它

判断标准其实很清楚:它解决的是"概念讲不清、答题没结构"的问题,不解决"动手做不出来"的问题。

先看适合的情况。如果你正在准备技术面试,尤其是后端或前端的岗位,网络这块是绕不开的,三次握手、四次挥手、HTTP 各版本、DNS 解析这几块几乎每场都会碰到,那这份资料的组织方式就很对口——它把高频重点和细碎知识点分成两块,重点区把复杂过程拆开讲,一问一答区补上边角料,你答完主干还能顺手补两句细节。如果你已经能背下名词,但被追问"为什么"就卡住,那更适合,因为它重点铺的就是过程和图解,不是名词清单。

再看不适合的情况。如果你想学抓包实操、想看真实网络请求怎么分析,这份资料帮不上忙,它偏讲解不偏动手,你得自己去开浏览器开发者工具。如果你要深入 TCP 拥塞控制、滑动窗口的算法细节,那属于另一个专题,这里只会带到门口。如果你的目标是学某个框架或者背某门语言的语法,方向也完全不同——这是计算机基础的整理,不是语言教程。

你的处境适不适合原因
面试在即,网络概念答不成句适合按链路组织,能直接转成答题结构
背得出名词,答不出为什么适合重点讲过程与因果,不是名词表
想练抓包和真机调试不适合偏概念讲解,不含实操步骤
想深挖 TCP 算法与内核实现不适合只覆盖到面试所需的深度
想系统补一门语言的语法不适合属于计算机基础范畴,不是语言教程

给自己一个更具体的用法建议:先拿"输入网址到页面出现"这道题当索引,从头默讲一遍,讲不顺的地方就是当天的复习清单,翻到对应章节把那一段读透,再回来重讲一次。这样过一遍,比顺着 PDF 从头读到尾效率高得多,因为你是按自己的漏洞在补,不是按目录在扫。

我自己的习惯是这样来的:早些年准备面试,我贪多,把资料从头翻到尾,合上之后脑子里只剩一堆零散的词,被问到"为什么三次不是两次"当场愣住,那次的结果不太好看。从那以后我每次准备面试,都强制自己先把那条七步链路默写一遍,写不出来的地方标红,只补标红的那几段,其他的先放着。这么干了几轮之后我发现,能讲清楚一条完整链路,比背下十个孤立的概念管用得多——面试官要的从来不是你知道多少名词,而是你能不能在一条线上把它们串起来讲明白。

这份计算机基础篇是九份整理稿里的一册,网络部分占了大头,DNS、HTTP 各版本、缓存机制都在里面,配合另外几册一起看,覆盖面会更完整。如果你正卡在"知道有这回事但讲不清"的阶段,把它存下来,按上面这条链路的顺序过一遍,比零散地搜答案省力。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询