web访问流程
你在浏览器地址栏敲下 第一步是问流域名解析。你的问流电脑不知道 拿到IP后,浏览器开始建立TCP连接。三次握手——SYN、SYN-ACK、ACK——像两个人互相确认“你听得见我吗?”“听见了,你呢?”“我也听见了”。这步是纯技术活,没啥好讲的,但你得知道,如果服务器在海外,这三次握手可能就要绕地球半圈,延迟自然高。以前用2G网络时,光这一步就能耗掉一秒多,现在5G下几乎感觉不到。 紧接着是TLS握手,如果你访问的是HTTPS站点。这步更繁琐:浏览器发送支持的加密算法列表,服务器挑一个并返回证书,浏览器验证证书是否由可信机构签发,然后双方交换密钥。整个过程加密套件、证书链、会话复用,一堆术语。但说白了,就是给对话加个密码本,防止有人偷听。我见过很多开发者为了省事,直接把证书验证给关了,结果在测试环境里一切正常,一到生产环境就报错——这步跳过不得。 连接建立完毕,浏览器才真正发送HTTP请求。请求行写着方法(GET、POST之类)、路径和协议版本,后面跟着一堆请求头—— 响应返回时,状态码是200表示成功,404表示没找到,500则是服务器内部炸了。你注意过没有,有时候页面加载快,有时候慢,差异往往就在服务器处理那一步——比如数据库没加索引,一个查询要扫全表,几百万行数据,不慢才怪。 浏览器拿到响应后,开始解析HTML。它边解析边构建DOM树,发现里面有CSS文件就继续请求,有图片、脚本也是。这些资源请求是并发的,但浏览器对同一域名的并发连接数有限制,一般是6个左右。所以你会发现,一个页面如果塞了上百个小图片,加载反而慢,因为它们在排队。这时候就得靠CDN或者雪碧图来分流。 等所有资源加载完,页面才渲染出来。但你以为这就完了?不,页面里的JavaScript可能还会发起额外的AJAX请求,动态更新内容。比如你刷微博,往下滚一屏,脚本就自动请求下一页数据,再渲染。这些请求走的是同样的流程——DNS查询、TCP连接、HTTP请求、响应处理——只是浏览器帮你把大部分细节藏起来了。 整个流程里,最容易被忽视的是DNS缓存和HTTP缓存。你第二次访问同一个网站,很多步骤直接跳过,所以感觉特别快。但一旦缓存过期,或者你清了缓存,那种“慢”的感觉就又回来了。说白了,web访问流程就是一场接力赛,每一棒都有延迟,优化就是尽量让某些棒次跑快点,或者干脆不跑。example.com 并按下回车,问流到页面完整显示出来,问流中间那几百毫秒里,问流你的问流电脑和世界另一头的一台服务器完成了一次极其复杂的对话。这个对话的问流每一步都有明确协议,像极了两个陌生人核对身份、问流交换文件的问流过程。example.com 在哪,它只知道IP地址,问流比如 93.184.216.34。问流于是问流它先问本地DNS缓存——没有?再问路由器——也没有?那就得层层往上递。从本地DNS服务器到根域名服务器,问流再到顶级域名服务器,问流最后到权威DNS服务器,问流一路问下来,终于拿到那个IP。这个过程通常只要几十毫秒,但如果你连的是个垃圾Wi-Fi,DNS服务器响应慢,你就能感受到“转圈圈”的滋味。User-Agent 告诉服务器你的浏览器类型,Accept 告诉它你能接收什么格式,Cookie 则带着你的登录状态。服务器收到这堆东西,开始处理。如果是个静态页面,它直接读文件返回;如果是个动态接口,它得跑数据库查询、业务逻辑,再拼装成HTML或JSON。