本文是一篇学习笔记,学习的课程是极客时间的《透视HTTP协议》。
透视HTTP协议_HTTP_HTTPS-极客时间 (geekbang.org)
本文主要描述发起请求后,具体的处理过程。
目录
一、简述浏览器HTTP请求过程
示例:在Chrome浏览器的地址栏里输入“http://127.0.0.1/”,再按下回车键。
-
浏览器从地址栏的输入中获得服务器的IP地址和端口号;
-
浏览器用TCP的三次握手与服务器建立连接;
-
浏览器向服务器发送拼好的报文;
-
服务器收到报文后处理请求,同样拼好报文再发给浏览器;
-
浏览器解析报文,渲染输出页面。
注意:第1个步骤中,如果地址栏输入的是域名,浏览器会发起域名解析动作,通过访问一系列的域名解析服务器,试图把这个域名翻译成TCP/IP协议里的IP地址。
域名解析的过程可以看上一篇文章。
二、详述浏览器HTTP请求过程
真实的互联网世界是怎么样子的?可以看下面这张图:
网络处理过程如下:
1、如果上网用的是电脑台式机,那么可能会使用带水晶头的双绞线连上网口,由交换机接入固定网络;如果上网用的是手机、平板电脑,那么可能会通过蜂窝网络、WiFi,由电信基站、无线热点接入移动网络。
2、接入网络的同时,网络运行商会给上网的设备分配一个IP地址,这个地址可能是静态分配的,也可能是动态分配的。静态IP就始终不变,动态IP可能下次上网就变了。
3、假设要访问的是Apple网站,在浏览器里使用域名“www.apple.com”访问,这时浏览器会发起域名解析动作。
4、DNS协议开始从操作系统、本地DNS、根DNS、顶级DNS、权威DNS的层层解析,当然这中间有缓存,可能不需要层层解析就可以拿到IP地址。
5、但是互联网上还有另外一个重要的角色CDN,它也会在DNS的解析过程中“插上一脚”。DNS解析可能会给出CDN服务器的IP地址,这样拿到的就会是CDN服务器而不是目标网站的实际地址。因为CDN会缓存网站的大部分资源,比如图片、CSS样式表,所以有的HTTP请求就不需要再发到Apple,CDN就可以直接响应你的请求,把数据发给你。
6、但是由于PHP、Java等后台服务动态生成的页面属于“动态资源”,CDN无法缓存,只能从目标网站获取。于是你发出的HTTP请求就要开始在互联网上的“漫长跋涉”,经过无数的路由器、网关、代理,最后到达目的地:目标服务器。
7、目标网站的服务器对外表现的是一个IP地址,但为了能够扛住高并发,在内部也是一套复杂的架构。通常在服务器的入口是负载均衡设备,例如四层的LVS或者七层的Nginx,在后面是许多的服务器,构成一个更强更稳定的集群。
8、负载均衡设备会先访问系统里的缓存服务器,通常有memory级缓存Redis和disk级缓存Varnish,它们的作用与CDN类似,不过是工作在内部网络里,把最频繁访问的数据缓存几秒钟或几分钟,减轻后端应用服务器的压力。
9、如果缓存服务器里也没有,那么负载均衡设备就要把请求转发给应用服务器了。这里就是各种开发框架大显神通的地方了,例如Java的Tomcat/Netty/Jetty,Python的Django,还有PHP、Node.js、Golang等等。它们又会再访问后面的MySQL、PostgreSQL、MongoDB等数据库服务,实现用户登录、商品查询、购物下单、扣款支付等业务操作,然后把执行的结果返回给负载均衡设备,同时也可能给缓存服务器里也放一份。
10、应用服务器的输出到了负载均衡设备这里,请求的处理就算是完成了,就要按照原路再走回去,还是要经过许多的路由器、网关、代理。如果这个资源允许缓存,那么经过CDN的时候它也会做缓存,这样下次同样的请求就不会到达源站了。
11、最后网站的响应数据回到了你的设备,它可能是HTML、JSON、图片或者其他格式的数据,需要由浏览器解析处理才能显示出来,如果数据里面还有超链接,指向别的资源,那么就又要重走一遍整个流程,直到所有的资源都下载完。
敲黑板:
建立TCP连接后会顺序收发数据,请求方和应答方都必须依据HTTP规范构建和解析报文;
为了减少响应时间,整个过程中的每一个环节都会有缓存,能够实现“短路”操作;
标签:缓存,浏览器,请求,透视,笔记,域名,服务器,HTTP From: https://blog.csdn.net/MAOZI8/article/details/139652074题外话:
这一节课里讲的都是正常的请求处理流程,如果是一个不存在的域名,那么浏览器的工作流程会是怎么样的呢?
- 用户输入与URL检查:用户在地址栏按下回车,浏览器检查输入的字符串是否符合URL规则,并尝试组装完整的URL
- 查找缓存:浏览器首先会检查自身的缓存,看看是否有之前对该域名的解析记录。如果没有,则会继续查找系统缓存,然后是hosts文件等。
- 域名解析:
- 如果在缓存中没有找到对应的记录,浏览器会开始域名解析过程。
- 本地域名服务器会先查询本地的缓存,如果没有该纪录项,则会把请求发给根域名服务器[2]。
- 逐级查询,直到找到正确的纪录或确定该域名不存在。
- 返回错误信息:如果经过上述步骤后,浏览器确定域名不存在,它通常会返回一个错误页面。在Chrome浏览器中,这个错误通常是“ERR_CONNECTION_ABORTED”。
这个过程可能会因为网络状况、浏览器设置、缓存情况等因素而有所不同。此外,对于不存在的域名,浏览器可能还会执行一些额外的操作,比如尝试重定向、触发某些安全策略等。