前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >地址栏中输入网址后发生了什么?

地址栏中输入网址后发生了什么?

作者头像
Java3y
发布于 2019-08-27 02:18:39
发布于 2019-08-27 02:18:39
2.3K00
代码可运行
举报
文章被收录于专栏:Java3yJava3y
运行总次数:0
代码可运行

本文公众号来源:01二进制 作者:雇个城管打天下 记得在面试的时候也被问到这题,当时答得并不好,这道题目其实可以挖掘很多的知识点出来,建议阅读!

前几天有个学妹问我为什么在浏览器里面输了网址就会显示出来页面,虽然这个现象很常见,但是要想解释清楚确实有些小困难,当时也只是简单的回答了她,现在想趁着这个机会好好整理下相关知识。整理完才觉得其实就和我们去一个地方找人是一个道理。所以说艺术源于生活却又高于生活,技术同样如此。

在回答这个问题前, 我们先来了解下我们平常说的那个网址到底是啥?

网址的学名叫做统一资源定位符(Uniform Resource Locator, 常缩写为URL), 我们知道现在的互联网其实就是由众多资源所构成的一张巨大的网, 如何定位那些资源就是靠的URL, 因此我们也可以把URL理解为是网络上资源的“门牌号“, 我们在浏览器中输入网址, 就相当于开一辆车(浏览器)去找一个地址(URL)

1. 缓存查找

如果你要出门找一个地方, 第一想法肯定是先想这个地方你有没有去过, 你要是去过的话那就不需要问人直接过去就好了。 我们的系统也是这么想的。 当你在浏览器中输入了URL之后, 浏览器会先查看 浏览器缓存 中有没有这个地址, 如果没有那就再去 系统缓存, 如果系统缓存还没有, 那就去路由器缓存找, 总之只要缓存中有, 就说明有这个资源, 那浏览器直接显示出来就好了。

Tips: 这里说下 hosts文件hosts 是一个没有扩展名的系统文件, 可以用记事本等工具打开, 其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”, 当用户在浏览器中输入一个需要登录的网址时, 系统会首先自动从 hosts 文件中寻找对应的 IP 地址,一旦找到, 系统会立即打开对应网页, 如果没有找到, 则系统会再将网址提交 DNS 域名解析服务器进行IP地址的解析。 需要注意的是, hosts文件配置的映射是静态的, 如果网络上的计算机更改了请及时更新IP地址, 否则将不能访问。

2. DNS 解析

如果你认得去那个地址的路自然是最好, 那如果你根本就没去过那咋办? 肯定会有人说导航, 但并不是所有的地方都是导航能搜到的, 这个时候我们自然而然就会想着去问路人了。 浏览器也是这样的, 如果在本地缓存中没有找到想要的资源, 那就只能去其他网络上的机器中寻找我想要的资源了。 那你怎么知道你要的资源在那台机器上? 这时, DNS就横空出世了。

DNS(Domain Name System, 域名系统),DNS解析的过程就是寻找哪台机器上有你需要资源的过程。当你在浏览器中输入一个地址时, 例如 www.baidu.com, 其实这段URL并不是真正意义上的地址。 互联网上每一台计算机的唯一标识是它的 IP 地址(比如127.0.0.1就是我们本机的 IP 地址), 但是 IP 地址并不方便记忆(毕竟都是很长的数字串), 所以也就出现了网址(URL)这个玩意了, 目的就是为了方便普通用户去寻找网络上的其他计算机。 所以 DNS 实际上充当了一个翻译的角色, 将网址翻译成 IP 地址(就跟我想去南京大学, 问路的那个人告诉我南京大学在广州路上是一个道理)。

2.1 DNS 解析过程

DNS解析其实是一个递归查询的过程:

在上述过程中, 首先在本地域名服务器中查询 IP 地址, 如果没有找到, 本地域名服务器会向根域名服务器发送一个请求, 如果根域名服务器也不存在该域名时, 本地域名会向com顶级域名服务器发送一个请求, 依次类推下去。 直到最后找到目标网址所对应的 IP, 并将其缓存到本地, 以供下次使用。

2.2 DNS负载均衡

在讲DNS负载均衡前先来看张图片:

看到这可能就会有人犯嘀咕了, 我们不是 ping 的同一个网址吗, 为啥两次IP都不一样啊? 其实原因很简单, 如果每次都一样是否说明你请求的资源都位于同一台机器上面, 那么这台机器需要多高的性能和储存才能满足亿万请求呢? 其实真实的互联网世界背后存在成千上百台服务器, 大型的网站甚至更多。 但是在用户的眼中, 它需要的只是处理他的请求, 哪台机器处理请求并不重要。 DNS可以返回一个合适的机器的IP给用户, 例如可以根据每台机器的负载量, 该机器离用户地理位置的距离等等, 这种过程就是DNS负载均衡, 又叫做DNS重定向。

