详解浏览器输入网址后发生了什么

本文详细介绍了从用户在浏览器中输入网址到最终展示页面的全过程,包括主机如何获得IP地址、DNS解析、TCP连接建立、HTTP请求与响应、重定向机制以及浏览器如何解析和显示HTML。


浏览器是我们平时经常使用一种工具,我们在浏览器地址栏输入一个URL后,敲下回车键,浏览器就会反馈我们一个页面。这个过程背后其实发生了很多。
讲解过程之前,先介绍一下一台主机是如何连接到网络的。

一台主机的联网过程

一台主机想要连接网络,首选需要获得一个属于自己的IP地址, IP地址用于标识主机的地址。IP的具体获得步骤简述如下:

①主机的操作系统生成一个DHCP请求报文,然后吧报文发给传输层,传输层将这个报文放入具有目的端口(DHCP服务器)和源端口(本机)的UDP报文段中, 之后UDP报文段在网络层会被添加到一个具有广播地址(255.255.255.255)和源IP地址为0.0.0.0的IP数据报中,接着包含DHCP请求报文的IP数据报被转为以太网帧(局域网CSMA/CD协议)。

②该帧会发送给以太网交换机, 并在所有的输出端口广播该帧,DHCP服务器接受到该帧时(运行在路由器中), DHCP服务器为该主机分配IP地址, 并把分配的IP地址,DNS服务器地址, 默认网关路由器地址, 网络掩码等信息一起封装成一个报文,再通过路由器的各层封装处理,发送给主机.,主机收到IP地址信息后,会再次与DHCP服务器通信来确认。

这样一台主机就获得了自己的IP地址与其他网络配置信息, 可以在浏览器里上网了。

过程简述

浏览器输入一个网址到反馈信息给用户这个过程,中间的大致流程如下:

  1. 在客户端浏览器中输入网址URL。

  2. 发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址。

  3. 有了IP后,客户端浏览器就可以与WEB服务器建立TCP(传输控制协议)连接。

  4. 客户端浏览器向对应IP地址的WEB服务器发送相应的HTTP或HTTPS请求。

  5. WEB服务器收到客户端请求,返回给用户指定的URL数据或错误信息;如果设定重定向,则重定向到新的URL地址,重新开始第一步。

  6. 客户端浏览器解析HTML源文件,解析的过程中实现对页面的排版,解析完成后,在浏览器中显示基础的页面。

  7. 分析页面中的超链接(如图片,样式等也是一个URL),过程和以上过程类似,之后再显示在当前页面,重复以上过程直至没有超链接需要发送,完成页面的全部加载。

过程详解

输入网址获取IP

比如我们现在要访问百度, 输入URL:www.baidu.com在浏览器后, 我们的主机需要知道百度的IP地址才能与百度的服务器建立TCP连接,建立连接后才可以发送HTTP请求, 下面将介绍根据DNS协议完成URL名字到IP转换的过程:
介绍具体步骤前先介绍一下DNS的概念。

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
通俗的讲,我们更习惯于记住一个网站的名字,比如www.baidu.com,而不是记住它的ip地址,比如:167.23.10.2。而计算机更擅长记住网站的ip地址,而不是像www.baidu.com等链接。因为,DNS就相当于一个电话本,比如你要找www.baidu.com这个域名,DNS翻一翻电话本,我就知道,它的电话(ip)是167.23.10.2。

第一步:
查找浏览器缓存:因为浏览器一般会缓存DNS记录一段时间,浏览器去查找这些缓存,如果有缓存,就可以直接返回IP,否则下一步。

第二步:
查找系统缓存:浏览器缓存中找不到IP之后,浏览器会进行系统调用,查找本机的hosts文件,如果找到,直接返回IP,否则下一步。

第三步:
查找路由器缓存:如果1,2步都查询无果,则需要借助网络,路由器一般都有自己的DNS缓存,这个过程具体如下:

1)把URL放入DNS报文中, 再在主机传输层根据DNS服务器端口封装为报文段,在网络层封装IP数据报, 最后在数据链路层放入到以太网帧中, 并将该帧通过物理层传输发送到你的路由器。

