统一资源定位符,是因特网上标准的资源的地址,用于定位互联网上资源,俗称网址。
scheme://host.domain:port/path/filename
协议://主机.域名:端口号/路径/文件名
而 URI 是统一资源标识符,是一个用于标识某一互联网资源名称的字符串。URL 是 URI 的子集。
因为浏览器并不能直接通过域名找到对应的服务器,而是要通过 IP 地址。因此就需要解析域名,因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。
DNS 是一个网络服务器,我们的域名解析简单来说就是在 DNS 上记录一条信息记录。如:
baidu.com 220.114.23.56(服务器外网IP地址)80(服务器端口号)
浏览器通过域名去查询 URL 对应的 IP 地址:
- 浏览器会按照一定的频率缓存 DNS 记录。
- 如果浏览器缓存中找不到需要的 DNS 记录,那就去操作系统中找。
- 路由器也有 DNS 缓存。
- ISP 是互联网服务提供商(Internet Service Provider)的简称,ISP 有专门的 DNS 服务器应对 DNS 查询请求。
- ISP 的 DNS 服务器还找不到的话,它就会向根服务器发出请求,进行递归查询(DNS 服务器先问根域名服务器.com 域名服务器的 IP 地址,然后再问.baidu 域名服务器,依次类推)。
起始的流程:浏览器通过向 DNS 服务器发送域名,DNS 服务器查询到与域名相对应的 IP 地址,然后返回给浏览器,浏览器再将 IP 地址打在协议上,同时请求参数也会在协议搭载,然后一并发送给对应的服务器。
浏览器在客户端发送数据之前会发起 TCP 三次握手,以同步客户端和服务端的序列号和确认号,并交换 TCP 窗口大小信息。
三次握手的流程如下:
客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口(第一次握手,由浏览器发起,告诉服务器我要发送请求了)。
服务器发回一个带 SYN=1, ACK=X+1, Seq=Y 的响应包以示传达确认信息(第二次握手,由服务器发起,告诉浏览器我准备接受了,你赶紧发送吧)。
客户端再回传一个带 ACK=Y+1, Seq=Z 的数据包,代表“握手结束”(第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧)。
三次握手的目的是为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
TCP 三次握手结束后,浏览器开始发送 HTTP 请求报文。
请求报文由 请求行(request line)、请求头(header)、请求体 三个部分组成。
请求行:包含 请求方法(GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE)、URL(请求地址,)、协议版本( http 版本号,比较流行的是 Http1.1 版本)。
请求头:包含请求的附加信息,以键值对形式组成,键和值用英文冒号“:”分隔。如: cache-control:no-cache
请求体:包含多个请求参数的数据。
服务器通过 web server 处理请求,常见的 web server 有 Apache 、 Nginx 、 IIS 等,它们担任管控的角色,对于不同用户发送的请求,会结合配置文件,把不同请求委托给服务器上处理相应请求的程序进行处理,例如 CGI 脚本,JSP 脚本,ASP 脚本等,然后返回后台程序处理产生的结果作为响应。
响应信息会以响应报文的形式返回给客户端,最后浏览器通过渲染引擎将网页呈现在用户面前。
响应报文由 响应行(request line)、响应头部(header)、响应主体 三个部分组成。
响应行:包含 协议版本,状态码,状态码描述。
响应头:包含响应报文的附加信息,由 键/值 对组成,与请求头的格式类似。
响应主体:包含回车符、换行符和响应返回的数据。
浏览器解析渲染页面分为五个步骤:
- 根据 HTML 解析出 DOM 树。
- 根据 CSS 解析生成 CSS 规则树。
- 结合 DOM 树和 CSS 规则树,生成渲染树。
- 根据渲染树计算每一个节点的信息。
- 根据计算好的信息绘制页面。
根据 HTML 解析出 DOM 树:
根据 CSS 解析生成 CSS 规则树:
结合 DOM 树和 CSS 规则树,生成渲染树:
根据渲染树计算每一个节点的信息:
根据计算好的信息绘制页面:
当数据传送完毕时,发起 tcp 四次挥手来断开连接。
四次挥手的流程如下:
发起方向被动方发送报文,Fin、Ack、Seq,表示已经没有数据传输了。并进入 FIN_WAIT_1 状态。(第一次挥手:由浏览器发起的,发送给服务器,我请求报文发送完了,你准备关闭吧)。
被动方发送报文,Ack、Seq,表示同意关闭请求。此时主机发起方进入 FIN_WAIT_2 状态。(第二次挥手:由服务器发起的,告诉浏览器,我请求报文接受完了,我准备关闭了,你也准备吧)。
被动方向发起方发送报文段,Fin、Ack、Seq,请求关闭连接。并进入 LAST_ACK 状态。(第三次挥手:由服务器发起,告诉浏览器,我响应报文发送完了,你准备关闭吧)。
发起方向被动方发送报文段,Ack、Seq。然后进入等待 TIME_WAIT 状态。被动方收到发起方的报文段以后关闭连接。发起方等待一定时间未收到回复,则正常关闭。(第四次挥手:由浏览器发起,告诉服务器,我响应报文接受完了,我准备关闭了,你也准备吧)。
TCP 是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。
因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时,当 Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉 Client 端,"你发的FIN报文我收到了"。只有等到 Server 端所有的报文都发送完了,Client 才能发送 FIN 报文,因此不能一起发送。故需要四次挥手。