再来举个例子, 如果你在新街口用地图搜南京大学, 返回给你的第一条数据可能就是南京大学鼓楼校区(因为距离最近), 但如果你是在仙林用地图搜南京大学, 返回给你的第一条数据就有可能是南京大学仙林校区了。 DNS负载均衡简单来说也是这个道理。

2.3 DNS 污染

DNS 污染(DNS cache pollution), 又称域名服务器缓存投毒(DNS cache poisoning), 是指一些刻意制造或无意中制造出来的域名服务器数据包, 把域名指往不正确的IP地址

某些网络运营商为了某些目的, 对DNS进行了某些操作, 导致上网的用户无法通过域名取得正确的IP地址。 某些国家或地区出于某些目的为了防止某网站被访问, 而且其又掌握部分国际DNS根目录服务器或镜像, 也会利用此方法进行屏蔽。 (Google、 Facebook等)

至于如果防止DNS污染, 这里只说一个方法就是修改hosts文件, 其他的自行搜索吧。

3. TCP连接

其实在上面DNS解析的图中就已经有了TCP连接的过程了:

我们通过DNS解析获取到了网址所对应的IP地址后, 便需要发起TCP连接请求, 这里总共需要三次握手, 具体的过程就不赘述了, 可以查阅相关资料, 这里推荐刘欣老师的《TCP/IP 之 大明王朝邮差》, 以及大学计算机网络课本里面的TCP相关章节。

4. HTTP 请求

握手成功后, 浏览器就可以向服务器发送http请求了, 请求数据包。 发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议中发送到服务器指定端口(HTTP协议80/8080, HTTPS协议443)。HTTP请求报文是由三部分组成: 请求行,请求报头和请求正文。

4.1 请求行

格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Method  RequestURL  HTTPVersion CRLF

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET index.html HTTP/1.1

常用的方法有: GET,POST,PUT,DELETE,OPTIONS,HEAD

4.2 请求报头

请求报头允许客户端向服务器传递请求的附加信息和客户端自身的信息。

Tips:客户端不一定特指浏览器, 有时候也可使用Linux下的CURL命令以及HTTP客户端测试工具等。

常见的请求报头有: Accept,AcceptCharset,AcceptEncoding,AcceptLanguage,ContentType,Authorization,Cookie,UserAgent等。

上图是使用Chrome开发者工具截取的对百度的HTTP请求以及响应报文, 从图中可以看出, 请求报头中使用了Accept, AcceptEncoding, AcceptLanguage, CacheControl, Connection, Cookie等字段。 Accept 用于指定客户端用于接受哪些类型的信息, AcceptEncoding 与 Accept 类似, 它用于指定接受的编码方式。Connection 设置为 Keepalive 用于告诉客户端本次 HTTP 请求结束之后并不需要关闭 TCP 连接, 这样可以使下次 HTTP 请求使用相同的 TCP 通道, 节省 TCP 连接建立的时间。

5. 服务器响应

这部分对应的就是后端工程师眼中的 HTTP。 后端从在固定的端口接收到 TCP 报文开始, 这一部分对应于编程语言中的 socket。 它会对 TCP 连接进行处理, 对 HTTP 协议进行解析, 并按照报文格式进一步封装成 HTTP Request对象, 供上层使用。 这一部分工作一般是由 Web 服务器去进行, 常用的Web服务器有 Tomcat, IIS 和 Netty 等等。

HTTP响应报文也是由三部分组成: 状态码, 响应报头响应报文。 篇幅原因这里就不详细展开了。

6. 浏览器解析网页信息

服务器返回给浏览器的文本信息, 通常是 HTML, CSS, JS, 图片等文件, 那么浏览器是如何对泽泻内容进行渲染呢? 通常是下面五个步骤:

  1. 处理 HTML 标记并构建 DOM 树。
  2. 处理 CSS 标记并构建 CSSOM 树。
  3. 将 DOM 与 CSSOM 合并成一个渲染树。
  4. 根据渲染树来布局, 以计算每个节点的几何信息。
  5. 将各个节点绘制到屏幕上。