2)虽然在第4步中已经获得了网关路由器的IP地址, 但还不知道其MAC地址. 为了获得网关路由器的MAC地址, 需要使用ARP查询报文,接着把ARP封装进以太网帧中, 逻辑过程和上一步类似,并在以太网中广播, 最终获得网关的MAC地址。

3)有了网关MAC地址后, 承载DNS报文的数据报就能到达DNS服务器了,我们假设DNS服务器缓存有www.baidu.com的IP地址, DNS服务器会把URL对应的IP地址通过报文发送给传输层, 放入到UDP报文段中, 进而封装成包含我们主机地址的IP数据报, 并通过网络反向传输回我们的主机。
如果路由器DNS中仍然没有缓存百度的IP地址,就到转第四步。

第四步:
如果以上步骤还找不到,DNS服务器就会使用一下两种方式来间接获取IP。

  1. 递归查询:
    如果以上步骤还找不到,则DNS服务器就会进行递归查询,所谓递归查询就是如果主机所询问的本地域名服务器不知道其的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文来获得百度的IP地址,而不是让该用户主机自己进行下一步查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端。

  2. 迭代查询:
    迭代查询的方式是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序,客户端DNS程序自己再继续向这些DNS服务器进行查询,直到得到查询结果为止。也就是说,迭代解析只是帮你找到相关的服务器而已,而不会帮你去查。

4)这时我们的主机得到了服务器www.baidu.com的IP地址, 可以访问百度的服务器了。

建立TCP连接

有了百度服务器的IP地址后, 可以与服务器建立TCP连接。

TCP建立连接的过程(三次握手):

第一次握手:
客户端主机A将标志位SYN值设为1,再随机产生一个值为seq=J(J的取值范围为=1234567)的数据包通到各协议层封装传输到服务器,客户端A进入SYN_SENT状态(请求连接状态),等待服务端B确认;

第二次握手:
服务端B收到数据包后由标志位SYN=1就知道客户端A的请求是建立连接,服务端B将标志位ACK设为1,再设ack=J+1(这里主要ack与ACK的区分),再随机产生一个值seq=K,并将该数据包发送给客户端A以确认连接请求,服务端B进入SYN_RCVD状态(SYN_RECV是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态)。

第三次握手:
客户端A收到数据报后,检查ack是否为J+1,如果正确则令ack=K+1,标志位ACK为1,将该数据包发送给服务端B,服务端B检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端A和服务端B进入ESTABLISHED状态(连接成功状态),完成三次握手,随后客户端A与服务端B之间可以开始传输数据了。
在这里插入图片描述

这里顺便把TCP的断开也说明一下:

TCP的断开过程(四次挥手)

第一次挥手:
Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态(主动要求关闭tcp连接)。

第二次挥手:
Server收到FIN后,发送ACK给Client,确认序号为收到序号+1,Server进入CLOSE_WAIT状态(等待关闭状态)。

第三次挥手:
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态(等待远程TCP的连接中断请求的确认状态)。

第四次挥手:
Client收到FIN,接受ACK并验证后,Client进入TIME_WAIT状态(先发FIN标志位的一端就会进入time_wait状态),接着发送一个ACK给Server,确认序号为收到序号+1,Server收到ACK并验证后进入CLOSED状态,完成四次挥手。
在这里插入图片描述

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

释放连接时需要四次是因为TCP连接的半关闭造成的。由于TCP是全双工的(即数据可在两个方向上同时传递),因此,每个方向都必须要单独进行关闭,当服务器收到客户端的FIN报文通知时,它仅仅表示客户端没有数据发送服务器了;但服务器未必将所有的数据都全部发送给了客户端,所以服务器端未必马上也要关闭连接,也即服务器端可能还需要发送一些数据给客户端之后,再发送FIN报文给客户端来表示现在可以关闭连接了,所以它这度里的ACK报文和FIN报文多数情况下都是分开发送的,这也是为什么释放连接时需要交换四次报文了。

发起http请求

