web请求过程

您所在的位置:网站首页 简述web浏览器与web服务器交互的过程 web请求过程

web请求过程

2024-06-27 10:39| 来源: 网络整理| 查看: 265

一次完整的web请求过程 一次完整的web访问流程

前言:当我们在浏览器输入一个网址,然后按下回车,接下来浏览器显示了页面。网速好的话这之间可能就一秒,但在这一秒内到底发生了什么?

大致过程如下:

一次完整的web访问流程简析:

client:输入网址–>发起http request–>等待web server响应.server:收到client请求–>加载资源–>构建响应报文,发给client.注:以下分析不考虑缓存问题. client发起http请求:

①client将键入的域名解析为server端的IP地址(DNS解析).

②client与server进行TCP连接(三次握手).

④client与web server数据传输.

④client与web server断开TCP连接(四次挥手).

⑤client解释HTML文档,浏览器渲染,将在屏幕上显示渲染后的图形结果。

server收到client请求时:

①http request请求首先到达server端的公网ip上(公网ip一般配置在硬件防火墙上).

②经过防火墙过滤之后,到达负载均衡层(可能涉及四层负载均衡和七层负载均衡),负载均衡将请求报文往后端Real Server调度.

③经过lvs调度至后端RS上,此时后端提供web服务的一般是Nginx(Apache也可能),Nginx判断请求报文是动态资源还是静态资源(动静分离).

④静态资源:由Nginx发起系统调用,请求内核从磁盘加载相应的资源文件,可能涉及存储服务器(资源的保存的服务器). 动态资源:由Nginx代理给能处理动态资源的服务器(Tomcat、PHP等),还可能涉及访问数据库服务器.

⑤web server将请求的资源加载完成之后,构建响应报文发送给client.

client端 浏览器访问某个网址

  当用户在浏览器输入一个域名然后回车,至服务器给予响应的整个过程,即一次web访问过程(此处不考虑缓存)。

一般的情况是发起一个http request请求(此处以访问服务器某个资源为例,没有考虑上传博客文章等上传请求~)

此处以访问百度首页为例:[http://]www.bai.com

DNS解析 DNS解析:比如现在访问百度的首页:[http://]www.bai.com, DNS解析主要功能是将www.bai.com这个域名解析成ip地址。

◆ DNS解析的过程:

1)浏览器首先搜索浏览器自身缓存的DNS记录,浏览器自身也带有一层DNS缓存。比如:Chrome 缓存1000条DNS解析结果,缓存时间大概在一分钟左右。

2)如果浏览器缓存中没有找到需要的记录或记录已经过期,则搜索hosts文件和操作系统缓存。

操作系统缓存: 在Windows操作系统中,可以通过 ipconfig /displaydns 命令查看本机当前的缓存。

windows的hosts文件解析: windows:主机的hosts文件路径:C:\Windows\System32\drivers\etc\hosts。hosts文件解析的结果一旦被使用,同样会被缓存到操作系统缓存中。

3)如果在hosts文件和操作系统缓存中没有找到需要的记录或记录已经过期,则向域名解析服务器发送解析请求。

此处涉及域名解析服务的工作原理:迭代查询?递归查询?还涉及CDN等等,详情见DNS,下面简述:

首先是DNS服务器有对应记录? 有缓存,直接返回对应的IP地址。 无缓存,(.)根域服务器–>(com)DNS服务器–>(baidu)DNS服务器–>回复一一开始访问的DNS服务器www主机的ip地址—>DNS服务器响应给浏览器。

图示过程: 递归查询:返回的最终结果ip查询。 迭代查询:返回的不是最终结果的ip,返回的是让你问别的dns服务器。

4)获取域名对应的IP后,返回给浏览器。

5)浏览器获取IP地址之后,将http request发送给IP地址(server ip)对应的服务器。

与访问的目标主机进行TCP连接

1)、浏览器会选择一个随机端口(大于1024)向server ip的80端口发起TCP连接请求.

TCP连接(三次握手)建立过程

Wireshark抓取通信过程,报文如下:

网络通信的具体过程,详情见网络章节

2)、TCP连接建立之后,浏览器会将http请求报文发送给server.

3)、然后服务器会发送响应报文给client(即浏览器).

浏览器渲染页面的过程

详情见文章:浏览器渲染原理及流程

server端 server端响应web请求图示:

server收到client请求时:

①http request请求首先到达server端的公网ip上(公网ip一般配置在硬件防火墙上).

②经过防火墙过滤之后,到达负载均衡层(可能涉及四层负载均衡和七层负载均衡),负载均衡将请求报文往后端Real Server调度.

③经过lvs调度至后端RS上,此时后端提供web服务的一般是Nginx(Apache也可能),Nginx判断请求报文是动态资源还是静态资源(动静分离).

④静态资源:由Nginx发起系统调用,请求内核从磁盘加载相应的资源文件,可能涉及存储服务器(资源的保存的服务器). 动态资源:由Nginx代理给能处理动态资源的服务器(Tomcat、PHP等),还可能涉及访问数据库服务器.

