输入url到整个页面呈现发生了什么。

这个问题可以分两个方面回答:网络通信和浏览器渲染。

网络通信

DNS解析

用户输入url点击回车。先会进行DNS解析。
由于用户输入的url浏览器不能识别,因此需要通过DNS域名系统(域名和IP地址映射)对url进行解析,得到想要得到网站的主机名对应的ip地址。

  • 浏览器首先会搜索自身DNS缓存,浏览器缓存大概1000条
  • 如果本机没找到,就会在操作系统中寻找。
  • 如果还未找到,就对DNS服务器发起域名解析请求,最后在根域名中的DNS中找到ip地址。
TCP三次握手

拿到对应的ip之后,浏览器会以随机端口向服务器的http80端口发起TCP连接请求,这个请求通过4层模型的封包,根据IP地址,通过各种路由、网关(ARP,MAC),到达服务器端,进入内核的TCO/IP协议栈,层层解包,最终到达应用层,建立TCP/IP连接。

因为TCP是面向连接的,所以需要先通过三次握手建立连接,三次握手的目的:同步连接双方的序列号和确认号,交换TCP窗口信息。


三次握手
  1. 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位 置为1,Sequence Number(seq)为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
  2. 服务器收到SYN报文段。对报文进行确认,将ACK设置为x+1(seq+1) ,服务器端将所有信息(即SYN+ACK+seq报文段)放到一个报文段中,一并发送给客户端,此时服务器进入SYN_RECV状态;
  3. 客户端收到SYN+ACK+Seq报文,将ACK设置为y+1(seq+1),向服务器发送ACK报文段,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

为什么要三次握手
防止已失效的连接请求报文段传送给服务器。client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。这样,server的很多资源就白白浪费掉了

在这里提前普及一下,在数据传输完毕后,断开TCP连接,就是四次挥手。


四次挥手
  1. 主机1(挥手既可以是客户端也可以是服务器端),设置sequence number ,向主机发送一个FIN报文段,主机1进入FIN_WAIT_1状态,表示主机1没有数据发给主机2了
  2. 主机2收到主机1发送的FIN报文段,向主机1回一个ACK报文段,主机1进入FIN_WAIT_2状态
  3. 主机2向主机1发送FIN报文段,请求关闭连接,主机2进入LAST_ACK状态
  4. 主机1收到主机2的报文段,向主机2发送ACK报文,主机2接到后关闭连接,主机1等待MSL后,关闭连接(MSL报文最大生存时间,TCP的TIME_WAIT状态也称为2MSL等待状态)
    为什么要四次分手
    TCP面向连接,且全双工,主机1没有数据发送的时候,主机2可能还在发送数据,所以主机2告诉主机1收到数据,还要告诉主机1发送完数据。

为什么要等待2MSL
它是任何报文段被丢弃前在网络内的最长时间,超过这个时间报文会被丢弃。如果主机1直接close,然后再向相同服务器相同端口发送请求,可能会混淆数据包。此外主机2没有收到ACK,那么就会继续发送一次FIN

发起http请求

建立TCP/IP连接后,客户端向服务器端发起http请求,

浏览器渲染流程

浏览器主要组成
浏览器主要组件
渲染引擎流程
渲染流程
  1. 解析html构建DOM树
    浏览器接收到服务器响应来的html文档开始,遍历文档节点,字节转化为字符,字符转化为标记,生成dom树。

html解析分为标记化和树构建。词法分析时将输入内容解析成多个标记,HTML标记包括起始标记、结束标记、属性名称和属性值。标记生成器识别标记,传递给树构造器,然后接受下一个字符以识别下一个标记;如此反复直到输入的结束。 标记生成器发送的每个节点都会由树构建器进行处理。
初始状态是数据状态。遇到字符 < 时,状态更改为“标记打开状态”。接收一个 a-z字符会创建“起始标记”,状态更改为“标记名称状态”。这个状态会一直保持到接收> 字符。在此期间接收的每个字符都会附加到新的标记名称上。


构建dom树

2.解析css 构建cssom树:
浏览器解析css文件并城市css树。css从右向左解析,嵌套越多越增加浏览器工作量

  1. 渲染阻塞:
    浏览器遇到script标签,dom构建将停止,直到脚本完成执行,然后继续构建dom。所以在渲染时遵循两个原则:css引入在前,js放在页面底部,尽量少影响dom的构建,延长首绘时间,可以用async和defer实现异步加载。js解析由js解析器执行。

浏览器碰到script标签,会立刻执行脚本
async加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步),加载完立刻执行
defer加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但是 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。
defer和async区别在于下载完后何时执行,defer性能更优

  1. 构建渲染树:
    渲染引擎渲染。浏览器先从dom树中遍历可见节点,并找到其适配的css样式。dom树 css树 渲染树交叉进行,边加载、边解析、边渲染
    渲染树构建完成,渲染树和dom树并非一一对应,每个节点都是可见节点并且都含有其内容和对应规则的样式。display:none不会被显示在树中,visibility:hidden会显示在树中。
  2. 渲染树布局
    布局阶段会从渲染树的根节点开始遍历,然后确定每个节点对象在页面上的确切大小与位置,布局阶段的输出是一个盒子模型,它会精确地捕获每个元素在屏幕内的确切位置与大小。

布局过程为:
父节点确定自己的宽度

父节点完成子节点放置,确定其相对坐标

节点确定自己的宽度和高度
父节点根据所有的子节点高度计算自己的高度

  1. 渲染树绘制
    在绘制阶段,遍历渲染树,调用渲染器的paint方法在屏幕上显示其内容。由浏览器的ui负责
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容