AJP协议

article/2025/8/30 4:04:53
由于tomcat的html和图片解析功能相对其他服务器如apche等较弱,所以,一般都是集成起来使用,只有jsp和servlet服务交由tomcat处理,而tomcat和其他服务器的集成,就是通过ajp协议来完成的。AJP协议AJP13是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。WEB服务器通过TCP连接和SERVLET容器连接。为了减少进程生成socket的花费,WEB服务器和SERVLET容器之间尝试保持持久性的TCP连接,对多个请求/回复循环重用一个连接。一旦连接分配给一个特定的请求,在请求处理循环结束之前不会在分配。换句话说,在连接上,请求不是多元的。这个是连接两端的编码变得容易,虽然这导致在一时刻会有很多连接。
  一旦WEB服务器打开了一个到SERVLET容器的连接,连接处于下面的状态:◆ 空闲这个连接上没有处理的请求。
◆ 已分派连接正在处理特定的请求。
  一旦一个连接被分配给一个特定的请求,在连接上发送的基本请求信息是高度压缩的。在这点,SERVLET容器大概准备开始处理请求,当它处理的时候,它能发回下面的信息给WEB服务器:
◆ SEND_HEADERS
发送一组头到浏览器。
◆ SEND_BODY_CHUNK
   发送一块主体数据到浏览器。
◆ GET_BODY_CHUNK
从请求获得下一个数据如果还没有全部传输完,如果请求内容的包长度非常大或者长度不确定,这是非常必要的。例如上载文件。注意这和HTTP的块传输没有关联。

结束请求处理循环。


============================================================================================================================================‘

============================================================================================================================================‘
============================================================================================================================================‘

AJP是定向包协议。因为性能原因,使用 二进制格式来传输可读性文本。 WEB服务器通过 TCP 连接 和 SERVLET 容器 连接。为了减少进程生成socket的花费,WEB服务器和SERVLET容器之间尝试保持持久性的TCP连接,对多个请求/回复循环重用一个连接。一旦连接分配给一个特定的请求,在请求处理循环结束之前不会再分配。换句话说,在连接上,请求不是多元的。这个使连接两端的编码变得容易,虽然这导致在一时刻会有很多连接。
一旦WEB服务器打开了一个到SERVLET容器的连接,连接处于下面的状态:
◆ 空闲
这个连接上没有处理的请求。
◆ 已分派
连接正在处理特定的请求。
一旦一个连接被分配给一个特定的请求,在连接上发送的基本请求信息是高度压缩的。在这点, SERVLET容器大概准备开始处理请求,当它处理的时候,它能发回下面的信息给 WEB服务器:
◆ SEND_HEADERS
发送一组头到浏览器。
◆ SEND_BODY_CHUNK
发送一块主体数据到浏览器。
◆ GET_BODY_CHUNK
从请求获得下一个数据如果还没有全部传输完,如果请求内容的包长度非常大或者长度不确定,这是非常必要的。例如上载文件。注意这和HTTP的 块传输没有关联。
◆ END_RESPONSE
结束请求处理循环。





============================================================================================================================================‘


============================================================================================================================================‘
============================================================================================================================================‘

AJP协议总结与分析
2011-10-15 15:10:17
标签: AJP  AJP协议  休闲  职场
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://guojuanjun.blog.51cto.com/277646/688559

(格式显示不好,本文已放附件中)

AJP协议是定向包(面向包)协议,采用二进制形式代替文本形式,以提高性能。Web Server一般维持和Web Container的多个TCP Connecions,即TCP连接池,多个request/respons循环重用同一个Connection。但是当Connection被分配(Assigned)到某个请求时,该请求完成之前,其他请求不得使用该连接。

Tcp Connection 具有两种状态:

(1). Idle
没有请求正使用该连接。
(2). Assigned
当前连接正在处理某个请求.
数据类型:
 AJP 协议中包括四种数据类型:Byte, Boolean, Integer and String.
 Byte:  一个字节

  Boolean: 一个字节,1 = true, 0 = false

 Integer :两个字节,无符号整数,高位字节在前。
 String: 可变字符串,最大长度为2^16.  字符串的前而会有二个字节(Integer 型)表示字符串的长度,-1 表示null 。字符串后面会跟上终结符”\0” ,而且字符串长度不包括这个终结符。
AJP 的包结构, 图表1
包方向
0
1
2
3
4…(n+3)
Server->Container
0x12
0x34
数据长度(n)
数据(payload)
Container->Server
A
B
数据长度(n)
数据(payload)
                        图表1
