URL解析
当我们输入一个地址 www.baidu.com
,首先会把该 URL 解构。
URL 的格式
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
URL的构成
- protocol(协议)
- hostname(主机名)
- port(端口号)
- path(路径)
- parameters(参数)
- query(查询)
- fragment(信息片断)
域名解析
域名注册商有 DNS服务器, 它可以将我们输入的 URL解析到一台 WEB 服务器的 IP地址上。
什么是 DNS
DNS也叫做域名系统,它将域名和 IP映射成为一个分布式数据库, 它可以帮助我们将域名转换为 IP 地址。
客户机域名解析的顺序
- 用户在浏览器中输入
www.fxiaoe.com
- 首先会查看
本地DNS缓存
, 如果本地没有缓存, - 再查看本地
hosts
文件, 如果hosts文件中未找到映射, - 从本地TCP/IP配置中的
首选的DNS服务器
查询, 如果还未查询到, - 则从备用DNS服务器查询。
服务器域名解析的顺序
本地 DNS 服务器
会调用域名解析函数,- 默认情况下, 解析器先向根域名服务器发起解析请求(.)
- 再由根域名逐级向下级域名查询。
- 如果配置了转发器, 解析器会多次向响应的根域名、顶级域名、权威域名发起解析请求。
总结一下,客户机属于递归查询, 服务器属于迭代查询。
DNS常见的记录类型
-
主机记录(A记录)
返回域名指向的IP地址
-
别名记录(CNAME记录)
返回另一个域名,即当前查询的域名是另一个域名的跳转
-
域名服务器记录(NS记录)
返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
DNS优化
dns-prefetch
**dns-prefetch
**是DNS 预解析技术, 浏览器页面加载时会提前解析页面内的其他域名,当我们点击网址的时候,无需等待预等待解析。
如何使用dns-prefetch
<meta http-equiv="x-dns-prefetch-control" content="on" /> //开启dns-prefetch
<link rel="dns-prefetch" href="https://www.baidu.com" />
建立TCP连接
三次握手建立连接
- 客户端向服务器发送一个连接请求
- 服务器收到连接请求后,若同意连接, 则发送一个确认响应
- 客户端收到后, 回应服务器已收到。
为什么要进行三次握手?
一些因网络阻塞等原因,让失效的客户端请求,延迟请求到服务器上, 服务器触发误确认的操作。
当我们发出一个客户端连接请求后, 由于网络原因,请求会延迟在网络的某个节点上, 若客户端未收到服务器响应的确认连接,客户端会再次发送一次连接请求, 第二次请求同样延迟, 这时服务器收到第一次链接请求, 成功建立TCP连接, 传输完毕数据又释放了连接,释放结束后,第二次客户端的连接请求才到达服务器, 若没有第三次握手, 服务器会认为客户端又需要建立连接, 但其实并不是新的连接, 而是上一次的延迟连接请求。
发送HTTP请求
负载均衡
用户发起的请求都指向调度服务器(反向代理服务器,譬如安装了nginx控制负载均衡),然后调度服务器根据实际的调度算法,分配不同的请求给对应集群中的服务器执行,然后调度器等待实际服务器的HTTP响应,并将它反馈给用户。
http报文结构
报文一般包括了:通用头部
,请求/响应头部
,请求/响应体
状态码
1xx——指示信息,表示请求已接收,继续处理
2xx——成功,表示请求已被成功接收、理解、接受
3xx——重定向,要完成请求必须进行更进一步的操作
4xx——客户端错误,请求有语法错误或请求无法实现
5xx——服务器端错误,服务器未能实现合法的请求
服务器处理请求
服务器返回一个 HTTP 响应
浏览器显示 HTML
接受完从服务器发送至浏览器的内容之后,浏览器渲染网页,把网页内容呈献给用户。
1. 解析HTML,构建DOM树
2. 解析CSS,生成CSS规则树
3. 合并DOM树和CSS规则,生成render树
4. 布局render树(Layout/reflow),负责各元素尺寸、位置的计算
5. 绘制render树(paint),绘制页面像素信息
6. 浏览器会将各层的信息发送给GPU,GPU会将各层合成(composite),显示在屏幕上
连接结束
客户端与服务端断开连接,进行四次挥手