新手必看:访问url到加载全过程详解(看完不会我吃shi)
1、放在前面:新手必须知道的那些概念
注:作为小白,对很多知识点、命名比较模糊,清晰的认识各个名词的涵义,这对于我们理解网络是非常有必要的
1.1 什么是IP、域名、主机名、url、服务器
名称 | 涵义 |
---|---|
IP | 例如:192.168.1.127 (这是一个ipv4的地址) IP分为静态IP和动态IP。 静态IP:一般是一些 公网、网站服务器 的IP地址,方便用户访问 动态IP:通过小区宽带上网等上网方式,每次分配到的ip都不相同 注:因为ip资源很宝贵,大部分用户都是通过动态ip上网的 |
端口 | 端口可分为虚拟端口和物理端口,我们平时说的 192.168.1.127:80,这个80就是www的默认端口,它是一个虚拟端口。类似还有3306(MySQL)、6379(Redis)等等 |
域名 | 由于IP地址不方便记忆,我们给IP地址取个别名,称之为域名,域名注册是要花钱的。例如:abc.com |
主机名 | 例如:www.abc.com,hhh.abc.com (一个域名可以对应多个主机名,这里的www、hhh都是主机名) |
hosts文件 | 在本地文件中以“IP - 域名 - 主机名”形式按行保存。在Ubuntu系统中,保存在/etc/hosts文件中,例如(这个例子里没有域名,): 192.168.1.127 master 192.168.1.130 slave1 192.168.1.131 slave2 |
url | 例如:https://leetcode-cn.com/problems/two-sum/ https是协议,leetcode-cn.com是域名,/problems/two-sum是这台服务器的problem目录下的two-sum文件 |
客户机 | 在网络系统的边缘向外发出网络请求的电脑、手机等 |
服务器 | 提供网络服务的主机(你可以把它想象成一台电脑,比如我们可以在自己的虚拟机配置一台服务器主机提供MySQL服务) |
1.2 http & https
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
- 放一张https的通信时序图:
1.3 OSI七层模型
一张图简要的介绍一下,七层模型主要用于学习理解:
注:七层模型主要用于学习理解,实际用到更多的是结合了下面两个模型的五层模型(五层协议栈),如下图
2、过程一:客户端的处理过程
概述:
浏览器接收url(按下回车)—>浏览器开启网络请求线程
—>dns查询 —>tcp/ip请求 —>通过五层因特网协议栈
—>多次路由转发到达目的主机子网进而到达目的主机(服务器)
2.1 浏览器开启网络线程
不是重点过程,笔者在此不做赘述。具体过程看这两篇文章:
(1)浏览器接收URL开启网络请求线程
(2)浏览器有哪些进程?
2.2 DNS查询
(1)域名分层次,所以也叫DNS层次查询:
层次 | 涵义 |
---|---|
根域名 | 全球13台根域名服务器,位于域名空间最顶层,一般用一个 “.” 表示 |
*域 | 一般代表一种类型的组织机构或国家地区,如 net、com、org、edu、gov、mil、cn、jp、hk |
二级域名 | 用来标明*域内的一个特定的组织,国家*域下面的二级域名由国家网络部门统一管理,如 .cn *域名下面设置的二级域名:.com.cn、.net.cn、.edu.cn … |
子域名 | 二级域下所创建的各级域统称为子域,各个组织或用户可以*申请注册自己的域名 |
主机名 | 主机位于域名空间最下层,就是一台具体的计算机,如 www、mail、都是具体的计算机名字,可用www.sina.com.cn.、mail.sina.com.cn. 来表示,这种表示方式称为 FQDN (完全合格域名),也是这台主机在域名中的全名 |
(2)查询过程,分为两种:递归、迭代
递归查询过程:(图片来自DNS递归和迭代查询,侵删)
迭代查询过程:
2.3 TCP请求
注:TCP与HTTP不要搞混了,可以了解一下前文的OSI七层模型
(1)三次握手
Q:为什么是三次握手?
假如是两次握手,会发生什么情况呢? 答:无法保证可靠且稳定的传输
需要考虑到网络的情况非常复杂,如果应答消息在网络中被阻塞或者丢包了,服务端在发出应答消息后,它不能确认客户端是否接受到消息了,那么这样意味着只有客户端可以向服务端发送数据。
假如是四次握手呢?三次就可以保证了一个稳定的传输流了,四次浪费资源和性能。
(2)四次挥手
Q:为什么是四次挥手?
如果是三次挥手,在服务器接收到客户端发送关闭的请求后,把SYN和ACK包一起发过去。这样会造成服务端还有数据没有发送完,造成了数据的丢失。所以中间的这一段时间,等待服务器把剩余的数据发送完是很有必要的。
Q:三次握手建立连接之后能坚持多久?
默认情况下一条TCP连接在2小时(7200秒)都没有报文交换后,会开始进行保活探测,若再经过9*75秒=11分钟15秒的循环探测都未收到探测响应,即共计:2小时11分钟15秒后会自动断开TCP连接。
详情参见这两篇文章:
HTTP keep-alive和TCP keepalive的区别,你了解吗?
TCP长连接与短连接
2.4 经过五层协议栈
七层模型与五层模型的联系与区别请见上文
- 在建立TCP连接之后,就可以发送数据了。数据包在经过网络各层协议栈的时候,会进行层层封装:即加数据头或者加头加尾(与之对应的是另一端的去头去尾)
数据包流动路线:
层层封装:
3、过程二:服务端的处理过程
3.1 负载均衡(还没到服务器呢)
Q:什么是负载均衡?
负载均衡又分为四层负载均衡和七层负载均衡。四层负载均衡工作在OSI模型的传输层,主要工作是转发,它在接收到客户端的流量以后通过修改数据包的地址信息将流量转发到应用服务器。
Q:为什么要负载均衡?
随着互联网的发展,公司业务流量越来越大并且业务逻辑也越来越复杂,单台机器的性能问题以及单点问题凸显了出来,因此,需要多台机器来进行性能的水平扩展以及避免单点故障。
Q:如何做到负载均衡?
- DNS轮询是最简单的负载均衡方式。以域名作为访问入口,通过配置多条DNS A记录使得请求可以分配到不同的服务器。
- CDN(Content Delivery Network,内容分发网络)。通过发布机制将内容同步到大量的缓存节点,并在DNS服务器上进行扩展,找到里用户最近的缓存节点作为服务提供节点。
注:因为很难自建大量的缓存节点,所以通常使用CDN运营商的服务。目前国内的服务商很少,而且按流量计费,价格也比较昂贵。- IP负载均衡——基于特定的TCP/IP技术实现的负载均衡
比如NAT、DR、Turning等,是最经常使用的方式。
IP负载均衡可以使用硬件设备,也可以使用软件实现。硬件设备的主要产品是F5-BIG-IP-GTM(简称F5),软件产品主要有LVS、HAProxy、NginX。其中LVS、HAProxy可以工作在4-7层,NginX工作在7层。
硬件负载均衡设备可以将核心部分做成芯片,除了贵其它都很棒;
软件负载均衡通常是开源软件。*度较高,但是难学;
了解一下nginx反向代理
Q:(底层原理之)你知道哪些负载均衡算法?
1、轮询法(easy)
将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
2、随机法(easy)
通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接于均分配调用量到后端的每一台服务器,也就是轮询的结果。
3、源地址哈希法(easy)
源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
4、加权轮询法(mid)
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
5、加权随机法(mid)
与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
6、最小连接数法(mid)
最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
7、一致性哈希算法(hard)
哈希的改良版,简而言之,增加虚拟节点防止数据倾斜。具体看这里:一致性哈希算法
3.2 安全保证(想到服务器没那么简单)
- 一般http是比较不安全的,要解决安全问题需要使用https,否则自己手动配置安全加密比较复杂,而且还不能解决大部分问题。
- 这位大佬讲的很好:http&https安全性问题
3.3 后台处理(既然来了就好好招待一下)
一般后台都是部署到容器中的,所以一般为:
- 先是容器接受到请求(如tomcat容器)
- 对应容器中的后台程序接收到请求(如java程序)
- 后台会有自己的统一处理,处理完后响应响应结果
大致是这样的:
当验证通过后,才会进入实际的后台代码,此时是程序接收到请求,然后执行(譬如查询数据库,大量计算等等)
等程序执行完毕后,就会返回一个http响应包(一般这一步也会经过多层封装) 然后就是将这个包从后端发送到前端,完成交互
3.4 响应请求
(注:萌新可以按一下F12了解一下当前网页交换的数据包哦)
- HTTP用报文作为信息的载体,所以我们需要了解HTTP报文结构:
关于响应的各种 http状态码,放两张图:
4、过程三:客户端浏览器接受数据包的处理过程
(注:这里大多是前端知识,就不过多阐述了)
html解析 -> css解析 -> 页面渲染、绘制 -> JS引擎解析 -> 渲染
5、结尾
参考了很多博客,算是一篇汇总吧,给出的链接有很多大佬的讲解,非常不错,大家一起进步。
(看完还不会?来咱俩一起吃!)