从输入URL到页面加载的过程(3) - 开启网络线程到发出一个完整的http请求

Posted by cody1991 on July 25, 2020

from 从输入 URL 到页面加载的过程?如何由一道题完善自己的前端知识体系!

作为进阶回头再来看看:从输入 URL 到页面加载完成的过程中都发生了什么事情?

开启网络线程到发出一个完整的 http 请求

这一部分主要是 dns 查询, tcp/ip 请求,五层因特网协议栈等

DNS 查询得到 IP

输入的是主机名字的话,需要解析成 ip

  • 如果浏览器有缓存,直接用浏览器缓存,否则使用本机缓存,否则使用 host
  • 如果本地没有,就向 dns 域名服务器查询(中间也有路由缓存等待),查询到对应的 ip

域名查询时可能经过了 CDN 调度器(如果有 CDN 存储功能的话)

如果解析域名过多的话,DNS 解析是很耗时间的,这样会让首屏加载时间变得很慢,可以考虑 dns-prefetch 优化(这块需要网上再找找看)

tcp/ip 请求

tcphttp 长报文划分为短报文,通过三次握手和服务器建立连接,进行可靠传输

三次握手

  • 客户端:hello 你是 server 么(server可以确认自己的 收 和 client 的 发 是正常的)
  • 服务端:hello 我是 server 你是 client 吗 (client 可以确认自己的 收发 和 server 的 收发 都是正常的)
  • 客户端:yes 我是 clientserver可以确认自己的 发 和 client 的收 是正常的)

最终双发都各自确认了自己的和对方的 收发 是正常的,然后就可以正常传输数据了

四次挥手

  • 主动方:我关闭了向你的主动通道,只能被动接收了
  • 被动方:收到通道关闭的消息
  • 被动方:我也关闭向你的主动通道了
  • 主动放:收到数据,无法通信了

备注:这块有点简单,要再看看其他的

tcp/ip 并发限制

浏览器对同一个域名下的并发 tcp 连接有限制 (2-10 个)

而且在 http1.0 的时候一个资源下载就要一个 tcp/ip 请求

所以这块也有很多优化的空间

get/post 区别

本质上都是 tcp/ip,但是除了 http 层以外,在 tcp/ip 也有区别

get 会产生一个 http 包, post 有两个

  • get 请求的时候,会把 headersdata 一起发送出去,服务器响应 200
  • post 请求的时候,先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200

五层因特网协议栈

客户端发出请求到服务器接受,经过了一系列的流程

应用层发送 http 请求,到传输层通过三次握手建立 tcp/ip 连接,再通过网络层的 ip 寻址,再到数据链路层的封装成帧,最后到物理层的利用物理介质传输

  • 应用层: (dns http ftp) dns解析成ip,发送 http 请求
  • 传输层: (udp tcp) 建立 tcp 连接,三次握手
  • 网络层: (ip arp) IP 寻址
  • 数据链路层: (ppp) 封装成帧
  • 物理层: (利用物理介质传输比特流) 物理传输,比如双绞线,电磁波

七层协议多了 会话层 和 表示层

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

  • 表示层: 主要处理两个通信系统中交换信息的表达方式,包括数据格式交换,数据加密和解密,数据压缩与终端类型转换
  • 会话层: 管理不同用户与进程之间的对话,如控制登陆和注销