浏览器地址栏里敲下`www.example.com`,服发出回车,请求页面出现。服发出这中间发生了什么?请求本质上是你的电脑发出了一次HTTP请求——一个结构严谨的文本块,沿着网络线缆或电磁波,服发出奔向一台远方的请求服务器。
但“发出请求”这动作,服发出远不止敲个URL那么简单。请求我拆开来看。服发出
请求的请求第一步,是服发出解析域名。你输入的请求是一串字母,网络只认IP地址。服发出你的请求操作系统会先查本地缓存,没有就找DNS服务器——相当于问路。服发出这个问路过程本身也是一次UDP请求,发往你配置的DNS地址(比如8.8.8.8),对方返回一串数字,比如`93.184.216.34`。这一步经常被忽略,但它往往是请求慢的元凶——DNS解析超过100毫秒,用户就开始烦躁。
拿到IP后,你的电脑要和那台服务器建立TCP连接。三次握手:你发SYN,对方回SYN-ACK,你再发ACK。这来回一次,在局域网里几乎瞬间完成,但在跨洋链路上可能要花上百毫秒。有个细节——HTTP/2和HTTP/3都在优化这个环节。HTTP/3干脆改用UDP协议(QUIC),省掉握手延迟,因为现代用户等不起那一个往返时间。
连接建立后,真正的HTTP请求才登场。它长这样:
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept: text/html,application/xhtml+xml第一行是方法(GET)、路径和协议版本。后面是请求头——这些字段决定了服务器怎么理解你的意图。
Host字段特别关键,因为一台服务器上可能跑着几百个网站,靠它来区分你要访问哪个。如果你省略这个头,很多服务器会直接返回400错误。有些请求还带着请求体。POST方法就是典型——表单提交、JSON数据都塞在头部之后,用空行隔开。服务器读到这里就知道“头部结束,下面开始是正文”。这个格式从1996年的HTTP/1.0沿用至今,几乎没变过。有意思的是,很多人以为请求体就是整个请求的全部,其实它只是最后的一小段附加内容。
请求发出去之后,你的电脑就等着响应。但别以为这就完了——现代浏览器会同时发出多个请求。打开一个普通网页,平均要触发80到120次独立请求:HTML文档、CSS文件、JavaScript脚本、图片、字体、追踪像素。每个请求都走一遍上面说的流程。HTTP/1.1时代,浏览器最多同时开6个TCP连接,多了就排队。这就是为什么你会看到“页面加载慢”的提示——不是网速差,是排队。
有个细节我观察了很久:移动端请求比桌面端多一个步骤——网络切换检测。手机从WiFi切到4G时,TCP连接会全部失效,所有请求必须重来。所以你在电梯里刷网页,信号切换的那一瞬间,所有图片都加载不出来,因为那些请求已经死在了切换途中。这不是玄学,是TCP连接的IP地址变了,原有连接被系统强制关闭。
最后提一个反直觉的事实:请求发出后,你其实没法真正“取消”它。你点浏览器上的停止按钮,只是停止渲染响应内容,但那个HTTP请求可能已经到达服务器,服务器照样处理了。这就是为什么你快速双击提交按钮,会收到两条一模一样的订单——第二次请求已经发出去了,无法撤回。
发出请求,从来不是“发出去就完事”。从域名解析到连接复用,从头部格式到并发限制,每一步都是计算机科学和工程妥协的结果。你看到的每一个页面,背后都踏着几十次甚至上百次这样的请求足迹。
顶: 7976踩: 82549






评论专区