不过这五个步骤在不同内核的浏览器中执行细节是不同的, 想深入了解的可以查阅相关资料, 这里推荐一篇文章:《浏览器渲染页面过程与页面优化》(https://segmentfault.com/a/1190000010298038)

浏览器是一个边解析边渲染的过程。 首先浏览器解析HTML文件构建DOM树, 然后解析CSS文件构建渲染树, 等到渲染树构建完成后, 浏览器开始布局渲染树并将其绘制到屏幕上。

JS的解析是由浏览器中的 JS 解析引擎完成的。 JS是单线程运行, 也就是说, 在同一个时间内只能做一件事, 所有的任务都需要排队, 前一个任务结束, 后一个任务才能开始。 但是又存在某些任务比较耗时, 如IO读写等, 所以需要一种机制可以先执行排在后面的任务, 这就是: 同步任务(synchronous)和异步任务(asynchronous)。 JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。 同步任务就是放在主线程上执行的任务, 异步任务是放在任务队列中的任务。 所有的同步任务在主线程上执行, 形成一个执行栈; 异步任务有了运行结果就会在任务队列中放置一个事件; 脚本运行时先依次运行执行栈, 然后会从任务队列里提取事件, 运行任务队列中的任务, 这个过程是不断重复的, 所以又叫做事件循环(Event loop)。 如下图所示:

7. 总结

当上述步骤执行完成后我们便可在浏览器中看到一个完整的页面了, 总结下其实就只有几步:

  1. 浏览器地址栏输入url
  2. 浏览器会先查看浏览器缓存系统缓存路由缓存, 如有存在缓存, 就直接显示。 如果没有, 接着第3步
  3. 域名解析(DNS)获取相应的 IP
  4. 浏览器向服务器发起 tcp 连接, 与浏览器建立 tcp 三次握手
  5. 握手成功, 浏览器向服务器发送 http 请求, 请求数据包
  6. 服务器请求数据, 将数据返回到浏览器
  7. 浏览器接收响应, 读取页面内容, 解析 html 源码, 生成 Dom 树
  8. 解析 css 样式、 浏览器渲染, js交互

其实简单来看这几个过程并不是很复杂, 但是每个步骤都可以深挖出一大堆的知识, 比如DNS的优化、页面渲染的优化、 HTTPS等等非常多的东西, 这里考虑到篇幅以及科普效果很多东西都一笔带过了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java3y 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从输入URL到页面加载发生了什么
问题:在浏览器中输入URL到整个页面显示在用户面前时这个过程中到底发生了什么。仔细思考这个问题,发现确实很深,这个过程涉及到的东西很多。
Java后端技术
2018/08/09
1.4K0
从输入URL到页面加载发生了什么
[ WEB ] 从地址栏输入 URL 之后发生了啥?
在输入地址栏之前,浏览器会对输入的内容进行检查,如果是一个符合格式的正确 url 就会执行 DNS解析,如果不是,比如输入了一些字符串,那么就会执行搜索功能。如图:
GavinUI
2021/04/12
1.3K0
[ WEB ] 从地址栏输入 URL 之后发生了啥?
用户输入网址到页面返回都发生了什么?
浏览器做的第一步就是会解析URL得到里面的参数,分析域名是否规范,并将域名和需要的请求的资源分离开来,从而了解需要请求的是哪个服务器,请求的是服务器上的什么资源等等
不叫猫先生
2023/11/04
2490
用户输入网址到页面返回都发生了什么?
用户输入网址到页面返回都发生了什么?(全面分析)
浏览器做的第一步就是会解析URL得到里面的参数,分析域名是否规范,并将域名和需要的请求的资源分离开来,从而了解需要请求的是哪个服务器,请求的是服务器上的什么资源等等
can4hou6joeng4
2023/11/29
2030
经典面试题:在浏览器地址栏输入一个 URL 后回车,背后发生了什么
在浏览器的地址栏输入一个 URL 后回车,背后到底发生了什么才能使得一个界面完美的展现在我们眼前?
飞天小牛肉
2021/02/26
6.5K1
经典面试题:在浏览器地址栏输入一个 URL 后回车,背后发生了什么
终极解密输入网址按回车到底发生了什么
详解输入网址点击回车,后台到底发生了什么。透析 HTTP 协议与 TCP 连接之间的千丝万缕的关系。掌握为何是三次握手四次挥手?time_wait 存在的意义是什么?全面图解重点问题,再也不用担心面试问这个问题。
码哥字节
2020/10/27
7090
终极解密输入网址按回车到底发生了什么
从百度/谷歌搜索上输入一个网址,到浏览器加载出网站页面的过程中,发生了什么
先看本地域名服务器是否缓存该地址,然后各服务器依次递归.(根域名服务器) -> .com -> google.com. -> www.google.com.(这样是不是会造成多次请求连接浪费资源?)
归思君
2023/10/16
2740
从百度/谷歌搜索上输入一个网址,到浏览器加载出网站页面的过程中,发生了什么
在浏览器中输入网址到页面显示出来,这中间到底发生了什么?
(1)检查本地hosts文件是否有这个网址的映射,如果有,就调用这个IP地址映射,解析完成。
谭庆波
2018/08/10
1.1K0
从输入URL到页面展示到底发生了什么
地址:http://www.cnblogs.com/xianyulaodi/ 作者:咸鱼老弟
java思维导图
2018/07/26
1.9K0
从输入URL到页面展示到底发生了什么
【计网】网络协议栈学习总结 --- 浏览器上输入网址域名后点击回车,到底发生了什么?
经过对计算机网络的学习,我们了解了网络通信的过程,熟悉了网络协议栈各个层的工作机制与作用。那么现在我们回过头来看一个问题:
叫我龙翔
2024/10/31
1040
【计网】网络协议栈学习总结 --- 浏览器上输入网址域名后点击回车,到底发生了什么?
从输入url到页面展示到底发生了什么?
刚开始写这篇文章还是挺纠结的,因为网上搜索“从输入url到页面展示到底发生了什么”,你可以搜到一大堆的资料。而且面试这道题基本是必考题,二月份面试的时候,虽然知道这个过程发生了什么,不过当面试官一步步追问下去的,很多细节就不太清楚了。
沙漠尽头的狼
2021/12/01
1.1K0
从输入url到页面展示到底发生了什么?
从URL输入到页面展现到底发生什么?
打开浏览器从输入网址到网页呈现在大家面前,背后到底发生了什么?经历怎么样的一个过程?先给大家来张总体流程图,具体步骤请看下文分解!
Nealyang
2019/09/29
1K0
从URL输入到页面展现到底发生什么?
【前端芝士树】从浏览器搜索框输入网址到网页呈现发生了什么?
首先需要搞明白的是,域名和ip地址是不同的,域名是为了更方便记忆ip所产生的,ip才是服务器在网络上的真实地址。
CloudCat
2022/05/06
5860
【前端芝士树】从浏览器搜索框输入网址到网页呈现发生了什么?
40张图揭秘,「键入网址发生了什么」
从上图可知,URL 中可以包含服务器的域名,文件的路径,收件人邮件地址,用户名,密码等信息。总之URL想表达的是:
我是程序员小贱
2020/08/18
6420
40张图揭秘,「键入网址发生了什么」
从输入网址到显示网页的全过程分析
作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等。 本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事~ 1. 首先嘛,你得在浏览器里输入要网址: 2. 浏览器查找域名的IP地址 导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下: * 浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会
空空云
2018/09/27
2.4K0
一个页面从输入URL到加载显示完成,发生了什么?
面试经典题——URL加载 一、涉及基本知识点: 1. 计算机网络 五层因特尔协议栈: 应用层(dns、http):DNS解析成IP并完成http请求发送; 传输层(tcp、udp):三次握手四次挥手模式建立tcp连接; 网络层(IP、ARP):IP寻址; 数据链路层(PPP):将请求数据封装成帧; 物理层:利用物理介质传输比特流(传输的时候通过双绞线、电磁波等) OIS七层框架:多了两层即,会话层(处理两个通信系统中交换信息的表示方式)和表示层(管理不同用户和进程之间的对话)。 get和post的
keyWords
2018/09/19
1.6K0
从URL输入到页面展现到底发生什么?
URL(Uniform Resource Locator),统一资源定位符,用于定位互联网上资源,俗称网址。
loveX001
2022/09/30
5680
浏览器输入URL后发生了什么
在网络世界,你肯定记得住网站的名称,但是很难记住网站的 IP 地址,因而也需要一个地址簿,就是 DNS 服务器。DNS 服务器是高可用、高并发和分布式的,它是树状结构,如图:
前端迷
2020/02/19
4.3K0
浏览器输入URL后发生了什么
从浏览器输入网址回车到看到页面过程到底经历了什么?
#前言:从浏览器输入网址到回车看到页面的过程,面试逃不掉的一个问题,我们知道从浏览器输入网址到看到页面主要是涉及DNS解析,TCP三次握手,请求报文,响应报文,TCP4次挥手。
老油条IT记
2020/08/13
5090
从浏览器输入网址回车到看到页面过程到底经历了什么?
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
在软件开发、Java、后端的面试中,浏览器中输入URL到页面返回的全过程 是一道非常经典的面试题,更是经常被作为面试的压轴题出现。有时也会通过其他方式来问,譬如:
寻求出路的程序媛
2024/11/05
2160
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
推荐阅读
相关推荐
从输入URL到页面加载发生了什么
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文