⑤web server将请求的资源加载完成之后,构建响应报文发送给client.

server如何处理用户请求

☆ 从防护墙到达server的详情具体不阐述,此处主要说明server处理用户请求的过程(收到数据报文–>加载资源–>构建响应报文)

①client的数据报文到达真正处理请求的服务器(图示的1.网络请求).

②server收到用户的请求时,会将数据报文从socket上拷贝到内核上,虽然数据报文发送至网卡上,但是网卡绑定在内核上(图示中2.Copy到内核空间)

③内核收到请求的数据报文后,先将数据报文放到内核空间,然后Copy到用户空间的对应进程内存中(Nginx监听的进程内存中).(图示中3.Copy到用户空间)

④至此Nginx收到用户的请求数据报文,然后对数据报文进行拆开,拆开之后,Nginx主要分析数据报文的应用层协议(请求什么资源,或者…).(图示中4.web处理用户请求)

⑤(承前,client请求的一些静态资源,而且不考虑缓存),则Nginx将发起系统调用,向内核申请请求的资源文件。

此时一般的资源文件是放在远程的存储服务器上的,然后通过网络协议拷贝至本地,然后拷贝至Nginx进程内存。如果资源文件存放在本地,内核通过读取本地磁盘,将资源文件加载至内核,然后再从内核空间拷贝至Nginx进程内存。

⑥资源加载至Nginx运行内存中时,Nginx将构建响应报文,然后将数据包发给内核(图示中5.响应报文Copy到内核空间)

⑦内核再对响应报文进行封装,构建成一个完整的响应报文数据包,然后通过网卡返回给client.

扩展

一次完整的I/O:是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次从内核空间中的内存数据copy到用户空间的进程内存当中,所以简单说I/O就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。

网络通信:就是网络协议栈到用户空间进程的IO就是网络IO.

磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源比如是文件或者是图片,然后内核通过相应的驱动程序将目标图片加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间。

每次IO,都要经由两个阶段:

第一步:将数据从磁盘文件先加载至内核内存空间(缓冲区),此步骤需要等待数据准备完成,时间较长.第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短. sendfile机制

我的通俗理解:响应报文的构建过程中阐述时,发现client请求的资源在web server端服务器上的传输是:内核空间–>用户空间–>内核空间,因此可否方这些资源就直接在内核空间封装,而内核空间直接告诉用户空间进程Nginx,然后Nginx构建应用层的响应报文?

sendfile可以让Nginx在传输文件时直接在磁盘和tcp socket之间传输数据。如果这个参数不开启,会先在用户空间(Nginx进程空间)申请一个buffer,用read函数把数据从磁盘读到cache,再从cache读取到用户空间的buffer,再用write函数把数据从用户空间的buffer写入到内核的buffer,最后到tcp socket。开启这个参数后可以让数据不用经过用户buffer。

sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。

原理解释

read/write 在传统的文件传输方式(read、write/send方式),具体流程细节如下:

1.调用read函数,文件数据拷贝到内核缓冲区2.read函数返回,数据从内核缓冲区拷贝到用户缓冲区3.调用write/send函数,将数据从用户缓冲区拷贝到内核socket缓冲区4.数据从内核socket缓冲区拷贝到协议引擎中

在这个过程当中,文件数据实际上是经过了四次拷贝操作:

磁盘—>内核缓冲区—>用户缓冲区—>内核socket缓冲区—>协议引擎

sendfile sendfile系统调用则提供了一种减少拷贝次数,提升文件传输性能的方法。

1.sendfile系统调用利用DMA引擎将文件数据拷贝到内核缓冲区,之后数据被拷贝到内核socket缓冲区中2.DMA引擎将数据从内核socket缓冲区拷贝到协议引擎中

这里没有用户态和内核态之间的切换,也没有内核缓冲区和用户缓冲区之间的拷贝,大大提升了传输性能。这个过程数据经历的拷贝操作如下:

磁盘—>内核缓冲区—>内核socket缓冲区—>协议引擎

带有DMA收集拷贝功能的sendfile 对于带有DMA收集拷贝功能的sendfile系统调用,还可以再减少一次内核缓冲区之间的拷贝。具体流程如下:

1.sendfile系统调用利用DMA引擎将文件数据拷贝到内核缓冲区,之后,将带有文件位置和长度信息的缓冲区描述符添加到内核socket缓冲区中2.DMA引擎会将数据直接从内核缓冲区拷贝到协议引擎中

这个过程数据经历的拷贝操作如下:

磁盘—>内核缓冲区—>协议引擎 buffer和cache

突然谈到磁盘IO,必然涉及到buffer和cache,buffer和cache的理解…

Buffer

Buffer(缓冲)

buffer是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的。 Cache

Cache(缓存)

cache是为了提高CPU和内存之间数据交换而设计的,即平时常见的一级缓存、二级缓存、三级缓存。 从Cache和Buffer描述资源加载过程

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3