(格式显示不好,美国空间,本文已放附件中)
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),代表当前连接仍然可用。
(完)
本文出自 “天下无贼” 博客,免备案空间,香港服务器,请务必保留此出处
流过泪的眼睛更明亮,滴过血的心灵更坚强!