AJP协议总结与分析

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

Tcp Connection 具有两种状态:

(1). Idle

没有请求正使用该连接。

(2). Assigned

当前连接正在处理某个请求.

数据类型:

AJP协议中包括四种数据类型:Byte, Boolean, Integer and String.

Byte: 一个字节

Integer:两个字节,无符号整数,高位字节在前。

”\0”,而且字符串长度不包括这个终结符。

包方向

0

1

2

3

4…(n+3)

Server->Container

0x12

0x34

数据长度(n)

数据(payload)

Container->Server

A

B

数据长度(n)

数据(payload)

图表1

方向

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

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)

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

Command Name

code

POST

4

OPTIONS

1

PUT

5

GET

2

DELETE

6

HEAD

3

TRACE

7

(参考:)

(4) num_headers: 请求头的个数,两个字节。

(5) request_headers:

请求头

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

响应包数据部分(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)

请求头

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

下面我们来看一个简单AJP请求过程中抓到的请求包:

请求:

字符串的终结符“\0”。

个)。

个)

字符串(0x09+2+1=12个)

为false

.

的route.

两个请求属性.

最后一个字节0xFF表示请求结束。

响应头数据包:

并且没有终结符字节0xFF.

响应正文数据包:

响应结束End Response:

其中最后一个字节(01),代表当前连接仍然可用。

(完)

本文出自 “天下无贼” 博客,免备案空间,香港服务器,请务必保留此出处

流过泪的眼睛更明亮,滴过血的心灵更坚强!

AJP协议总结与分析

相关文章:

你感兴趣的文章:

标签云: