当在浏览器输入google.com回车,根据github库中的分析,会发生24个过程,我们去除其中物理电路和部分前端、windows系统等步骤,将我们关心的步骤进行分析
一、解析输入#
解析获取协议、主机名、资源地址
根据协议和主机名判断文字是URL还是搜索关键字,if url: 3, if not url: 文字传给默认的搜索引擎
如果主机名部分含有非ASCII字符, 浏览器会对主机名部分使用 Punycode 编码
二、建立连接#
检查预加载 HSTS(HTTP严格传输安全)列表#
- 是否必须使用https请求,避免第一次非https请求
DNS查询#
- 查看 Chrome 缓存是否存在
- 调用 gethostbyname函数
- 是否在本地hosts文件,是 返回,否 ii
- 向本地DNS服务器发送请求,使用 53 端口向 DNS 服务器发送 UDP 请求包,如果响应包太大,会使用 TCP 协议,本地DNS服务器可能是在内网中,或者是在ISP的机房中
- 内网中的话直接ARP就可以找到MAC地址,就可以发DNS请求过去
- 外网ISP机房DNS服务器的话,也需ARP找到网关的MAC, 发送到网关,源MAC地址永远为客户端MAC地址,源IP通过NAT将内网IP转为外网IP加指定端口号, 目的MAC通过路由协议转为下一跳路由MAC, 目的IP为ISP外网IP, 数据包一直路由到ISP的网关,根据目的IP和端口号经过NAT转换包目的IP为内网dns ip, 通过ARP或缓存,目的mac改为dns服务器mac,发送请求至ISP dns服务器
- if 本地/ISP DNS 服务器找到结果,返回结果,if not: iv
- if 支持转发,它会发送一个递归查询请求,可能会一层一层向高层 DNS 服务器做查询,直到查询到起始授权机构,把结果返回
- 也可能本身不支持转发, 或向上查询过程中某DNS服务器不支持转发,则会开始进行迭代查询,通过先后查询根、顶级、权威dns服务获取对应ip
TCP封包#
- 当浏览器得到了目标服务器的 IP 地址,以及 URL 中给出来端口号(http 协议默认端口号是 80, https 默认端口号是 443),它会调用系统库函数 socket ,请求一个 TCP流套接字
- 请求首先被交给传输层,在传输层请求被封装成 TCP segment。目标端口会被加入头部,源端口会在系统内核的动态端口范围内选取
- TCP segment 被送往网络层,网络层会在其中再加入一个 IP 头部,里面包含了目标服务器的IP地址以及本机的IP地址,把它封装成一个IP packet
- 接下来会进入链路层,链路层会在封包中加入 frame 头部,里面包含了本地内置网卡的MAC地址以及网关(本地路由器)的 MAC 地址。如果不知道网关的 MAC 地址,需进行 ARP 广播。
路由#
- 数据包到路由器后会先进行NAT网络地址转换,将源内网IP转为外网IP和指定端口号,目的MAC通过路由协议转为下一跳路由MAC, 源MAC和目的IP不变
- 通过动态路由协议转发到下一跳路由器,直到转发到目的IP对应路由器
- 此时会通过NAT将数据包 目的IP地址由外网ip地址转为内网ip地址,源MAC地址转为网关MAC地址,目的MAC由网关MAC转为目标服务器MAC地址,如不知道MAC地址需要进行ARP
- 此为一个包路由到目标机器的过程
TCP三次握手#
- 你好,我是A; 你好A,我是B; 你好,B;
- 握手过程存在封包与路由
TLS 握手#
先非对称加密,然后对称加密,通过两边都知道的随机数和最后用服务端公钥加密的pre-master随机数,生成对称密钥,实现对称加密
数字证书是用CA私钥进行数字签名,此时如果本地的CA公钥和传过来的数字证书都是假的,是否能欺骗用户,不会,CA证书会由它的上级CA给它签名,确定它的身份,层层往上签名,一直到几个全球皆知的大CA root CA, 通过层层授信,确保传过来CA证书的正确性。同时保证了传过来的公钥的正确性
开始对称加密通信
三、服务端处理请求、客户端解析#
http请求处理#
- 服务器拆分请求: 1.HTTP 请求方法 2.域名 3. 请求路径/页面
- 验证其上已经配置了 google.com 的虚拟主机
- 验证 google.com 接受 GET 方法
- 验证该用户可以使用 GET 方法
- 务器安装了 URL 重写模块,服务器会尝试匹配重写规则
- 根据请求信息获取相应的响应内容,这种情况下由于访问路径是 “/“ ,会访问首页文件, 可以重写这个规则
- 使用指定的处理程序分析处理这个文件,假如 Google 使用 PHP,服务器会使用 PHP 解析 index 文件,并捕获输出,把 PHP 的输出结果返回给请求者
浏览器客户端解析#
- 解析 —— HTML,CSS,JS
- 渲染 —— 构建 DOM 树 -> 渲染 -> 布局 -> 绘制
参考文献:
github: https://github.com/skyline75489/what-happens-when-zh_CN
趣谈网络协议: https://pan.baidu.com/s/1CK4a_lw_cYqpMPr186vEsQ 提取码: dydr