可以看出,从apache 发向tomcat 包都带有0x1234 头,而从tomcat 发向apache 的包都带有AB(ascii 码) 头,随后二字节代表数据的长度(不包括前四个字节). 所认AJP 包的最大长度可以接近2^16 ,但目前的版本支持的最大包长度为2^13 ,即8K
再看数据部分(payload), 除Server->Container 的请求体包外,其他包的数据部分的首字节为其消息类型(code) ,如下表(描述部分是原文,译成中文本人认为更难理解,英文表义比中文是好一些):
方向
code
包类型
描述
Server->Container
2

Forward Request

Begin the request-processing cycle with the following data

7
Shutdown

The web server asks the container to shut itself down

8
Ping

The web server asks the container to take control (secure login phase).

10
Cping

The web server asks the container to respond quickly with a CPong

none
Data

Size (2 bytes) and corresponding body data.

Container->Server
3
Send Body Chunk

Send a chunk of the body from the servlet container to the web server

4
Send Headers

Send the response headers from the servlet container to the web server

5
End Response
Marks the end of the response
6
Get Body Chunk

Get further data from the request if it hasn't all been transferred yet

9
CPong Reply
The reply to a CPing request
Forward Request 包数据部分(payload )结构:
AJP13_FORWARD_REQUEST :=
    prefix_code      (byte) 0x02 = JK_AJP13_FORWARD_REQUEST
    method           (byte)
    protocol         (string)
    req_uri          (string)
    remote_addr      (string)
    remote_host      (string)
    server_name      (string)
    server_port      (integer)
    is_ssl           (boolean)
    num_headers      (integer)

    request_headers *(req_header_name req_header_value)

    attributes      *(attribut_name attribute_value)

request_terminator (byte) OxFF

---------------------------------------------------------------------------------------------------------------------------------
req_header_name :=

sc_req_header_name | (string) [see below for how this is parsed]

---------------------------------------------------------------------------------------------------------------------------------

sc_req_header_name := 0xA0xx (integer)

req_header_value := (string)
---------------------------------------------------------------------------------------------------------------------------------

attribute_name := sc_a_name | (sc_a_req_attribute string)

attribute_value := (string)

(1)     prefix_code 所有的Forward Request包都是0x02.

(2)     Method:  一个字节,对方法的编码,其对应如下(只列了部分):

Command Name

code
POST      
4
OPTIONS 
1
PUT       
5
GET     
2
DELETE   
6
HEAD    
3
TRACE    
7
( 参考:http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html)

(3)     protocol, req_uri, remote_addr, remote_host, server_name, server_port, is_ssl每个请求包都有这几个字段,格式都是 长度+字符串值+\0结束符。

(4)     num_headers:  请求头的个数,两个字节。
(5)     request_headers:
请求头名称分化为两类,一类请求头被转换为 0xA0xx 格式(如下表所示),其他请求头仍然用原字符串编码。
请求头

Code 

Code 名称

accept

0xA001
SC_REQ_ACCEPT
accept-charset
0xA002
SC_REQ_ACCEPT_CHARSET
accept-encoding
0xA003
SC_REQ_ACCEPT_ENCODING
accept-language
0xA004
SC_REQ_ACCEPT_LANGUAGE
authorization
0xA005
SC_REQ_AUTHORIZATION
connection
0xA006
SC_REQ_CONNECTION
content-type
0xA007
SC_REQ_CONTENT_TYPE
content-length
0xA008
SC_REQ_CONTENT_LENGTH
cookie
0xA009
SC_REQ_COOKIE
cookie2
0xA00A
SC_REQ_COOKIE2
host
0xA00B

SC_REQ_HOST 0xA00C

pragma
0xA00C
SC_REQ_PRAGMA
referer
0xA00D
SC_REQ_REFERER
user-agent
0xA00E
SC_REQ_USER_AGENT
(6)     Java 代码读取头两个字节的整数型,如果高位字节为”0xA0”  ,则第二字节为上在列表的索引。如果高位字节不是”0xA0” ,则这两个字节为随后请求头名称的长度。
(7)     Attributes :很少用,直接看tomcat 文档吧。     
(8)     request_terminator:  一个字节0xFF, 请求结束符。
响应包数据部分(payload) 结构:
AJP13_SEND_HEADERS :=
 prefix_code       4
 http_status_code (integer)
 http_status_msg   (string)
 num_headers       (integer)

 response_headers *(res_header_name header_value)

res_header_name :=
    sc_res_header_name | (string)   [see below for how this is parsed]

sc_res_header_name := 0xA0 (byte)

header_value := (string)
AJP13_SEND_BODY_CHUNK :=
 prefix_code   3
 chunk_length (integer)

 chunk        *(byte)

