from 从输入 URL 到页面加载的过程?如何由一道题完善自己的前端知识体系!
作为进阶回头再来看看:从输入 URL 到页面加载完成的过程中都发生了什么事情?
开启网络线程到发出一个完整的 http 请求
这一部分主要是 dns
查询, tcp/ip
请求,五层因特网协议栈等
DNS
查询得到 IP
输入的是主机名字的话,需要解析成 ip
- 如果浏览器有缓存,直接用浏览器缓存,否则使用本机缓存,否则使用
host
- 如果本地没有,就向
dns
域名服务器查询(中间也有路由缓存等待),查询到对应的ip
域名查询时可能经过了 CDN
调度器(如果有 CDN
存储功能的话)
如果解析域名过多的话,DNS
解析是很耗时间的,这样会让首屏加载时间变得很慢,可以考虑 dns-prefetch
优化(这块需要网上再找找看)
tcp/ip
请求
tcp
把 http
长报文划分为短报文,通过三次握手和服务器建立连接,进行可靠传输
三次握手
- 客户端:
hello
你是server
么(server
可以确认自己的 收 和client
的 发 是正常的) - 服务端:
hello
我是server
你是client
吗 (client
可以确认自己的 收发 和server
的 收发 都是正常的) - 客户端:
yes
我是client
(server
可以确认自己的 发 和client
的收 是正常的)
最终双发都各自确认了自己的和对方的 收发 是正常的,然后就可以正常传输数据了
四次挥手
- 主动方:我关闭了向你的主动通道,只能被动接收了
- 被动方:收到通道关闭的消息
- 被动方:我也关闭向你的主动通道了
- 主动放:收到数据,无法通信了
备注:这块有点简单,要再看看其他的
tcp/ip
并发限制
浏览器对同一个域名下的并发 tcp
连接有限制 (2-10 个)
而且在 http1.0
的时候一个资源下载就要一个 tcp/ip
请求
所以这块也有很多优化的空间
get/post 区别
本质上都是 tcp/ip
,但是除了 http
层以外,在 tcp/ip
也有区别
get
会产生一个 http
包, post
有两个
get
请求的时候,会把headers
和data
一起发送出去,服务器响应200
post
请求的时候,先发送header
,服务器响应100 continue
,浏览器再发送data
,服务器响应200
五层因特网协议栈
客户端发出请求到服务器接受,经过了一系列的流程
应用层发送 http
请求,到传输层通过三次握手建立 tcp/ip
连接,再通过网络层的 ip
寻址,再到数据链路层的封装成帧,最后到物理层的利用物理介质传输
- 应用层: (
dns
http
ftp
)dns
解析成ip
,发送http
请求 - 传输层: (
udp
tcp
) 建立tcp
连接,三次握手 - 网络层: (
ip
arp
)IP
寻址 - 数据链路层: (
ppp
) 封装成帧 - 物理层: (利用物理介质传输比特流) 物理传输,比如双绞线,电磁波
七层协议多了 会话层 和 表示层
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
- 表示层: 主要处理两个通信系统中交换信息的表达方式,包括数据格式交换,数据加密和解密,数据压缩与终端类型转换
- 会话层: 管理不同用户与进程之间的对话,如控制登陆和注销