在三次握手的第三阶段, 我方主机需要向服务器发送ACK报文段, 就可以在ACK报文段中放入数据,并发送给服务器。客户端向服务器发起http请求的时候,会有一些请求信息。

HTTP请求信息:
HTTP请求包含三个部分:请求方法,请求头,请求正文。
| 请求方法URI协议/版本

例如:GET /books/?sex=man&name=Professional  HTTP/1.1
请求方法有很多,例如:GET Post HEAD PUT DELETE 等等

| 请求头(Request Header)

请求头包含许多有关的客户端环境和请求正文的有用信息。
例如,请求头可以声明浏览器所用的语言,请求正文的长度等。

| 请求正文:

请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束.
接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:
如username=zss&password=123

服务器接收到HTTP 报文后, 会返回一个HTTP响应报文或重定向信息
HTTP响应信息:
HTTP 响应也是由三个部分组成,分别是:状态行、消息报头和响应正文
| 状态行

状态行由协议版本、数字形式的状态代码,及相应的状态描述组成
如:200 OK //客户端请求成功  404 Not Found //请求资源不存在等

| 消息报头

Date:作用:生成消息的具体时间和日期,即当前的GMT时间。
Expires:作用: 浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。

| 响应正文

响应正文就是服务器返回的资源的内容,响应头和正文之间也必须用空行分隔

最后我们的主机读取HTTP响应报文, 抽取出html数据, 并将网页显示在浏览器上。

重定向信息

对于大型网站存在多个主机站点,为了负载均衡或者导入流量,往往不会直接返回请求页面,而是重定向。返回的状态码就不是200OK,而是301,302以3开头的重定向码,浏览器在获取了重定向响应后,在响应报文中Location项找到重定向地址,浏览器重新回到第一步访问。

重定向的作用:重定向是为了负载均衡或者导入流量。利用一个前端服务器接受请求,然后负载到不同的主机上,可以大大提高站点的业务并发处理能力;重定向也可将多个域名的访问,集中到一个站点;比如baidu.com,www.baidu.com,永久重定向会将两个地址关联起来,来提高网站的自然排名。

浏览器显示 HTML

在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件。比如我要获取外图片,CSS,JS文件等,类似于下面的链接:
图片:http://zhangsaisaiPNG.com/8q2anwu7.gif
CSS式样表:http://zhangsaisaiCSS.com/2plh8s4n.css
JavaScript 文件:http://zssjscript.com/c8yzb6ub.js
这些地址都要经历一个和HTML读取类似的整个访问过程
所以浏览器会在DNS中查找这些域名,发送请求,重定向等等…

