Tomcat架构解析之HTTP

一、前言

    HTTP协议可以说是互联网应用最广泛的网络协议,也是所有服务器均支持的最基本的协议。他是一种基于请求与响应模式的、无状态的应用层协议。这篇博客主要介绍HTTP协议(1.1版本)的基础知识以及在Tomcat中如何配置使用。

二、基础知识

    HTTP协议具体有如下特点:

  • 支持客户端/服务器模式。
  • 简单快速:客户端向服务器请求服务时,只需要发送请求方法和路径即可。常见的请求方法包括GET、POST等。每种方法规定了客户端与服务器联系的不同类型。由于HTTP协议简单,HTTP服务器程序规模小、通信速度快。
  • 灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记。
  • 无链接:限制每次链接只处理一个请求,服务器处理完客户端请求并且收到客户端应答后即断开链接。采用此种方式可以节省传输时间。当然这只是短链接的处理方式,对于常链接,HTTP/1.1每次链接是可以处理多个请求的,但是请求是顺序执行的,因此更准确的说法是链接在同一时刻只能处理一个请求。
  • 无状态:指协议对于事物处理没有记忆能力,意味着如果后续处理需要前面的信息,则必须重传。这样可能导致每次链接传送的数据量增大。

    通常HTTP消息包括请求消息和响应消息。两者均由消息行、消息头和消息体3部分组成。

    一个典型的HTTP请求消息如下所示;

在这里插入图片描述
    第一行为请求行,格式为LMethod(请求方法)、Request-URI(请求URI)、HTTP-Version(HTTP版本)。从第二行至空行为消息头,名称与值以冒号分割,常见如Accept、Accept-Encoding等,空行之后为请求正文。

    HTTP响应消息格式如下:
在这里插入图片描述
    第一行为状态行,格式为:HTTP-Version(HTTP版本)、Stratus-Code(状态码)、Reason-Phrase(状态码描述),常见HTTP状态码如:200(请求成功)、400(请求错误)、404(请求资源不在)、500(服务器内部错误)等。从第二行至空行为响应头,格式与请求相同,空行之后为响应正文。

三、配置方式

    Tomcat在默认配置下即支持HTTP/1.1,不需要另行配置。我们可以再& CATALINA_BASE/conf/server.xml中找到相关配置,如下所示:
在这里插入图片描述
    从配置中可知,HTTP请求的处理端口为8080,我们可以通过修改port属性,将其修改为希望分配的端口,如80.

    其次,属性protoco;为“HTTP/1.1”,表示道歉链接器支持的协议为HTTP/1.1。采用此种方式配置,Tomcat会自动检测当前服务器是否安装了APR。如果安装了APR,那么Tomcat将自动使用APR处理HTTP(即Http11AprProtocol),否则使用DIO。除此之外,我们还可以明确指定协议处理类,此时Tomcat的检测将不再生效。如下所示:我们指定采用NIO处理HTTP请求:
在这里插入图片描述
    connectionTimeout属性表示Connector接收到链接后的等待超时时间,单位为毫秒,默认为20秒。

    redirectPost属性表示如果当前Connector支持non-SSl请求,并且接收到请求内容中存在一个一致的< security-constraint >需要SSL传输,Catalina会自动将请求重定向到属性指定的端口。Tomcat迷人指定的端口是8443。

    各种应用系统的部署千差万别,对应服务要求的要求也不同。HTTP链接器支持非常多的属性用于满足各个部署场景。而且有些属性也是我们再系统性能优化过程中需要重点关注的。
    以下提供几个与性能关系密切的属性配置以供参考:

  • maxThreads:Tomcat是一款多线程Servlet容器,每个请求都会分配一个线程进行处理,因此Tomcat采用线程池来提高处理性能。amxThreads用于指定Connector创建的请求处理线程的最大数目。该属性决定了可以并行处理的请求最大数目,即并发上限。当并发请求数超过maxThreads时,多余的请求只能排队的等待。增大该属性可以提高Tomcat的并发处理能力。当这意味着会占用更多的系统资源。因此如果非常大反而会降低性能,甚至导致Tomcat崩溃。
  • maxSpareThreads:Tomcat允许的空闲线程的最大数目,超出的空闲线程将被直接关闭。将该属性设置为较大值对性能并无益处,默认值50已经可以满足大多数Web应用的需要。
  • minSpareThreads:Tomcat允许的空闲线程的最小数目,也是启动是Connector创建的线程数目。如果空闲线程数小于该值,Tomcat将创建新的线程。将改属性设置为较大值对性能并无益处,因为会占用额外的系统资源。默认值4可以满足大多数Web应用的需要。读书对于存在突发情况的Web应用,可以适当调大该值。
  • tcpnoDelay:将该属性设置为true,会启用Socket的TCP_NO_DELAY选项。他会禁用Nagle算法,该算法通过降低网络发送包的数量提升网络利用率。在非交互式Web应用环境中,该算法会缩短响应时间。但是在交互式Web应用环境中则会加大响应时间,因为他会将小包拼接为大包再进行发送,从而导致响应延迟。
  • maxKeepAliveRequest:用于控制HTTP请求的“keep-alive”行为,以启用持续链接(即多个请求通过同一个HTTp链接发送)。该属性指定HTTP链接在被服务器关闭之前处理的请求的最大数目。Tomcat的默认值为100,如果设置为1表示禁用该特性。因此,该属性会提升单个客户端的请求效率,尤其当一个Web页面包含多个HTTP请求时(减少了新建链接的开销),但同时会影响到服务器整体的吞吐量(链接持续时间过长,是服务器任意达到最大链接数每次是其他客户端的请求只能等待,甚至被直接拒绝,这种情况下,我们可以适当调低keepAliveTimeout的值)。
  • socketBuffer:用于指定Socket输出缓冲的大小,单位为字节。
  • enableLookups:设置为false,会禁用request.getRemoteHost()方法的DNS查询,从而提升响应性能(减少DNS查询耗时)。

    当然,这仅仅是与性能相关的一部分属性,而且也是影响性能的一个方面(还包括JVM、TCP栈等等)。

发布了185 篇原创文章 · 获赞 457 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_42146366/article/details/98062874
今日推荐