在浏览器中输入一个URL按回车之后发生了哪些事情?
- 查看浏览器中是否有缓存存在。即查看浏览器中是否曾记录过当前的域名和IP
- 查看操作系统中是否有映射。 /etc/hosts
- 若没有就会将域名发送给LDNS本地域名服务器(如学校、或小区)
- 若LDNS无缓存,直接访问root DNS server 获取顶级的域名地址(如.com)
- 向顶级域名服务器访问获取返回权限域名服务器地址。如(baidu.com)
- 访问权限域名服务器访问获取到IP地址(如www.baidu.com)- 发起TCP三次握手建立连接
- 发送HTTP请求
- 服务器相应之后浏览器解析拿到的HTML代码,并请求HTML中的资源(图片、JS等)
浏览器工作原理
整个过程就是由URL转换为bitmap的过程。
- 从先发出请求到服务器,然后服务器返回 HTML
- 浏览器对HTML进行文本分析或编译,构建DOM树。
- 计算CSS属性,对DOM树上对应着哪些CSS规则,哪些规则会发生叠加,或者发生覆盖,将计算后的最终结果挂载到DOM树上,得到一个带样式的DOM树。
- 然后进行排版。即计算产生的盒子的位置及大小等等,计算出来。
- 最后渲染成位图(bitmap),然后经过操作系统或硬件(显卡)驱动的API完成视图的显示。
状态机
有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。
- 每一个状态都是一个机器
- 所有的这些机器接收的输入都是一致的,如制定接收为string,就不能接收一个obj
- 每一个机器都知道下一个状态
- 每个机器都有确定的下一个状态(Moore)
- 每个机器根据输入决定下一个状态。(Mealy)每个状态应该回到哪里,在编写程序时就已经决定好了
如自动门,有开和关两种状态,当读取到开门信号时,状态就会切换为open,当接收到close信号时,就会把状态切换成close。
JS中实现一个Mealy状态机
1 | // 每一个函数都是一个状态 |
不使用状态机查找字符串IO
1 | function match(state) { |
使用状态机查找字符串IO
1 | function match(string) { |
TCP/IP协议、HTTP
特点
- 灵活可扩展。如header里增加了content-type指定文件的编码类型,除了文本也可以传输图片以及音视频。
- 可靠传输。 继承了TCP可靠的特性。
- 应用层协议
详见web协议详解
发送HTTP请求
1 | // server.js |
1 | // client.js |
解析HTML
HTML 词法分析
- 开始标签
- 结束标签
- 自封闭标签
- 判断标签起始位置是否为’<’
- 判断下一个字符是否为’/‘,如果是则进入结束标签的计算,如果是字符串则+=当前的tagName
- 进入结束标签后,+=当前的tagName取到当前的tagName
- 若在tagName中匹配到空格、tab、禁止符、换行符等,则进入attribute标签匹配
- 若遇到空格或者’/‘等表示当前标签结束,进入endAttribute
语法分析
HTML的语法是由一个个的状态机去实现的。
详见HTML tokenizetion
- 使用栈建立节点的父子关系构建DOM树
- 遇到开始标签时压入栈
- 遇到结束标签时出栈
- 自封闭节点不做处理或者理解为入栈后立即出栈
- 任何元素的父元素都是它入栈前的栈顶元素
- 文本节点与自封闭标签的处理类似
- 需要合并多个文本节点
ele| inline | id | class | tagName|
| — | — | — | — | — |
| div div #id | 0 | 1 | 0| 2|
| div #my #id | 0 | 2 | 0|1 |
| div #id| 0 | 1 | 0 | 1 |
1 |
|
`
排版
- 预处理,如px或者数字转为Number类型便于运算、宽高auto或者为空时,设置为null
- flex布局的样式给其添加默认值,如align-item、flexWrap等。