FastCGI协议分析
不知道什么时候,就开始有了让HomeServer支持PHP的念头。于是分析起了FastCGI协议。FastCGI用于WebServer与WebApplication之间的通讯,例如Apache与PHP程序。
FastCGI协议数据包是8字节对齐的,由包头(Header)和包体(Body)组成。例如要请求一个index.php的页面,WebServer首先向WebApp发送一个Request数据包。包头有个请求ID用于并行工作时,区别不同的请求。
包头
[版本:1][类型:1][请求ID:2][数据长度:2][填充字节数:1][保留:1]
包体
[角色:2][参数:1][保留:5]
接着,再发送一个Params数据包,用于传递执行页面所需要的参数和环境变量。
包头
[版本:1][类型:1][请求ID:2][数据长度:2][填充字节数:1][保留:1]
包体
[名称长度:1或4][值长度:1或4][名称:变长][值:变长] …
其中,名称和值的长度占用的字节数是可变,取决于第一个字节(高位)的最高位是否为1,为1则长度是4个字节,否则为1个字节。即如果长度不超过128字节,就用一个字节来保存长度足够了。
参数发送后还要发送一个没有包体,只有包头的空的Params数据包,用来表示参数发送结束。
如果请求页面时POST方式,还会发送表单数据。这就要用到Stdin数据包了。
包头
[版本:1][类型:1][请求ID:2][数据长度:2][填充字节数:1][保留:1]
包体
[数据内容:长度在包头中设置,8字节对齐]
有时候POST的数据大于或等于64KB,就不能使用一个Stdin数据包发送完毕了,需要使用多次Stdin数据包来完成所有数据的传输。与Params数据包一样,结尾要发送一个没有包体,只有包头的空的Stdin数据包,用来表示参数发送结束。
至此,WebServer要提供给WebApplication的数据已经发送完毕。接着就接收来自WebApplication的数据了。
数据接收包Stdout与Stdin是差不多的,这里不再描述。不过接收到的数据由HTTP头和网页数据两部分组成,WebServer要对其做一定的处理后才能发送到浏览器。同Stdin数据包一样,WebServer会接收到一个来自WebApplication的Stdout的空数据包,表示接收的Stdout数据已经完毕。
最后,WebApplication会发送一个包含状态的EndRequest数据包,至此,一次页面请求处理完毕。
下面给出一些相关结构参考。
通用包头:
typedef struct {
unsigned char version;
unsigned char type;
unsigned char requestIdB1;
unsigned char requestIdB0;
unsigned char contentLengthB1;
unsigned char contentLengthB0;
unsigned char paddingLength;
unsigned char reserved;
}FCGI_Header;
typedef struct {
unsigned char roleB1;
unsigned char roleB0;
unsigned char flags;
unsigned char reserved[5];
} FCGI_BeginRequestBody;
typedef struct {
FCGI_Header header;
FCGI_BeginRequestBody body;
} FCGI_BeginRequestRecord;
typedef struct {
unsigned char appStatusB3;
unsigned char appStatusB2;
unsigned char appStatusB1;
unsigned char appStatusB0;
unsigned char protocolStatus;
unsigned char reserved[3];
} FCGI_EndRequestBody;
每次请求页面时,传递给PHP程序的参数:
SCRIPT_FILENAME,
QUERY_STRING,
REQUEST_METHOD,
CONTENT_TYPE,
CONTENT_LENGTH,
SCRIPT_NAME,
REQUEST_URI,
DOCUMENT_URI,
DOCUMENT_ROOT,
SERVER_PROTOCOL,
GATEWAY_INTERFACE,
SERVER_SOFTWARE,
REMOTE_ADDR,
REMOTE_PORT,
SERVER_ADDR,
SERVER_PORT,
SERVER_NAME,
REDIRECT_STATUS,
HTTP_ACCEPT,
HTTP_ACCEPT_LANGUAGE,
HTTP_ACCEPT_ENCODING,
HTTP_USER_AGENT,
HTTP_HOST,
HTTP_CONNECTION,
HTTP_CONTENT_TYPE,
HTTP_CONTENT_LENGTH,
HTTP_CACHE_CONTROL,
HTTP_COOKIE,
HTTP_FCGI_PARAMS_MAX
好像很多,但是很多空值的,可以省去,不发送之,即可。
转自:http://xiaoxia.org/2009/10/05/fastcgi-protocol-analysis/
FastCGI协议分析的更多相关文章
- fastcgi协议分析与实例
http://blog.csdn.net/tanswer_/article/details/78879905
- PHP 进阶之路 - 深入理解 FastCGI 协议以及在 PHP 中的实现
在讨论 FastCGI 之前,不得不说传统的 CGI 的工作原理,同时应该大概了解 CGI 1.1 协议 传统 CGI 工作原理分析 客户端访问某个 URL 地址之后,通过 GET/POST/PUT ...
- lighttpd+fastcgi模块分析
一开始不怎么明白fastcgi和cgi的区别,查了资料说,fastcgi多了一个进程池,不要每次都fork和退出 这个不是重点,还是对着代码看吧 怎样在lighttpd运行php呢,需要下面这样配置 ...
- CGI & FastCGI 协议
目录 CGI 是什么 CGI 特点 CGI 的流程 FastCGI 是什么 CGI & FastCGI(转载) 推荐Blog: CGI是什么,FastCGI是什么 CGI 是什么 公共网关接口 ...
- Google的Protobuf协议分析
protobuf和thrift类似,也是一个序列化的协议实现,简称PB(下文出现的PB代表protobuf). Github:https://github.com/google/protobuf 上图 ...
- 蓝牙协议分析(7)_BLE连接有关的技术分析
转自:http://www.wowotech.net/bluetooth/ble_connection.html#comments 1. 前言 了解蓝牙的人都知道,在经典蓝牙中,保持连接(Connec ...
- 协议分析TMP
最近闲来有事, 分析了一个非常低端(非常低端的意思是说你不应该对她是否能取代你现有的QQ客户端作任何可能的奢望,她只是一个实验性的东西)的手机QQ的协议, 是手机QQ3.0, 所用到的TCP ...
- 协议分析 - DHCP协议解码详解
协议分析 - DHCP协议解码详解 [DHCP协议简介] DHCP,全称是 Dynamic Host Configuration Protocol﹐中文名为动态主机配置协议,它的前身是 ...
- PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析
Python黑帽编程1.5 使用Wireshark练习网络协议分析 1.5.0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks At ...
随机推荐
- Python-鸡兔同笼问题
鸡兔同笼问题 -- 今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何? --鸡和兔在一个笼子里,从上面数,有35个头:从下面数,有94只脚.问笼中各有几只鸡和兔 如何逻辑整理? -- 鸡头和兔子 ...
- Python-获取文件状态模块-os stat lastat fstat path
案例: 在某项目中,需要获取文件状态,如: 文件的类型(普通文件.目录.符合连接.设备文件) 文件的访问权限 文件最后 访问.修改.节点状态 时间 普通文件大小 -- 如何解决? 方法1:通过os原始 ...
- List移除另外一个list的时候报错,java.lang.UnsupportedOperationException
问题 编写代码的时候,使用Mybatis-plus分页查询返回的list,移除自己new的ArrayList报错 根据异常信息,发现mybatis-plus分页查询返回的list底层并没有实现remo ...
- 跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt)
前言 权限管控对于一个系统来说是非常重要的,最熟悉不过的是菜单权限和数据权限,上一节通过Jwt实现了认证,接下来用它实现接口权限的验证,为什么不是菜单权限呢?对于前后端分离而言,称其为接口权限感觉比较 ...
- xxe 新手学习记录
在做某题时遇到了xxe漏洞,学习+记录 这里因为环境暂时关了,现在复现不了,所以在网络上又找到了一些xxe题目环境 这里有 PikaChu靶场里的xxe环境,这个环境可以在BUUCTF里开,但是这里我 ...
- 2014年 实验四 B2B模拟实验(二)
[实验目的] ⑴.熟悉电子合同签订过程 ⑵.掌握网上招标的流程并体会招标对采购商带来的好处 [实验条件] ⑴.个人计算机一台 ⑵.计算机通过局域网形式接入互联网 ⑶.电子商务模拟实验室软件包. [知识 ...
- JSON,数组根据字段多次分组
我们在前端开发过程中,遇到json对象,有时会需要多次分组.比如说,先按照是业务分组,然后再按照产品线分组,然后通过table或其他方式展示或操作 var obj1=[ { "demp&qu ...
- docker registry 记录
部署 运行下面命令获取registry镜像 docker pull registry 下载到的版本默认为 docker.io/registry latest 将registry镜像运行并生成一个容器 ...
- "计算机科学"与"软件工程"有什么区别?哪个专业更适合你?
"计算机科学和软件工程专业有什么不同?" 以及- "如果我想成为软件工程师,我应该选择计算机科学还是软件工程专业?" 在这篇文章中,我会回答这个问题,并分享一些 ...
- 这里有40条提升编程技能小妙招!还有TIOBE 7月份的编程语言排行榜
如何提高编程技能?恐怕很多开发者思考过这个问题.最近,拥有将近 15 年开发经验的软件工程师 Kesk -*- 写了一篇博客,列举了 40 条对其职业生涯有所帮助的事项. 或许,通过以下 40 个 ...