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一起发送出去,服务器响应200post请求的时候,先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200
五层因特网协议栈
客户端发出请求到服务器接受,经过了一系列的流程
应用层发送 http 请求,到传输层通过三次握手建立 tcp/ip 连接,再通过网络层的 ip 寻址,再到数据链路层的封装成帧,最后到物理层的利用物理介质传输
- 应用层: (
dnshttpftp)dns解析成ip,发送http请求 - 传输层: (
udptcp) 建立tcp连接,三次握手 - 网络层: (
iparp)IP寻址 - 数据链路层: (
ppp) 封装成帧 - 物理层: (利用物理介质传输比特流) 物理传输,比如双绞线,电磁波
 
七层协议多了 会话层 和 表示层
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
- 表示层: 主要处理两个通信系统中交换信息的表达方式,包括数据格式交换,数据加密和解密,数据压缩与终端类型转换
 - 会话层: 管理不同用户与进程之间的对话,如控制登陆和注销