当你在浏览器中输入URL时会发生什么?

301

有人可以告诉我,从我在浏览器中输入URL到我看到页面的整个过程中都发生了什么?详细的过程描述将会非常有帮助。


2
虽然这可能与编程有关(最终会涉及到),但是对于这个问题的详细回答需要填满很多卷。请将其重新表述为一个编程查询。 - KevinDTimm
30
请购买O'Reilly的《DNS and Bind》书籍,它只有624页。 - Wim
7
谢谢!以下是对http://edusagar.com/articles/view/70/What-happens-when-you-type-a-URL-in-browser的翻译:当你在浏览器中输入URL时,浏览器会尝试寻找该网站的IP地址。它会首先检查本地缓存以查看是否有IP地址对应于该网站。如果没有,则它会查询DNS服务器以获取IP地址。一旦浏览器获得了IP地址,它就可以向该地址发送HTTP请求以获取网页内容,并将其渲染到屏幕上。 - Shivendra
2
为了后人的纪念,这里有一个详细的版本,介绍互联网是如何工作的 - http://goo.gl/eEHmpZ。 - Ashwin Krishnamurthy
7
现在有一个协作的努力,尽可能详细地回答这个问题:https://github.com/alex/what-happens-when/blob/master/README.rst - Piskvor left the building
显示剩余2条评论
3个回答

596

注意:这是一个极为简化的草图,假设最简单的HTTP请求(没有HTTPS,没有HTTP2,没有其他额外的内容),最简单的DNS,没有代理,单栈IPv4,只有一个HTTP请求,另一端有一个简单的HTTP服务器,且各个步骤都没有问题。在当今大部分情况下,这是一个不切实际的场景;实际使用中所有这些步骤都要复杂得多,并且技术栈自该文写作以来已经增加了一个数量级。考虑到这一点,以下时间轴仍然在某种程度上有效:

  1. 浏览器检查缓存;如果请求的对象在缓存中且仍然新鲜,则跳转至步骤#9
  2. 浏览器向操作系统请求服务器的IP地址
  3. 操作系统进行DNS查找并将IP地址回复给浏览器
  4. 浏览器打开与服务器的TCP连接(如果是HTTPS则此步骤要复杂得多)
  5. 浏览器通过TCP连接发送HTTP请求
  6. 浏览器接收HTTP响应并可以关闭TCP连接或将其重用于另一个请求
  7. 浏览器检查响应是否为重定向或条件响应(3xx结果状态代码)、授权请求(401)、错误(4xx和5xx)等;这些与正常响应(2xx)有所不同
  8. 如果可缓存,响应将被存储在缓存中
  9. 浏览器解码响应(例如,如果它是gzipped的)
  10. 浏览器确定如何处理响应(例如,它是一个HTML页面、图像还是声音剪辑?)
  11. 浏览器呈现响应,或为未识别类型提供下载对话框

这些点的讨论已经填满了无数页,以下仅为概述,为了清晰起见而删节。此外,还有许多其他事情与此同时发生(处理输入的地址,预取,将页面添加到浏览器历史记录中,向用户显示进度,通知插件和扩展程序,在下载页面时呈现页面,管道化,保持连接跟踪,cookie管理,检查恶意内容等),并且使用HTTPS会使整个操作变得复杂一个数量级(证书、密码和固定等)。


在第4步中,如果是https请求会发生什么情况?您能再详细解释一下吗? - Mohammad Raheem
4
这超出了本回答的范围。但请查看上面链接的 GH 页面,它提供了简要概述:https://github.com/alex/what-happens-when/blob/master/README.rst#tls-handshake - Piskvor left the building

44

首先,计算机会查找目标主机。如果目标主机存在于本地DNS缓存中,则使用该信息。否则,进行DNS查询直到找到IP地址。

然后,您的浏览器打开与目标主机的TCP连接,并根据HTTP 1.1发送请求(或者可能使用HTTP 1.0,但是普通浏览器不再这样做)。

服务器查找所需资源(如果存在),并使用HTTP协议响应,将数据发送给客户端(即您的浏览器)。

然后,浏览器使用HTML解析器重新创建文档结构,稍后呈现在屏幕上。如果它发现对外部资源的引用,例如图片、CSS文件、JavaScript文件,则会以与HTML文档本身相同的方式传递。


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接