AJP13_END_RESPONSE :=
 prefix_code       5
 reuse             (boolean)
AJP13_GET_BODY_CHUNK :=
 prefix_code       6
 requested_length (integer)
1.       response_headers:  和请求头一样,一类响应头被转换为0xA0xx 格式(如下表所示),其他响应头名称采用原字符串编码。
请求头

Code 

Code 名称

Content-Type
0xA001
SC_RESP_CONTENT_TYPE
Content-Language
0xA002
SC_RESP_CONTENT_LANGUAGE
Content-Length
0xA003
SC_RESP_CONTENT_LENGTH
Date
0xA004
SC_RESP_DATE
Last-Modified
0xA005
SC_RESP_LAST_MODIFIED
Location
0xA006
SC_RESP_LOCATION
Set-Cookie
0xA007
SC_RESP_SET_COOKIE
Set-Cookie2
0xA008
SC_RESP_SET_COOKIE2
Servlet-Engine
0xA009
SC_RESP_SERVLET_ENGINE
Status
0xA00A
SC_RESP_STATUS
WWW-Authenticate
0xA00B
SC_RESP_WWW_AUTHENTICATE
2.       reuse:  如果为1, 表示该连接可以被子重用,否则这个连接应该关闭。
下面我们来看一个简单AJP 请求过程中抓到的请求包:
http://localhost/test/testCluster.jsp 请求:

1 ,2 字节是上文所说的Server->Container 包头,3 ,4 字节表示包长度(0x01b0=432), 即从第5 个字节到最后的一个字节(ff )的长度。第5 个字节(02 )代表是”Forward Request” 包。
第6 个字节(02) 代表是Get 请求。第7 ,8 字节(0x0008) 代表protocol 字符串的长度,后8 个字节为protocol 字符串(HTTP/1.1), 第9 个字节为protocol 字符串的终结符“\0 ”。
18-41 字节代表req_uri 字符串(0x15+2+1=24 个)
42-53 字节代表remote_addr 字符串(0x09+2+1=12 个)
54-55  两字节(0xffff=-1) 代表null 字符串, 即remote_host 不存在。
56-67 两字节 代表server_name 字符串(0x09+2+1=12 个)
68-69 两字节(0x0050=80) 代表server_port
70 字节(0x00) 代表is_ssl 为false
71-72 两字节(0x0009) 代表该请求有9 个请求头, 如图中的前9 个红色椭圆.
第10 个红色椭圆(0x06) 代表Attributes 的route.
第11 个红椭圆之后,代表AJP_REMOTE_PORT 与JK_LB_ACTIVATION 两个请求属性.
最后一个字节0xFF 表示请求结束。
响应头数据包:

和请示头比较类似,不再细描述。其中第5 个字节0x04 代表”Send Headers” 响应。
并且没有终结符字节0xFF.
响应正文数据包:

响应结束End Response:
其中最后一个字节(01) ,代表当前连接仍然可用。
(完)

本文出自 “天下无贼” 博客,请务必保留此出处http://guojuanjun.blog.51cto.com/277646/688559


============================================================================================================================================‘
============================================================================================================================================‘

http://chatgpt.dhexx.cn/article/96uyONlP.shtml

相关文章

Apache Tomcat AJP协议文件读取与包含

永远也不要忘记能够笑的坚强,就算受伤,我也从不彷徨。 0x01.漏洞情况分析 Tomcat是Apache软件基金会Jakarta 项目中的一个核心项目,作为目前比较流行的Web应用服务器,深受Java爱好者的喜爱,并得到了部分软件开发商的…

Tomcat AJP 文件包含漏洞(CVE-2020-1938)

目录 1.漏洞简介 2、AJP13 协议介绍 Tomcat 主要有两大功能: 3.Tomcat 远程文件包含漏洞分析 4.漏洞复现 5、漏洞分析 6.RCE 实现的原理 1.漏洞简介 2020 年 2 月 20 日,公开CNVD 的漏洞公…

Tomcat HTTP协议与AJP协议

https://blog.csdn.net/jeikerxiao/article/details/82745516 Tomcat HTTP协议与AJP协议 HTTP Connector AJP Connector 配置 Tomcat在server.xml中配置了两种连接器。 HTTP Connector 拥有这个连接器,Tomcat才能成为一个web服务器,但还额外可处理Serv…

Tomcat架构解析之AJP

一、前言 除了HTTP,Tomcat还支持AJP协议,以便于Apache HTTP Server等Web服务器集成,这篇博客主要讲解AJP协议的基础知识以及其配置使用方式。 二、基础知识 为了满足负载均衡、静态资源优化、遗留系统集成(如集成PHP Web应用&…

HTTP协议与AJP协议

AJP 全称 Apache JServ Protocol, 是定向包协议,因为性能的原因,使用二进制格式来传输可读性文本,WEB服务器通过TCP连接和SERVLET容器连接。 一旦WEB服务器打开了一个到SERVLET容器的连接,连接处于下面的状态&#xff…

解决Destroying ProtocolHandler [“ajp-apr-8009“]

今天刚开始调JSP网站还好好的,后来中间注销了电脑一次, 再打开调试它,就遇到了这个 无法启动服务器的问题: Destroying ProtocolHandler ["ajp-apr-8009"] 上网百度了下,说是端口号被占用了。 解决办法&…

你知道HTTP协议,但你了解AJP协议吗?

什么是AJP协议? AJP 协议用于web服务器和应用服务器之间的通信?为什么不用HTTP呢? Web服务器和应用服务器有什么区别? AJP协议和HTTP 协议有什么区别? 为什么客户端与服务器之间的通信使用HTTP协议而不是用AJP协议&…

WEB安全:Tomcat-Ajp协议漏洞分析

一、漏洞描述 Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行。 Apache Tomcat服务器存在文件包含漏洞,攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件或源代码…

ajp 定向包协议 二进制代替文本提高性能 简介

AJP协议是定向包(面向包)协议,采用二进制形式代替文本形式,以提高性能。Web Server一般维持和Web Container的多个TCP Connecions,即TCP连接池,多个request/respons循环重用同一个Connection。但是当Connec…

Java高级自我介绍

先放个大招,哈哈,相信很多朋友准备了很久技术方面的内功,但是在真正与HR交锋的时候,有时还是败下阵来,究其原因之一,竟然是第一招错了,我自己也是,,所以,周末…

java开发自我介绍范文(合集)

java开发自我介绍范文3篇 java开发自我介绍范文篇一: Good morning ! It is really my honor to have this opportunity for a interview, I hope i can make a good performance today. Im confident that I cansucceed. Now i will introduce myself briefly I am…

Java面试中如何介绍自己的项目经验?

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇 作者: hsm_computer 来源: https://www.cnblogs.com/JavaArchitect/p/7586949.html 在面试时,经过寒暄后,一般面试官会让介绍项目经验 。常见…

Java程序员面试时,如何进行自我介绍呢?

现在不管什么面试都会面对的一个环节,就是“自我介绍”。这个环节是很多企业作为选拔人才的一个方式与标准。那么,Java程序员面试自我介绍部分讲什么内容?小千给你详细解答下。 Java程序员自我介绍要有一条清晰的线索,便于组织自…

Java面试自我介绍怎么说?Java面试技巧!

自我介绍可谓是面试中最讨厌的环节了,许多程序员自身技术水平相当不错,但不善于表达,在自我介绍环节往往容易给面试官一个不好的印象。但这又是不可避免的,想要别人知道你是谁,你会什么,你做过什么&#xf…

JAVA面试技巧之自我介绍

【如何进行自我介绍】 自我介绍这个问题,不用多说了,面试必定会问!如果想要在自我介绍的时候就能够打动面试官,吸引面试官对我们的兴趣,那么像我们这种接受过Java培训的程序员的自我介绍当然不能和应届生或者其他非技术…

AIOP简介

AIOP:AI for IT Operations

AIOps,让金融智能化运维化繁为简

前言 数字化转型是今天金融企业保持竞争力、拓展业务边界的必经之路。这让企业数据中心运维工作不得不面对海量数据压力的挑战。显然,传统运维方法已经无法满足企业数字化时代的新需求,构建面向未来的智能运维体系成为金融企业转型的关键。 2022年银保…

AIOps产品与架构浅析

【摘要】 本文简要介绍AIOps系统主要组成部分,介绍该系统在企业级IT运维场景下的作用和地位。 我们已经成功地应用了人工智能和机器学习来自动化传统的人工任务和IT操作过程。从异常检测到自动修复,现在将前沿算法融入到易于使用的工具中,允…

AIOps变革

图片摘自灵犀官网 目前稍微有点规模的公司都走到了2.0和3.0,之后4.0会逐渐普及 AIOps目前主要是应用数据发现故障,由于AI目前无法理解业务,所以很多故障处理依然需要依靠人工完成。深度的AI自动发现和故障处理需要智能AI组件的加入&#xf…

AIoT是什么?

AIoT是AI人工智能与IoT物联网的缩写,指的是人工智能物联网,即通过物联网收集来自不同维度的海量数据,存储于云端、边缘端,再根据大数据分析以及AI等技术,实现万物数据化、万物智联化。 谈到物联网,出现频率…