DNS解析与HTTP请求全链路详解:从输入网址到页面显示

发布时间:2026/10/19 17:20:13
DNS解析与HTTP请求全链路详解:从输入网址到页面显示 作为一个经常和网络请求打交道的开发者我遇到过不少让人抓狂的问题页面加载慢、请求偶发失败、域名解析到错误的IP。如果对HTTP请求过程和DNS域名解析没有完整的链路理解排查这些问题的时候基本靠猜。所以我想把这条通路完整梳理一遍不绕弯子直接讲清楚数据是怎么走的、每一步在做什么、哪些环节最容易出问题。写这篇内容的目的很单纯给刚入行的前端、后端、运维同学一份能直接对着排查的参考也给自己做一个阶段性的知识复盘。1. 一次浏览器访问背后到底发生了什么你现在在浏览器地址栏输入一个网址按下回车到页面显示出来通常不超过一秒。但就是这一秒不到的时间里浏览器、操作系统、DNS服务器、TCP协议栈、应用服务器之间完成了十几轮交互。想排查性能问题和稳定性问题就得先把这条链路从头到尾捋清楚。整个过程可以粗分成四个大阶段域名解析把网址里的域名转换成对应的IP地址。TCP连接和IP地址指向的服务器建立可靠的传输通道。HTTP请求与响应按照协议规范传送具体的请求报文接收服务端返回的数据。浏览器渲染解析客户端拿到HTML、CSS、JavaScript等资源后构建DOM树、计算样式、执行脚本并绘制页面。这四个阶段里真正由开发者完全掌控的其实不多大部分工作在系统层和浏览器内核里就完成了。但了解每一步做了什么、什么条件下会失败出了问题你才能快速把故障定位到具体环节。这里有一个值得意识到的点现代互联网系统里一次页面访问往往不止一个请求。页面主文档是一个请求后续加载的脚本、样式、图片、字体又会产生几十上百个请求每个请求都可能会重复经历上述流程。所以“慢”不是一个笼统的现象而是一个需要拆开看的复合问题——要么是DNS解析慢要么是TCP建连慢要么是服务端处理慢要么是浏览器渲染被某个阻塞项卡住了。很多开发者在排查慢请求时第一反应是看服务端日志、优化SQL、加缓存但实际上相当比例的慢请求根因在客户端这一侧的网络链路上。反过来也有不少场景前端一顿优化结果发现是某个接口的SSL握手配置有问题。这也是我坚持把DNS和HTTP连在一起讲的原因它们是一个完整故事里的上下集。2. DNS域名解析从人类记忆到机器地址的关键一跳2.1 为什么需要DNS我们平时访问一个网站输入的是便于记忆的网址比如 example.com。但真正通信的网络层协议里设备之间互相找靠的是IP地址比如 192.0.2.1。数字地址对于计算机来说非常友好但对于人来说完全不具备可记忆性。打个简单的比方IP地址像门牌号域名像人名。你不可能记住互联网上几十亿台设备各自的门牌号所以你只需要记住名字然后通过通讯录查出对应门牌号。DNS就是这个覆盖全球的通讯录系统。DNS本身是一个分布式的层级化数据库。注意“分布式”和“层级化”这两个词它们不是形容词而是整个系统能支撑全球规模的根基。没有任何一台服务器能存下全互联网的域名记录也没有任何一个单一节点能扛住全世界的查询流量所以记录被分散到大量不同层级的服务器上查询的时候逐级往上问。2.2 完整的DNS解析链条一次普通的DNS解析从客户端视角看大致经过这些环节浏览器缓存浏览器进程内保存最近解析过的记录命中之后直接用不再发起任何网络请求。操作系统缓存浏览器没命中就调用操作系统的解析能力系统先查本地HOSTS文件和自身维护的DNS缓存。本地DNS服务器操作系统缓存也没命中请求会被转发给当前配置的本地DNS服务器通常是上网时自动获取的运营商DNS或者手动配置的公共DNS。根DNS服务器本地DNS服务器如果不知道答案会先向根域名服务器询问“某个顶级域的权威服务器在哪”。顶级域服务器根服务器返回对应顶级域服务器的地址本地DNS再向顶级域服务器询问“某个具体域名的权威DNS服务器在哪”。权威DNS服务器最后找到这个域名真正的权威DNS服务器拿到具体的记录值比如A记录对应的IP然后逐级返回给客户端。每一层的服务器拿到结果之后都会按照记录自带的TTL字段决定缓存多久。TTL全称Time To Live存活时间它本质上是一个保鲜期。关于解析耗时第一次访问某个域名时完整解析可能耗几十毫秒到上百毫秒不等主要看各级服务器响应速度和网络质量。第二次再访问同一域名因为浏览器缓存、系统缓存已经生效几乎是零耗时的。2.3 TTL与缓存的实际影响TTL这个字段容易被忽略但它对运维和发布流程的影响非常大。比如你做域名切流把网站切到一台新服务器上修改了DNS记录里的IP但用户的本地DNS缓存还没过期他们依然会访问旧IP直到缓存过期才会重新查询。所以圈内共识是做重要域名切换之前提前一到两天把TTL调低。比如从86400秒一天先降到300秒五分钟等旧的缓存基本都过期了再改最终记录值这样切换能最大程度地平滑。如果反过来先改了记录值但TTL还顶着一天那新旧IP同时生效的时间窗口就会很长流量会散乱地分布在两套环境上排查问题和观察监控都会变得很痛苦。我见过不止一次因为TTL没调整就直接改记录结果切流后大范围用户持续访问旧服务器前端反馈半天找不到原因的情况。这类问题一旦发生只能等缓存自然过期没有任何人能强制刷新全网所有递归节点的缓存教训相当沉重。2.4 递归查询与迭代查询的分工递归查询和迭代查询是大家对DNS机制最容易混淆的一对概念这里用一句话分开讲清楚。递归查询发生在客户端和本地DNS服务器之间。客户端把解析请求丢给本地DNS服务器说“你去帮我查查完把最终结果告诉我”中途怎么查、问谁都是本地DNS的事。迭代查询发生在本地DNS服务器和其他DNS服务器之间。本地DNS向根服务器发问根服务器不会直接给它最终答案只会告诉它“这个域名的顶级域服务器地址是哪些你去问它们”。然后本地DNS再向顶级域服务器发问得到“这个域名的权威DNS服务器是哪些”再继续上一级问下去。每级都是给一个“下一步去哪问”的指引而不是替你把结果拿出来。这个设计的价值在于本地DNS服务器面向大量用户能够大量缓存结果减少请求穿透到权威服务器的压力。如果每一次查询都直接打到权威DNS服务器上权威服务器即使扩容再大也扛不住全球的集中流量。3. HTTP请求的完整生命周期3.1 TCP三次握手与四次挥手HTTP本身是应用层协议它的传输可靠性由底层的TCP来保障。TCP是面向连接的、可靠的字节流协议核心目标包括数据不丢失、不乱序、不重复。在任何HTTP请求报文发出去之前客户端和服务端必须先把连接建立起来这个建立过程就是常说的三次握手。三次握手的报文序列是客户端发送一个SYN标志位置1的TCP报文并带上一个初始序列号。服务端收到之后回复SYN加ACK的报文表示“你的同步请求我收到了我也同步一下我的序列号”。客户端再回复一个ACK报文确认双方同步完成。三次握手之所以必须是三次而不是两次核心原因是需要双向确认收发包能力。客户端发了一次SYN如果服务器只回一次SYN而不加ACK那客户端无法确认自己发的SYN是否到达了服务器。三次交互之后双方都知道自己发的包对方能收到对方发的包自己也能收到然后才能放心传数据。连接关闭时的四次挥手也是类似道理因为TCP连接是全双工的两个方向的传输通道需要各自独立关闭。不过在现在的生产环境中HTTP/1.1默认开启Keep-Alive连接复用HTTP/2更进一步引入多路复用一个连接上可以同时跑多个请求所以挥手其实没有想象中那么频繁。真正频繁建连、断连的多半是老代码里没开连接复用或者连接池配置不合理导致的短连接风暴。3.2 HTTP请求报文的结构与字段拆解一次标准的HTTP/1.1 GET请求报文大致是这样GET /index.html HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Accept: text/html,application/xhtmlxml Accept-Encoding: gzip, deflate, br Connection: keep-alive请求行是报文的起始行由三部分组成请求方法、请求URI、协议版本。方法常见的有GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS等每个方法有它自己的语义约定比如GET应该是无副作用的读取POST通常用于提交数据PUT表示整体更新PATCH表示局部更新DELETE表示删除资源。实际开发里有不少人把POST当成万能方法所有操作都用POST这样不太合理因为方法本身就承担了语义RESTful接口设计的合理性对后续维护有很大影响。请求头里最值得关注的是Host字段。HTTP/1.1协议规定请求报文中必须携带Host因为一台服务器IP上可以同时托管多个域名服务端需要靠Host头判断你访问的是哪个虚拟主机。如果你用IP地址直接请求一台配置了多个站点的Nginx大概率会看到默认站点的内容就是因为缺少了Host信息服务器只能按默认规则处理。还有几个头字段在生产排查中经常用到。User-Agent标识客户端类型服务器可以做统计和兼容性处理。Accept告诉服务器客户端能理解的内容类型Accept-Encoding是客户端支持的压缩算法如果配置不当可能导致服务器返回未压缩的大体积文件浪费带宽。Connection: keep-alive是HTTP/1.1默认行为它告诉服务器处理完这个请求后不要立刻关闭TCP连接后续请求还能复用它。请求报文的最后是请求体。GET请求一般没有请求体POST请求通常把表单参数、JSON数据放在这里。实际传输中请求体之前必须留一个空行分隔报头区与报文主体不少初学者手写HTTP报文时在这个空行上踩坑解析器会一直等报文头结束导致请求挂起。3.3 服务器响应报文状态码与头字段响应报文的核心结构同样是起始行加头字段加报文体起始行是状态行格式为HTTP版本加状态码加原因短语HTTP/1.1 200 OK Content-Type: text/html; charsetUTF-8 Content-Length: 5312 Cache-Control: max-age3600 Date: Sat, 15 Mar 2025 08:30:00 GMT状态码分类需要记牢因为它是排查问题的第一道索引1xx信息性响应最常见的是100 Continue表示服务器愿意接收请求体客户端可以继续发送。2xx请求成功。200标准成功201创建成功204无内容返回。3xx重定向。301永久跳转302临时跳转304命中协商缓存客户端可以用本地缓存。4xx客户端错误。400请求语法错误401未认证403拒绝访问404资源不存在405方法不被允许429请求频率超限。5xx服务端错误。500内部错误502网关收到上游无效响应503服务暂时不可用504网关超时。只要看到“页面打不开”或者“接口报错”先看状态码80%的问题范围立刻能缩小。比如304意味着缓存生效不用重新下载资源404基本是路径写错了502和504则要往网关和服务端方向查跟前端代码关系不大。响应头里Content-Type决定浏览器如何解释内容类型比如text/html按页面渲染application/json按接口数据处理如果返回类型和实际内容不匹配浏览器会发生怪异表现。Content-Length表示实体长度如果这个值和实际传输的数据长度不一致客户端会一直等待直到超时。Cache-Control是浏览器缓存的指挥棒max-age指定了缓存时长这个字段配置不合理会导致页面更新了但用户迟迟看不到新内容。3.4 HTTPS在TCP之上加一层TLS现在的生产环境基本全面转向HTTPS。严谨地说HTTPS的全称应该是HTTP over TLS它不是在HTTP协议层直接添加加密而是在TCP之上再加一层TLS安全层HTTP报文内容不变只是交给TLS加密之后再塞进TCP连接里传输。TLS握手阶段相比普通HTTP多出好几个往返。客户端先发送ClientHello携带支持的TLS版本和加密套件列表服务端回复ServerHello选定加密方案把证书链发给客户端客户端验证证书有效性然后交换密钥协商参数最后双方各自计算出会话密钥并发送Finished消息确认。整个流程至少要耗费一到两个额外的网络往返。这也是为什么很多人直观感受HTTPS比HTTP慢一些。真实环境中差距并不大因为现代TLS支持会话复用和多路复用建立一次连接之后后续请求走复用通道几乎无感知。反而SSL握手开销大往往是由于客户端每次请求都新建连接导致的这种情况需要优先排查连接复用配置。部署HTTPS时一个高频坑是证书链不完整。有些人在服务器上只配置了域名证书文件没有配中间证书Chrome等主流浏览器会自己补齐能正常访问但一些手机端App和老旧客户端严格校验中间证书直接报错。正确的做法是配置完整的证书链文件内容顺序是域名证书在前、中间证书在后不允许随意颠倒。4. 实操手把手跟踪一次真实请求4.1 浏览器开发者工具的Network面板怎么看打开浏览器开发者工具切到Network面板刷新页面能看到页面上所有请求的瀑布图。点击任意一条请求能看到详尽的耗时拆解Chrome里叫Timing标签其中包含以下几个阶段DNS Lookup域名解析消耗的时间。Initial ConnectionTCP三次握手消耗的时间。SSL/TLSTLS握手消耗的时间。Request Sent从发起请求到请求包发送完成的时间通常极短。Waiting (TTFB)从请求发出到收到响应第一个字节的时间。Content Download下载整个响应体的时间。这六个阶段就是前面理论讲的完整落地表现。分析慢请求的时候逐段看哪一段异常放大。DNS Lookup如果高达几百毫秒大概率是本地DNS服务器配置有问题或者是第一次访问没有缓存导致需要完整走一遍解析链路。Initial Connection偏长可能客户端和服务端之间的网络路由链路不稳定或者服务器本身负载过高导致SYN队列积压。SSL/TLS阶段偏长要关注证书链是否过大、TLS往返次数是否过多、是否频繁新建连接。TTFB高则指向服务端处理慢或者中间链路有转发延迟。4.2 用curl和dig做更精确的拆解浏览器面板适合日常开发观察但要精确量化或者在服务器上做测试命令行工具更顺手。curl加-w参数可以输出自定义格式的耗时统计curl -o /dev/null -s -w DNS耗时:%{time_namelookup}s\n连接耗时:%{time_connect}s\nTLS耗时:%{time_appconnect}s\n首字节耗时:%{time_starttransfer}s\n总耗时:%{time_total}s\n https://example.com/执行之后你会看到每个阶段的精确耗时。这套输出特别适合接口慢排查的场景先把总耗时分段哪一段高就重点查哪一段。如果DNS耗时高去查DNS配置和递归服务器质量如果连接耗时高去查网络链路如果首字节耗时高去查服务端应用性能。DNS层面的问题再用dig工具验证。最简单的查询dig example.com返回结果里能看到查询到的A记录、TTL值、权威DNS服务器信息。还可以指定特定DNS服务器查询来对比解析结果dig 8.8.8.8 example.com拿本地DNS解析结果和公共DNS解析结果做对比能快速判断是本地递归链路的缓存污染还是权威记录本身有改动。4.3 解读时间线的两个常见误区经验越久越发现用时间线做性能分析时要避免两个极端判断。第一个误区是只看总耗时。总耗时小不代表没问题可能某个请求命中缓存响应很快但它在没命中缓存时重新走完整链路就会异常慢这类隐患在流量高峰期才会爆发。第二个误区是总耗时大就锅全甩给网络。我曾经接过一个慢接口工单总耗时800ms网络链路看着正常服务端CPU也不高最后定位到是网关层做了一次多余的证书链校验每次请求都在那里阻塞了300ms。所以一定要逐段拆开看哪一段异常就追哪一段不要靠猜。5. 常见问题与排查技巧实录5.1 域名能解析但浏览器就是打不开这类问题可以说是网络排查里出现频率最高的。很多人的第一反应是怀疑DNS解析出了问题但“能解析”和“能访问”完全不是同一件事。能解析只说明拿到了IP地址能不能访问还要看TCP连通性、防火墙规则、端口状态、服务进程存活情况。一个很典型的场景是ping域名通但浏览器访问超时。ping走的是ICMP协议浏览器访问走的是TCP协议某些云平台的防火墙或系统防火墙只放行了ICMP的响应规则没有放行对应端口就会出现“网络是通的但业务不可达”的假象。排查时先确认端口状态可以用telnet或nc命令测试telnet example.com 443如果连接能建立再往下看HTTP层如果连接直接拒绝或超时问题就在网络和防火墙这一层。5.2 改完DNS记录迟迟不生效DNS记录修改之后不生效是运营和开发都容易焦虑的场景但绝大多数情况并不是权威记录没改对而是缓存还没过期。浏览器有缓存操作系统有缓存本地递归DNS有缓存运营商递归服务器也有缓存。排查步骤建议按这个顺序走先强制刷新浏览器缓存或直接开无痕窗口测试。清除操作系统DNS缓存。Windows执行ipconfig /flushdnsmacOS执行sudo dscacheutil -flushcacheLinux大部分是systemd-resolve --flush-caches或者重启DNS服务。用dig命令指定公共DNS查询权威记录。如果返回了最新结果说明权威服务器侧没有问题。再对比本地DNS的解析结果两边不一致就是本地递归缓存滞后导致的。这里有个值得说明的地方全网缓存过期的时间很难精确控制到秒和每条记录当时下发时的TTL有关。所以前面强调过做重要切换之前提前调低TTL否则只能干等。5.3 TTFB高到底是网络还是服务端Waiting (TTFB)高属于超高频问题。它的组成比较复杂既包含请求从客户端传到服务器的链路耗时也包含服务器应用自己处理请求到生成响应的时间还包含响应从服务器传回客户端的链路耗时。因此这个指标高的时候需要判断瓶颈究竟在哪一侧。最直接的办法是在服务器本机发一次请求做对照测试curl -o /dev/null -s -w 首字节耗时:%{time_starttransfer}s\n http://127.0.0.1/health如果本机请求响应极快说明服务端逻辑本身没瓶颈问题大概率在网络链路、DNS调度或代理层面。如果本机也慢说明服务端应用内部有问题往代码、数据库查询、第三方依赖等方向继续查。5.4 高频踩坑清单从个人实际维护经验出发列几个常见的坑碰到了能节省大量时间证书链不完整导致部分客户端报错但不是所有终端只复现不报错的情况排查难度特别大。同一个域名同时解析出多个IP其中一台服务器故障客户端连接时随机选到故障IP表现为时好时坏。响应头Content-Length和实际响应体长度不一致客户端一直等待完整数据最后超时。HTTP短连接并发量高服务端文件描述符被耗尽新连接被内核拒绝表现为请求偶发失败。301跳转目标地址写成了HTTP导致无限重定向循环浏览器直接报错。加载了多个不同域名的静态资源其中一个域名解析异常整个页面卡在等待这个资源的时间线里。6. 个人经验与补充建议关于HTTP请求和DNS解析真正难的不是记住概念而是把整条链路串起来在出问题时能按图索骥。我排查过程中最常用的动作就是三招看浏览器Network面板的时间线用curl拆解耗时用dig验证DNS。这三招能覆盖掉绝大多数网络相关的疑难杂症也推荐按这个顺序来做。还有一个个人体会排查这类问题最怕被表层症状带偏。比如页面慢就先去做前端优化结果折腾半天发现是一个接口的跨域等待拖长了整个时间线。所以我的习惯是先打开Network面板看所有请求的列表和状态码把每个请求的时间线展开哪一步异常就从哪一步往下定位先确定环节再动手改避免白忙一场。最后分享一个小技巧如果你手头维护较多域名的证书和DNS记录建议固定一套自动化的巡检脚本定期检查证书剩余有效期、DNS解析结果与预期是否一致、线上域名指向的IP是否在监控白名单内。这些东西平时不出问题但一旦出问题往往正好赶在流量最大的时候。提前几分钟发现能少掉不少头发。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询