CGI 协议是否会具体到通讯报文?
CGI(Common Gateway Interface)不涉及具体的网络通讯报文格式,它定义的是 Web服务器与外部程序之间的数据交互方式,而不是像HTTP或FastCGI那样的二进制协议。下面分几个方面详细说明:
1. CGI 的交互方式(非报文协议)
CGI 的核心是 通过环境变量和标准输入/输出(stdin/stdout)传递数据,不依赖特定的二进制报文结构。具体流程:
(1) Web服务器传递给CGI程序的数据
-
环境变量(由服务器设置,CGI程序读取):
-
REQUEST_METHOD
:HTTP方法(GET/POST等)。 -
QUERY_STRING
:URL中的查询参数(如?name=foo
)。 -
CONTENT_TYPE
:请求体的MIME类型(如application/json
)。 -
CONTENT_LENGTH
:请求体的字节长度。 -
其他HTTP头会转为
HTTP_*
格式(如HTTP_USER_AGENT
)。
-
-
标准输入(stdin):
-
如果是POST/PUT请求,请求体会通过
stdin
传递给CGI程序,需根据CONTENT_LENGTH
读取指定字节数。
-
(2) CGI程序返回给服务器的数据
-
标准输出(stdout):
-
CGI程序必须 先输出HTTP头,后跟响应体,用空行分隔(
\n\n
)。 -
示例:
print("Content-Type: text/html\n") # HTTP头 print() # 空行 print("<h1>Hello CGI</h1>") # 响应体
-
2. 对比真正的“报文协议”(如FastCGI)
CGI 不定义任何二进制或文本报文格式,而其他协议(如FastCGI、SCGI)会严格规定报文结构:
协议 | 是否定义报文格式 | 示例报文结构 | 用途 |
---|---|---|---|
CGI | ❌ 否 | 无,靠环境变量和stdin/stdout | 通用但性能低 |
FastCGI | ✅ 是 | 二进制报文(类型+请求ID+内容长度等) | 高性能持久化连接 |
SCGI | ✅ 是 | 文本协议(CONTENT_LENGTH␀数据... ) | 简化版FastCGI |
HTTP | ✅ 是 | GET /path HTTP/1.1␍␊Host:... | 客户端与服务器通信 |
FastCGI 报文示例(二进制协议)
# 请求头报文(16字节固定格式) typedef struct {unsigned char version; // 协议版本unsigned char type; // 报文类型(如BEGIN_REQUEST)unsigned char requestId[2];// 请求IDunsigned char contentLength[2]; // 内容长度unsigned char paddingLength; // 填充长度unsigned char reserved; } FCGI_Header;# 实际数据(如HTTP参数)跟在报文头后
3. 为什么CGI不需要报文格式?
-
简单性:CGI设计初衷是跨语言通用,直接利用操作系统的标准输入/输出和环境变量。
-
无持久连接:每次请求结束进程退出,无需维护复杂状态。
-
文本友好:HTTP本身是文本协议,CGI直接复用其特性(如环境变量映射HTTP头)。
4. 如果想看CGI的“实际数据流”
虽然CGI没有报文,但可以通过抓包或日志观察数据流:
(1) 客户端发送的HTTP请求
POST /cgi-bin/script.py HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded Content-Length: 12name=foo&age=20
(2) Web服务器传递给CGI程序的数据
-
环境变量:
REQUEST_METHOD=POST CONTENT_TYPE=application/x-www-form-urlencoded CONTENT_LENGTH=12 QUERY_STRING= # GET请求时才有
-
标准输入(stdin):
name=foo&age=20
(3) CGI程序返回的响应
-
标准输出(stdout):
Content-Type: text/html<html>Hello, foo!</html>
5. 总结
-
CGI不定义通讯报文,而是通过 环境变量 + stdin/stdout 传递数据。
-
真正的报文协议(如FastCGI/SCGI)会严格规定二进制或文本格式,适合高性能场景。
-
CGI的劣势:每次请求启动新进程,性能低下,适合历史学习或简单脚本,现代Web开发已转向FastCGI(PHP-FPM)、WSGI(Python)等方案。