精华内容
下载资源
问答
  • URL请求过程
    千次阅读
    2021-11-11 21:44:47

    结论:
    1、首先请求DNS解析域名、解析为ip地址;
    2、根据这个地址找到互联网上对应的服务器,向这个服务器发起一个请求,3、由服务器决定返回默认的数据资源给访问的用户;
    4、浏览器根据数据渲染页面;

    DNS域名解析过程

    1、当用户在浏览器中输入域名并按回车键时,浏览器会检查缓存中该域名是否为对应解析的IP地址,如果缓存中有,解析过程将结束。
    浏览器缓存大小有限制,而且也有时间限制,通常是几分钟到几个小时,这个时间限制是由域名的TTL属性来设置的。
    2、如果用户的浏览器缓存没有,浏览器将缓存查找操作系统缓存是否有DNS域结果。其实操作系统也可以有一个域名解析的过程,在Windows中可以用C: Windows/System32/drivers/etc/hosts文件来设置,在Linux中是etc/hosts文件,可以取任意DNS到任意IP地址进行访问。如果这里的IP地址对应指定了域名,浏览器会先使用该IP地址。
    例如,当我们在测试时可以将DNS发送到一个测试服务器,这样不需要更改任何代码就可以测试将业务逻辑代码发送到一个单独的服务器是否正确。因为本地的DNS纪律,所以黑客可以通过修改你的DNS来指定特定的DNS的IP地址吧,导致域名被劫持。因而通常情况下这个文件是只读的。
    3、当浏览器缓存和操作系统上都没有时,进行域名服务器上的域名请求,DNS会在各个域名服务器上逐层向上查找,直到找到域名。域名服务器又分为:
    1)、主域名服务器
    负责维护一个区域的所有域名信息,是特定的所有信息的权威信息源,数据可以修改。
    2)、辅助域名服务器
    当主域名服务器出现故障、关闭或负载过重时,辅助域名服务器作为主域名服务器的备份提供域名解析服务。辅助域名服务器中的区域文件中的数据是从另外的一台主域名服务器中复制过来的,是不可以修改的。
    3)、缓存域名服务器
    从某个远程服务器取得每次域名服务器的查询回答,一旦取得一个答案就将它放在高速缓存中,以后查询相同的信息就用高速缓存中的数据回答,缓存域名服务器不是权威的域名服务器,因为它提供的信息都是间接信息。
    4)、转发域名服务器
    负责所有非本地域名的本地查询。转发域名服务器接到查询请求后,在其缓存中查找,如找不到就将请求依次转发到指定的域名服务器,直到查找到结果为止,否则返回无法映射的结果。

    4、域名解析完成后,会在用户的本地机器和本地域名服务器上产生缓存,在Java应用中,JVM也会缓存DNS解析结果。以InteAddress类形式存在。在机器上使用ipconfig/flushdns可以刷新windows机器上的缓存,linux是etc/init.d/nscd restart;JVM则需要在JAVA_HOME\lib\security\java.security文件中配置。

    如何发起一个HTTP请求

    当下来说,发起Http请求有很多工具包,比如HttpClient。而在浏览器上,打个url就行,在linux上使用curl命令+url也可快速发起一个Http请求。
    请求发起的具体过程:
    如果是HTTP2.0,发起一个请求需要首先由TCP发起一个连接请求,通过三次握手来实现,然后进行数据包的发送。
    即在第三次握手时可以携带数据发送。
    HTTP3.0使用QUIC来建立连接,Qick Udp Internet Connection简单来说就是
    UDP的包装版,利用了UDP的连接快的特性,再加上应用层的包装,使整个协议拥有TCP+TLS的优点。基本连接采用DH密钥交换算法连接,具体连接过程简介如下:
    1、首次连接时,客户端发送 Hello 给服务端,用于请求连接;
    2、服务端生成 两个固定参数和一个随机参数,根据三个参数算出服务器密钥A,然后将固定参数和服务器密钥A放到 Server Config 中再发送 Rejection 消息给客户端;
    3、客户端接收到数据后,自己再生成随机参数b,根据两个固定参数和随机参数b算出客户端密钥B,根据固定参数和服务器密钥A算出交易密钥K。B和K算好后,客户端会用交易密钥K加密 HTTP 数据,连同客户端密钥B一起发送给服务端;
    4、服务端接收到客户端密钥B后,根据参数生成与客户端同样的密钥B,再用这密钥解密收到的 HTTP 数据。为了进一步的安全(前向安全性),服务端会更新自己的随机参数数 a 和公钥,再生成新的密钥 S,然后把公钥通过 Server Hello 发送给客户端。连同 Server Hello 消息,还有 HTTP 返回数据;
    5、客户端收到 Server Hello 后,生成与服务端一致的新密钥 S,后面的传输都使用 S 加密。
    这样,QUIC 从请求连接到正式接发 HTTP 数据一共花了 1 RTT,这 1 个 RTT 主要是为了获取 Server Config,后面的连接如果客户端缓存了 Server Config,那么就可以直接发送 HTTP 数据,实现 0 RTT 建立连接。从而节省时间。

    HTTP的数据格式:一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。
    请求行分为三个部分:请求方法、请求地址和协议版本。
    请求头部由关键字/值对组成,请求头部用于通知服务器有关于客户端请求的信息;

    服务器响应数据

    当服务器收到请求后,取决于web应用架构,可能有多个服务器,常见的通过反向代理、负载均衡在加上网关处理就可以最终指定由那个服务器来响应请求。服务器响应过程;
    1、首先收到的请求先要进行一个解析,通过对于Http请求的划分,可以得到请求的具体数据;
    2、对于请求的数据也可能存在不同的地方,常见的静态资源和动态资源的划分,使得需要到不同地方去实现请求的响应,最终确定好由什么来处理请求,最后可能被划分为多个请求来进行多次处理。
    3、请求处理完成后,服务器会构建Http响应包,格式同请求包类似;
    4、发送完响应包,可能在服务器上需要做一些其他的处理,比如日志记录。

    浏览器渲染数据

    当浏览器接受到数据包时,如何从这里面拿到需要的数据;

    1、对于不同的浏览器,首先确定他们不同的渲染引擎,负责对网页语法(如HTML、CSS、JavaScript等)的解释并显示网页。Firefox使用Geoko——Mozilla自主研发的渲染引擎,Safari和Chrome使用webkit内核。
    2、引擎选择结束后,进行一个Dom树和Render树的构建和布局,简单来说就是Html的渲染;当遇到CSS文件,发出CSS文件的请求,服务器返回这个CSS文件; 当遇到Javascript代码,进行代码执行; 偶尔遇到某些操作需要进行重新渲染。

    更多相关内容
  • 相信看完这张图后大家对一次请求也有了大致的了解了,当前其中还有很多细节小编没有画出来,然后我们来看看部分过程的细节 所以其流程大致如下: ①:DNS解析域名得到IP地址 ②:客户端与服务器建立连接(TCP三次...

    先上一张图给大家看看

    http请求流程图

    相信看完这张图后大家对一次请求也有了大致的了解了,当前其中还有很多细节小编没有画出来,然后我们来看看部分过程的细节

    所以其流程大致如下:

    ①:DNS解析域名得到IP地址
    ②:客户端与服务器建立连接(TCP三次握手)
    ③:客户端发起请求
    ④:服务器接收到请求根据端口号.路径等找到对应资源文件,响应源代码给客户端
    ⑤:客户端拿到请求到的数据(html页面的源代码),开始解析页面以及请求资源
    ⑥:客户端渲染页面
    ⑦:web服务器断开连接(四次挥手)

    1.url的组成

    说的url那就的说说URI和URN了,URI由URL和URN组成。

    URI:统一资源标识符

    URL:统一资源定位符

    URN:统一资源名称

     2.DNS解析过程

    1、在浏览器中输入www . qq .com 域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
    2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
    3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
    4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
    5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(http://qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找http://qq.com域服务器,重复上面的动作,进行查询,直至找到www . qq .com主机。
    6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
    

    3.TCP三次握手

    第一次握手:客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口(第一次握手,由浏览器发起,告诉服务器我要发送请求了) 
    第二次握手服务器发回一个带 SYN=1, ACK=X+1, Seq=Y 的响应包以示传达确认信息(第二次握手,由服务器发起,告诉浏览器我准备接受了,你赶紧发送吧) 
    第三次握手:客户端再回传一个带 ACK=Y+1, Seq=Z 的数据包,代表“握手结束”(第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧)
    其实简单理解就是:
        客户端问服务器:哥们,忙不?
        服务器回客户端:不忙,哥们有活?
        客户端回服务器:大活,准备接受吧!

    4.TCP四次挥手

    第一次挥手:发起方向被动方发送报文,Fin、Ack、Seq,表示已经没有数据传输了。并进入 FIN_WAIT_1 状态。(第一次挥手:由浏览器发起的,发送给服务器,我请求报文发送完了,你准备关闭吧)
    
    第二次挥手:被动方发送报文,Ack、Seq,表示同意关闭请求。此时主机发起方进入 FIN_WAIT_2 状态。(第二次挥手:由服务器发起的,告诉浏览器,我请求报文接受完了,我准备关闭了,你也准备吧)
    
    第三次挥手:被动方向发起方发送报文段,Fin、Ack、Seq,请求关闭连接。并进入 LAST_ACK 状态。(第三次挥手:由服务器发起,告诉浏览器,我响应报文发送完了,你准备关闭吧)
    
    第四次挥手:发起方向被动方发送报文段,Ack、Seq。然后进入等待 TIME_WAIT 状态。被动方收到发起方的报文段以后关闭连接。发起方等待一定时间未收到回复,则正常关闭。(第四次挥手:由浏览器发起,告诉服务器,我响应报文接受完了,我准备关闭了,你也准备吧)
    

    5.浏览器渲染过程

    浏览器解析渲染页面分为一下五个步骤:
    1.根据 HTML 解析出 DOM 树
    2.根据 CSS 解析生成 CSS 规则树
    3.结合 DOM 树和 CSS 规则树,生成渲染树
    4.根据渲染树计算每一个节点的信息
    5.根据计算好的信息绘制页面
    
    根据 HTML 解析 DOM 树
    
    根据 HTML 的内容,将标签按照结构解析成为 DOM 树,DOM 树解析的过程是一个深度优先遍历。即先构建当前节点的所有子节点,再构建下一个兄弟节点。
    
    在读取 HTML 文档,构建 DOM 树的过程中,若遇到 script 标签,则 DOM 树的构建会暂停,直至脚本执行完毕。
    
    根据 CSS 解析生成 CSS 规则树
    
    解析 CSS 规则树时 js 执行将暂停,直至 CSS 规则树就绪。
    
    浏览器在 CSS 规则树生成之前不会进行渲染。
    
    结合 DOM 树和 CSS 规则树,生成渲染树
    
    DOM 树和 CSS 规则树全部准备好了以后,浏览器才会开始构建渲染树。
    
    精简 CSS 并可以加快 CSS 规则树的构建,从而加快页面相应速度。
    
    根据渲染树计算每一个节点的信息(布局)
    
    布局:通过渲染树中渲染对象的信息,计算出每一个渲染对象的位置和尺寸
    
    回流:在布局完成后,发现了某个部分发生了变化影响了布局,那就需要倒回去重新渲染。
    
    根据计算好的信息绘制页面
    
    绘制阶段,系统会遍历呈现树,并调用呈现器的“paint”方法,将呈现器的内容显示在屏幕上。
    
    重绘:某个元素的背景颜色,文字颜色等,不影响元素周围或内部布局的属性,将只会引起浏览器的重绘。
    
    回流:某个元素的尺寸发生了变化,则需重新计算渲染树,重新渲染。
    

    6.异步的请求

    在web2.0时代,即使在页面渲染后客户端还是持续与服务器端通信,这个模式被称为AJAX,是“Asynchronous JavaScript And XML”的缩写。
    
    JS的解析是由浏览器中的JS解析引擎完成的。JS是单线程运行,也就是说,在同一个时间内只能做一件事,所有的任务都需要排队,前一个任务结束,后一个任务才能开始。但是又存在某些任务比较耗时,如IO读写等,所以需要一种机制可以先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous)。JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。所有的同步任务在主线程上执行,形成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,然后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的,所以又叫做事件循环(Event loop)。
    
    浏览器在解析过程中,如果遇到请求外部资源时,请求过程是异步的,并不会影响HTML文档进行加载,但是当文档加载过程中遇到JS文件,HTML文档会挂起渲染过程,不仅要等到文档中JS文件加载完毕还要等待解析执行完毕,才会继续HTML的渲染过程。原因是因为JS有可能修改DOM结构,这就意味着JS执行完成前,后续所有资源的下载是没有必要的,这就是JS阻塞后续资源下载的根本原因。CSS文件的加载不影响JS文件的加载,但是却影响JS文件的执行。JS代码执行前浏览器必须保证CSS文件已经下载并加载完毕。
    
    

    当然还有其他一些知识点没有整理出来,后续研究到再更新

    展开全文
  • Tomcat处理HTTP请求过程分析

    千次阅读 2018-12-14 14:43:02
    Tomcat处理HTTP请求过程分析 一、Tomcat是什么? Tomcat是一个web应用服务器,是一个Servlet/Jsp容器,主要负责将客户端请求传递给对应的Servlet,并且将Servlet的响应数据返回给客户端。 Tomcat是基于组件的...

    Tomcat处理HTTP请求过程分析

    一、Tomcat是什么?

    Tomcat是一个web应用服务器,是一个Servlet/Jsp容器,主要负责将客户端请求传递给对应的Servlet,并且将Servlet的响应数据返回给客户端。

    Tomcat是基于组件的服务器。

    二、Tomcat体系结构

    Tomcat是一个基于组件的服务器,它的构成组件都是可配置的。其各个组件都在Tomcat安装目录下的../conf/server.xml文件中配置

    server.xml文件源代码如下

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!--顶层类元素,可以包含多个Service-->
    
    <Server port="8005" shutdown="SHUTDOWN">  
    
      <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    
      <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
    
      <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    
      <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    
      <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    
      <GlobalNamingResources>
    
        <Resource name="UserDatabase" auth="Container"
    
                  type="org.apache.catalina.UserDatabase"
    
                  description="User database that can be updated and saved"
    
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    
                  pathname="conf/tomcat-users.xml" />
    
      </GlobalNamingResources>
    
      <!--顶层类元素,可包含一个Engine(container),多个connector-->
    
      <Service name="Catalina">
    
      <!--连接器类元素,代表通信接口-->
    
        <Connector port="8080" protocol="HTTP/1.1"
    
                   connectionTimeout="20000"
    
                   redirectPort="8443" />
    
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    
        <!--容器类元素,为特定的service组件处理客户请求-->
    
        <Engine name="Catalina" defaultHost="localhost">
    
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    
                   resourceName="UserDatabase"/>
    
            </Realm>
    
            <!--容器类元素,为特定的虚拟主机组件处理客户请求-->
    
          <Host name="localhost"  appBase="webapps"
    
                unpackWARs="true" autoDeploy="true">
    
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    
                   prefix="localhost_access_log" suffix=".txt"
    
                   pattern="%h %l %u %t "%r" %s %b" />
    
          </Host>
    
        </Engine>
    
      </Service>
    
    </Server>

     

    由上图可以看出Tomcat的心脏是两个核心组件:Connector(连接器)和Container(容器)。其中一个Container可以选择多个Connector

    扩展:Tomcat默认提供两个Connector连接器,一个默认监听8080端口,一个默认监听8009端口,这两种连接器有什么区别呢?redirectPort有什么作用?

    (1)8080端口监听的是通过HTTP/1.1协议访问的连接,而8009端口主要负责和其他HTTP服务器(如Apache、IIS)建立连接,使用AJP/1.3协议,当Tomcat和其他服务器集成时就会使用到这个连接器。如下图。

    Web1和Web2都是访问服务器的index.jsp页面。Web1直接访问Tomcat服务器,访问地址是http://localhost:8080/index.jsp。Web2访问HTTP服务器,HTTP服务器再通过访问Tomcat的8009端口找到index.jsp。假设HTTP服务器的端口为80端口,则访问地址为http://localhost:80/index.jsp 或者 http://localhost/index.jsp。

    Apache、IIS服务器一般只支持静态页面,如HTML,不支持JSP动态页面。Tomcat对HTML的解析速度不如Apache、IIS服务器。因此一般将两者整合使用。

    (2)redirectPort字面意思是重定向端口。当用户用http请求某个资源,而该资源本身又被设置了必须要https方式访问,此时Tomcat会自动重定向到这个redirectPort设置的https端口。

     

    三、组件

    1、Connector组件

    Connector 最重要的功能就是接收连接请求然后分配线程让 Container来处理这个请求,所以这必然是多线程的,多线程的处理是 Connector 设计的核心。Connector监听指定端口上请求,当请求到来时创建一个request和response对象交换数据,然后新建一个线程来处理请求并把request和response传递给Engine组件,最后从Engine获取一个响应并返回给客户端。

    Connector组件常用属性说明:

    (1) address:指定连接器监听的地址,默认为所有地址,即0.0.0.0可以自己指定地。(2) maxThreads:支持的最大并发连接数,默认为200;

    (3) port:监听的端口;

    (4) protocol:连接器使用的协议,默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3;

    (5) redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;

    (6) connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟;

    (7) enableLookups:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名;默认为true; 进行反解的,可以设置为false

    (8) acceptCount:设置等待队列的最大长度;通常在tomcat所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;

     

     

    1. container组件

    Container是容器的父接口,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常一个Servlet class对应一个Wrapper,如果有多个Servlet则定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container,如Context。 Context定义在父容器 Host 中,其中Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析就需要 Host 了,如果要有多个 Host 就要定义一个 top 容器 Engine 了。而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎。

    2.1、Engine

    Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义在server.xml中的Catalina。Engine需要defaultHost属性来为其定义一个接收所有请求的虚拟主机host组件

    2.2、Host

    Host是Engine的子容器。一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用、接收并处理请求、保存一个主机应该有的信息。

    常用属性说明:

    (1)appBase:此Host的webapps目录,项目存放路径,可以使用绝对路径

    (2)autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true;

    (3)unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;

    2.3、Context

    Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,还有一点就是 Context 如何才能找到正确的 Servlet 来执行它呢? Tomcat5 以前是通过一个 Mapper 类来管理的,Tomcat5 以后这个功能被移到了 request 中,在前面的时序图中就可以发现获取子容器都是通过 request 来分配的

    常用属性定义:

    (1) docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系,比如,如果appBase为deploy,而docBase绝不能为deploy-bbs类的名字;

    (2)path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径;如果context定义在一个单独的xml文件中,此属性不需要定义,有可能是别名;

    (3) reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false;

    2.4、Wrapper

    Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。 Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道。

    2.5、Realm

    Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。 Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道。

    2.6、Value

    Valve类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内可以建立多个Valve,而且Valve定义的次序也决定了它们生效的次序。

    四、Tomcat处理一个HTTP请求的过程

     

    1.用户在浏览器中输入网址localhost:8080/test/index.jsp,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得;

    2.Connector把该请求交给它所在的Service的Engine(Container)来处理,并等待Engine的回应;

    3.Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host;

    4.Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为 的Context去处理);

    5.path=/test的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL Pattern为*.jsp的Servlet,对应于JspServlet类;

    6.构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost(),执行业务逻辑、数据存储等;

    7.Context把执行完之后的HttpServletResponse对象返回给Host;

    8.Host把HttpServletResponse对象返回给Engine;

    9.Engine把HttpServletResponse对象返回Connector;

    10.Connector把HttpServletResponse对象返回给客户Browser。

     

    参考:https://www.cnblogs.com/small-boy/p/8042860.html

     

    展开全文
  • HTTP的请求过程

    万次阅读 多人点赞 2018-01-05 15:37:25
    一、简单描述一次Http的请求过程 域名解析 –> 发起TCP的3次握手 –> 建立TCP连接后发起http请求 –> 服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等...

    一、简单描述一次Http的请求过程

    域名解析 –> 发起TCP的3次握手 –> 建立TCP连接后发起http请求 –> 服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) –> 浏览器对页面进行渲染呈现给用户

    二、从域名的解析开始

    这一步的目标是为了获取到服务器的IP地址,如同打电话,要让通信信号定位到对方联系人,让消息传达至对方。

    ①浏览器会先解析我们输入的url地址,浏览器会先搜索自身的DNS缓存,看自身的缓存中是否有对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
    ②如果浏览器自身的缓存里面没有找到对应的条目,那么Chrome会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。
    ③如果在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,如果有则解析成功。
    ④如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器发起域名解析请求直到获取至服务器的IP地址。

    注:一般情况下是不会进行以下步骤的

    如果经过以上的4个步骤,还没有解析成功,那么会进行如下步骤(以下是针对Windows操作系统):

    ⑤操作系统就会查找NetBIOS name Cache(NetBIOS名称缓存,就存在客户端电脑中的),那这个缓存有什么东西呢?凡是最近一段时间内和我成功通讯的计算机的计算机名和Ip地址,就都会存在这个缓存里面。什么情况下该步能解析成功呢?就是该名称正好是几分钟前和我成功通信过,那么这一步就可以成功解析。
    ⑥如果第5步也没有成功,那会查询WINS 服务器(是NETBIOS名称和IP地址对应的服务器)。
    ⑦如果第6步也没有查询成功,那么客户端就要进行广播查找。
    ⑧如果第7步也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下,写法也一样)

    如果第8步还没有解析成功,那么就宣告这次解析失败,那就无法跟目标计算机进行通信。只要这8步中有一步可以解析成功,那就可以成功和目标计算机进行通信。

    三、TCP的三次握手

    拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。

    如下图:
    TCP的三次握手

    1. Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复。
    2. Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server 自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。
    3. Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。

    举个例子:
    假设一个老外在故宫里面迷路了,看到了小明,于是就有下面的对话:

    老外: Excuse me,Can you Speak English?

    小明: yes 。

    老外: OK,I want …

    在问路之前,老外先问小明是否会说英语,小明回答是的,这时老外才开始问路

    2个计算机通信是靠协议(目前流行的TCP/IP协议)来实现,如果2个计算机使用的协议不一样,那是不能进行通信的,所以这个3次握手就相当于试探一下对方是否遵循TCP/IP协议,协商完成后就可以进行通信了,当然这样理解不是那么准确。

    四、发起Http请求

    Http会发起一次请求request报文,它包括:请求行(request line)、请求头部(header)、空行请求数据这四个部分。

    1.请求行
    请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。

    HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

    而常见的有如下几种:

    1. GET: 完整请求一个资源 (常用)
    2. HEAD: 仅请求响应首部
    3. POST:提交表单 (常用)
    4. PUT: (webdav) 上传文件(但是浏览器不支持该方法)
    5. DELETE:(webdav) 删除
    6. OPTIONS:返回请求的资源所支持的方法的方法
    7. TRACE: 追求一个资源请求中间所经过的代理(该方法不能由浏览器发出)

    2.请求头
    请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

    1. Accept:客户端可识别的内容类型列表。
    2. Accept-Encoding:声明浏览器支持的编码类型。
    3. Cache-Control:指定了请求和响应遵循的缓存机制。
    4. Connection:决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。
    5. Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
    6. Referer:告诉服务器从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。
    7. Upgrade-Insecure-Requests:让浏览器自动升级请求从http到https,用于大量包含http资源的http网页直接升级到https而不会报错。
    8. User-Agent:产生请求的浏览器类型。

    request头

    3.空行
    最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

    4.请求数据
    请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

    五、Http响应报文

    HTTP响应也由三个部分组成,分别是:状态行、相应头部、响应正文。

    1.状态行
    HTTP-Version Status-Code Reason-Phrase CRLF

    其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

    • 1xx:指示信息–表示请求已接收,继续处理。
    • 2xx:成功–表示请求已被成功接收、理解、接受。
    • 3xx:重定向–要完成请求必须进行更进一步的操作。
    • 4xx:客户端错误–请求有语法错误或请求无法实现。
    • 5xx:服务器端错误–服务器未能实现合法的请求。

    常见状态代码、状态描述的说明如下。

    • 200 OK:客户端请求成功。
    • 301: 永久重定向, Location响应首部的值仍为当前URL,因此为隐藏重定向。
    • 302: 临时重定向,显式重定向, Location响应首部的值为新的URL。
    • 304:Not Modified 未修改,比如本地缓存的资源文件和服务器上比较时,发现并没有修改,服务器返回一个304状态码,告诉浏览器,你不用请求该资源,直接使用本地的资源即可。
    • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
    • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
    • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
    • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
    • 500 Internal Server Error:服务器发生不可预期的错误。
    • 502: Bad Gateway 前面代理服务器联系不到后端的服务器时出现
    • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
    • 504:Gateway Timeout 这个是代理能联系到后端的服务器,但是后端的服务器在规定的时间内没有给代理服务器响应

    无

    2.响应头部
    如下是Chrome浏览器的响应头部:
    响应头部

    Connection 使用keep-alive特性

    Content-Encoding 使用gzip方式对资源压缩

    Content-type MIME类型为html类型,字符集是 UTF-8

    Date 响应的日期

    Server 使用的WEB服务器

    Transfer-Encoding:chunked 分块传输编码 是http中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用(通常是网页浏览器)的数据可以分成多个部分,分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供

    六、最后阶段

    最后浏览器会解析渲染服务器发来的HTML,结果呈现在浏览器窗口。

    参考:
    1.一次完整的HTTP请求过程
    2.HTTP请求、响应报文格式

    展开全文
  • 一次完整的http请求过程是怎样的?

    千次阅读 多人点赞 2021-06-08 23:02:51
    我们打开浏览器,在地址栏输入\www.wukong.com\,几秒后浏览器打开悟空问答的页面,那么这几秒钟内发生了哪些事情,我就带大家... 客户端拿到http响应的报文信息,经过一系列前端处理过程最终将请求的资源进行展示。
  • HTTP与HTTPS请求过程

    千次阅读 2019-02-26 21:34:04
    HTTP与HTTPS请求过程 1、HTTP请求过程 HTTP协议处于网络协议的应用层,底层通过TCP/IP协议支持。HTTP请求基本过程为: 1.域名解析 2.三次握手创建TCP连接 3.服务器响应传输数据 4.四次挥手断开连接 TCP三次握手过程...
  • 一次完整的HTTP请求过程(深入分析)

    千次阅读 多人点赞 2019-08-22 11:09:58
    1.域名解析(这个说了一下域名解析的过程) ,解析出对应IP地址 2.解析成功之后,发起TCP三次握手建立连接 3.建立连接后发起HTTPS请求 4.服务器响应https请求,浏览器得到html代码 5.浏览器解析html代码,并请求静态...
  • 一个完整的HTTP请求过程详细

    万次阅读 多人点赞 2018-05-29 14:41:54
    一个完整的HTTP请求过程 整个流程 域名解析 —&gt; 与服务器建立连接 —&gt; 发起HTTP请求 —&gt; 服务器响应HTTP请求,浏览器得到html代码 —&gt; 浏览器解析html代码,并请求html代码中的资源...
  • DHCP工作原理(地址请求过程

    千次阅读 多人点赞 2020-02-16 20:49:14
    DHCP工作原理--DHCP客户端地址请求过程 一,DHCP工作过程概述: DHCP作用: ①DHCP( Dynamic Host Configuration Protocol, 动态主机配置协议),为网络中的设备提供动态IP地址信息,包括IP地址、网关、...
  • 一个Servlet请求的请求过程

    千次阅读 2018-10-21 15:44:06
    响应请求,servlet实例调用service()方法处理请求响应请求,servlet实例调用service()方法处理请求 如果是get 请求则走doGet()方法,如果是post请求走doPost()方法。 (以Spring为例来说,会进入FrameworkServlet-...
  • 超详细的"Web页面请求过程"之旅

    千次阅读 多人点赞 2018-07-30 19:44:13
    前言:web页面请求的整体过程 一、为主机申请IP:DHCP动态主机配置协议 二、查找默认网关路由器的MAC地址:ARP地址转换协议 三、查找目的域名的IP:DNS域名系统 四、TCP三次握手(及为什么要进行第三次握手)
  • 一次完整的浏览器请求过程

    千次阅读 2019-03-12 21:10:50
    从输入网址到页面收到请求这期间发生了什么过程 1.域名解析 2.发起TCP三次握手 3.建立TCP连接后发起http请求 4.服务器响应http请求,浏览器得到html代码 5.浏览器解析HTML代码,并请求HTML代码中的资源(如js和...
  • HTTP请求过程——Chrome浏览器Network详解 当我们使用Python进行爬虫的时候,其实就是一个模拟的资源访问返回过程,使用第三方库用目的url向所在的服务器发出请求,网站的服务器接收到这个请求后进行处理和分析,...
  • 一次完整的HTTP请求过程

    千次阅读 多人点赞 2018-06-22 11:07:22
    一、 HTTP请求和响应步骤图片来自:理解Http请求与响应以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。二、TCP/IP协议TCP/IP协议模型(Transmission Control ...
  • 步骤四、封包并进行三次握手 浏览器将请求信息进行打包,通过TCP的三次握手将数据传递至服务器。 步骤五、服务器解析、处理、返回数据 服务器通过种种层级、方式拿到传递的数据,对数据进行分析、处理,最后返回...
  • springMvc的一次请求过程

    千次阅读 2018-12-24 15:22:36
    一次完整的请求过程:  
  • 以下过程仅是个人理解: 域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)
  • 一次完整的HTTP网络请求过程详解

    千次阅读 2018-05-22 15:06:04
    简单地回答这个问题,大概是经历了域名解析、TCP的三次握手、建立TCP连接后发起HTTP请求、服务器响应HTTP请求、浏览器解析html代码,同时请求html代码中的资源(如js、css、图片等)、最后浏览器对页面进行渲染并...
  • ajax请求过程

    千次阅读 2019-07-05 15:32:48
    (2)打开请求 xhr.open('GET', url, true); (3)发送请求 xhr.send(); 发送请求到服务器 (4)接收响应 xhr.onreadystatechange =function(){} (4.1)当readystate值从一个值变为另一个值时,都会触发rea...
  • NetWork——描述一次完整的网络请求过程

    万次阅读 多人点赞 2017-01-10 18:53:05
    简单地回答这个问题,大概是经历了域名解析、TCP的三次握手、建立TCP连接后发起HTTP请求、服务器响应HTTP请求、浏览器解析html代码,同时请求html代码中的资源(如js、css、图片等)、最后浏览器对页面进行渲染并...
  • 一次完整的http请求过程

    千次阅读 2021-07-12 10:44:10
    一次完整的http(超文本传输协议)请求过程会经历以下几个过程: 域名解析 把一个域名解析成可用的ip地址和端口号,Windows具体解析步骤如下: 1.搜索浏览器自身DNS缓存,如果没有过期,则解析结束。 2.如果浏览器...
  • 准备 Wireshark:链路层抓包与分析工具 ...对百度发起get请求 func main() { r,_:=http.Get("http://www.baidu.com") b,_ := ioutil.ReadAll(r.Body) fmt.Println(string(b)) r.Body.Close() } 完整的...
  • 浏览器发送http请求过程分析

    千次阅读 2019-05-21 11:14:52
    请求过程整体流程: 1.域名解析--> 2.发起TCP的3次握手--> 3.建立TCP连接后发起http请求--> 4.服务器响应http请求,浏览器得到html代码--> 5.浏览器解析html代码,并请求html代码中的资源(如js、...
  • 整个流程如下: 域名解析 为了将消息从你的PC上传到服务器 上.需要用到1P协议、ARP协议和0SPF协议 发起TCP的3次握手 建立TCP连接后发起http请求 ...一、域名解析的详细内部过程 例如,要查询www.baidu.com...
  • 昨天打开公司一个项目的时候遇到的这个问题,找了一下午,文件夹权限改了又改,改成everyone都不行,最后经过和同事一块调试找到了问题的所在。 解决方案:打开IIS-&gt;找到网站对应的应用池-&...
  • HTTP请求的完全过程

    万次阅读 多人点赞 2019-05-27 11:22:45
    HTTP请求的完全过程 1.1 浏览器根据域名解析IP地址 浏览器根据访问的域名找到其IP地址。DNS查找过程如下: 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存)...
  • HTTP请求详细过程

    千次阅读 2022-03-08 17:06:04
    一. 输入地址 当我们开始在浏览器中输入网址的时候,浏览器其实就已经在... 请求一旦发起,浏览器首先要做的事情就是解析这个域名,一般来说,浏览器会首先查看本地硬盘的 hosts 文件,看看其中有没有和这个域名对
  • http请求的全部过程,http请求过程:一,DNS域名解析系统详解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,756,482
精华内容 702,592
关键字:

请求过程

友情链接: String.zip