<think>我们正在回答用户关于“输入网址浏览器的工作流程”的问题。用户希望了解从输入网址到页面展示的整个底层工作原理,包括网络请求、DNS解析、建立连接等过程。 根据提供的引用材料,我们可以整理出一个详细的工作流程。同时,系统要求使用中文回答,并正确使用LaTeX格式的数学表达式(虽然这个问题可能不太涉及数学公式,但如果有需要我们会使用),最后生成相关问题。 步骤概述(根据引用材料整合): 1. 用户输入网址(URL) 2. 浏览器解析URL 3. DNS解析(将域名转换为IP地址) 4. 建立TCP连接(三次握手) 5. 浏览器发送HTTP请求 6. 服务器处理请求并返回响应 7. 浏览器解析渲染页面 8. 关闭TCP连接(四次挥手) 下面我们将详细展开每个步骤。 详细工作流程: 1. **用户输入网址** 用户在浏览器地址输入URL(例如:http://www.example.com),并按下回车键。 2. **浏览器解析URL** 浏览器解析URL,提取出协议(如HTTP/HTTPS)、主机名(如www.example.com)、端口号(默认为80或443)、资源路径(如/index.html)等。 3. **DNS解析(域名解析)** 浏览器需要将主机名转换为IP地址才能建立连接。DNS解析过程如下[^2]: - (1)**浏览器缓存**:浏览器首先检查自身缓存中是否有该域名对应的IP地址。 - (2)**操作系统缓存**:如果浏览器缓存没有,则检查操作系统的hosts文件和缓存(如Windows的DNS Client服务缓存)。 - (3)**本地域名服务器(LDNS)**:如果上述步骤都没有,浏览器会向本地配置的DNS服务器(通常由ISP提供)发起请求。 - (4)**根域名服务器、顶级域名服务器、权威域名服务器**:如果本地DNS服务器没有缓存,则从根域名服务器开始递归查询,直到获取到IP地址。 整个DNS查询过程可能经过递归查询或迭代查询,最终将域名解析为IP地址。 4. **建立TCP连接(三次握手)** 获取到IP地址后,浏览器通过操作系统的网络栈与服务器建立TCP连接(使用三次握手)[^2][^3]: - **第一次握手**:客户端发送一个SYN包(SYN=1, seq=x)到服务器,并进入SYN_SENT状态。 - **第二次握手**:服务器收到SYN包,发送SYN+ACK包(SYN=1, ACK=1, seq=y, ack=x+1),并进入SYN_RCVD状态。 - **第三次握手**:客户端收到SYN+ACK包,发送ACK包(ACK=1, seq=x+1, ack=y+1),此时双方进入ESTABLISHED状态,连接建立。 5. **浏览器发送HTTP请求** TCP连接建立后,浏览器通过该连接向服务器发送HTTP请求报文[^3][^4]。请求报文包括: - 请求行:包含请求方法(如GET、POST)、资源路径、HTTP协议版本。 - 请求头:包含Host(主机名)、User-Agent(浏览器标识)、Accept(可接受的响应内容类型)、Accept-Language、Accept-Encoding、Cookie等字段[^4]。 - 请求体(对于POST等方法)。 6. **服务器处理请求并返回响应** 服务器接收到请求后,根据请求的资源路径和参数进行处理,然后返回HTTP响应报文: - 状态行:包含HTTP版本、状态码(如200 OK)。 - 响应头:包含Content-Type(响应内容的类型,如text/html)、Content-Length、Set-Cookie等。 - 响应体:实际返回的资源内容(如HTML文档)。 7. **浏览器解析渲染页面** 浏览器接收到响应后,开始解析和渲染页面: - 解析HTML构建DOM树。 - 解析CSS构建CSSOM树。 - 将DOM树和CSSOM树合并成渲染树(Render Tree)。 - 布局(Layout):计算每个节点在屏幕中的位置和大小。 - 绘制(Painting):将各个节点绘制到屏幕上。 - 如果遇到JavaScript,会执行并可能阻塞渲染(除非标记为异步或延迟)。 8. **关闭TCP连接(四次挥手)** 当页面加载完成后,浏览器会关闭TCP连接(如果HTTP头中Connection字段为close,则每次请求后都会关闭;如果是keep-alive,则连接会保持一段时间)[^4]。关闭连接的过程(四次挥手): - **第一次挥手**:客户端发送FIN包(FIN=1, seq=u)给服务器,进入FIN_WAIT_1状态。 - **第二次挥手**:服务器收到FIN,发送ACK包(ACK=1, ack=u+1)给客户端,进入CLOSE_WAIT状态。此时客户端到服务器的连接关闭,但服务器到客户端的连接还可以发送数据。 - **第三次挥手**:服务器发送FIN包(FIN=1, seq=v)给客户端,进入LAST_ACK状态。 - **第四次挥手**:客户端收到FIN,发送ACK包(ACK=1, ack=v+1)给服务器,进入TIME_WAIT状态(等待2MSL后关闭)。服务器收到ACK后立即关闭连接。 注意:如果使用HTTPS,在建立TCP连接后,还需要进行TLS握手(交换密钥、验证证书等),建立加密通道,然后再发送HTTP请求(即HTTP over TLS)。 流程图(文字描述): ``` 输入URL -> 解析URL -> DNS解析 -> 建立TCP连接(三次握手) -> 发送HTTP请求 -> 服务器处理请求并返回响应 -> 浏览器解析渲染页面 -> 关闭TCP连接(四次挥手) ``` 相关问题: 1. DNS解析过程中,如何减少解析时间以提高网页加载速度? 2. 为什么TCP连接需要三次握手,而断开需要四次挥手? 3. 浏览器渲染页面时遇到JavaScript阻塞如何处理? 4. HTTPS在HTTP工作流程的基础上增加了哪些步骤? 5. 如何通过HTTP协议头优化网页加载性能? 以上即为从输入网址到页面展示的完整工作流程。</think>### 输入网址浏览器的工作流程详解 当您在浏览器输入网址(如 `https://www.example.com`)并按下回车后,浏览器会执行以下底层工作流程: #### 1. **URL解析与协议识别** [^1] - 浏览器解析URL结构:`协议://主机名:端口/路径?查询参数#锚点` - 识别协议(HTTP/HTTPS)和默认端口(HTTP:80, HTTPS:443) - 检查HSTS预加载列表强制HTTPS(安全站点) #### 2. **DNS域名解析** [^2] 浏览器通过分层查询将域名转换为IP地址: 1. **浏览器缓存**:检查自身DNS缓存(`chrome://net-internals/#dns`) 2. **操作系统缓存**:查询系统hosts文件(`/etc/hosts`或`C:\Windows\System32\drivers\etc\hosts`) 3. **本地DNS服务器**:向路由器或ISP配置的DNS服务器发起查询 4. **递归查询**(若未命中缓存): ```mermaid graph LR A[本地DNS] --> B[根域名服务器] B --> C[顶级域服务器 .com] C --> D[权威域名服务器 example.com] D --> E[返回IP地址] ``` 5. 最终获得目标服务器的IP地址(如 `93.184.216.34`) #### 3. **建立网络连接** - **TCP三次握手**建立可靠连接 [^2]: ``` 客户端 ───SYN───> 服务器 客户端 <──SYN+ACK── 服务器 客户端 ───ACK───> 服务器 ``` - **HTTPS额外步骤**: - TLS握手(交换密钥) - 证书验证(检查CA签名) - 协商加密套件(如AES_256_GCM) #### 4. **发送HTTP请求** [^3][^4] 浏览器构建并发送符合RFC标准的请求报文: ```http GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml Accept-Language: zh-CN Cookie: session_id=abc123 Connection: keep-alive ``` > 关键头字段说明: > - `Host`:虚拟主机标识(必需) > - `User-Agent`:客户端环境信息 > - `Cookie`:会话状态数据 > - `Connection: keep-alive` 启用持久连接 #### 5. **服务器处理与响应** 1. Web服务器(如Nginx/Apache)接收请求 2. 路由到后端应用(如PHP/Node.js) 3. 生成响应报文: ```http HTTP/2 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 15320 Set-Cookie: session=new Cache-Control: max-age=3600 <!DOCTYPE html> <html>...</html> ``` > 协议版本体现在响应行首: > - HTTP/1.x → `HTTP/1.1 200 OK` > - HTTP/2 → `HTTP/2 200` #### 6. **浏览器渲染引擎工作** 1. **解析HTML** → 构建DOM树 2. **解析CSS** → 构建CSSOM树 3. **合并渲染树**(Render Tree) 4. **布局计算**(Layout/Reflow) 5. **绘制显示**(Painting) 6. **执行JavaScript**(可能触发重绘) #### 7. **连接终止** - HTTP/1.1:`Connection: close` 触发TCP四次挥手 - HTTP/2:多路复用保持连接 - 资源加载完成后断开: ``` 客户端 ───FIN───> 服务器 客户端 <──ACK─── 服务器 客户端 <──FIN─── 服务器 客户端 ───ACK───> 服务器 ``` ### 关键优化技术 1. **DNS预取**:`<link rel="dns-prefetch" href="//cdn.example.com">` 2. **TCP快速打开**(TFO):减少握手延迟 3. **HTTP/2特性**:头部压缩、服务端推送、多路复用 4. **缓存策略**:`Cache-Control`/`ETag` 避免重复传输 > 完整流程耗时通常在100ms-3s之间,受网络延迟、资源大小、服务器响应速度影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值