一、在浏览器中输入一个网址
在浏览器中输入网址,敲击回车,就开始发起了请求。
整个过程大制如下:
1. 浏览器通过域名解析把输入的网址转换为对应的IP地址
2. 根据IP在互联网上找到对应的服务器,建立Socket链接
3. 客户端向服务器发送HTTP协议请求包,请求服务器中的资源
4. 到达负载均衡服务器,根据相应策略来分配用户请求到指定服务器来处理请求
5. 请求的数据可以存储在分布式缓存中,或者静态文件中,还有数据库等等
6. 当数据返回给浏览器是,浏览器解析数据和静态资源(css、js、jpg等等)时候又会发起另外一个请求,整个请求可能会在CDN上,那么CDN服务器有处理这个用户的请求
7. 关闭TCP链接,客户端与服务器断开。客户端解释HTML文档,在浏览器上渲染图形结果
一个HTTP的请求简单来说就是这样,很简单,但原理有很复杂。
PS:HTTP1.1开始,服务器可以与客户端保持长连接。
二、DNS域名解析
就是把输入在浏览器中的网址解析成IP地址,如果是直接通过ip地址来访问就不需要DNS域名解析,简单来说有以下几个步骤:
1. 浏览器缓存检查
浏览器首先搜索自身DNS缓存,缓存时间比较短(1min左右),只能容纳1000条缓存,看自身的缓存中是否有对应条目且没过期,如果有且没有过期则解析到此结束。
2. 操作系统缓存检查 + hosts解析
如果浏览器的缓存里没有对应条目,操作系统会有一个域名解析的过程。浏览器先搜索操作系统的 DNS 缓存中是否有这个域名对应的解析结果,如果找到且没有过期则停止搜索,解析到此结束。
Linux中可以通过/etc/hosts文件来设置,可以将任何域名解析到任何能访问到的ip地址。如果在这里指定了一个域名对应的 IP 地址,那么浏览器会首先使用这个 IP 地址。当解析到这个配置文件中的某个域名时,操作系统会在缓存中缓存这个解析结果,缓存的时间同样是受这个域名的失效时间和缓存的空间大小控制的。
3. 本地区域名服务器(Local DNS Server)解析
如果在 hosts 文件中也没有找到对应的条目,浏览器会发起一个 DNS 的系统调用,会向本地配置的首选 DNS 服务器发起域名解析请求(通过的是 UDP 协议向 DNS 的 53 端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址)。
在我们的网络配置中都会有“DNS 服务器地址”这一项,这个地址就用于解决前面所说的如果两个过程无法解析时要怎么办。操作系统会把这个域名发送给这里设置的 LDNS,也就是本地区的域名服务器。
这个 DNS 通常都提供给你本地互联网接入的一个 DNS 解析服务,例如你是在学校接入互联网,那么你的 DNS 服务器肯定在你的学校;如果你是在一个小区接入互联网的,那这个 DNS 就是提供给你接入互联网的应用提供商,即电信或者联通。大约 80% 的域名解析都到这里就已经完成了,所以 LDNS 主要承担了域名的解析工作。
4. 根域名服务器解析(RootServer)
如果 LDNS 没有找到对应的条目,则由运营商的 DNS 代我们的浏览器发起迭代 DNS 解析请求。它首先是会找根域的 DNS 的 IP 地址,找到根域的 DNS 地址,就会向其发起请求。然后根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址。
5. 主域名服务器(gTLD Server)
本地域名服务器(LDNS Server)再向上一步返回的 gTLD 服务器发送请求。
接受请求的 gTLD 服务器查找并返回此域名对应的 Name Server 域名服务器的地址,这个 Name Server 通常就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。
Name Server 域名服务器会查询存储的域名和IP的映射关系表,正常情况下都根据域名得到目标IP记录,连同一个 TTL 值返回给 DNS Server 域名服务器。
三、TCP三次握手
简易漫画版的三次握手
持续更新