首页 > 使用telnet连接shell写的CGI程序,有两个不明意义的字符 D&0

使用telnet连接shell写的CGI程序,有两个不明意义的字符 D&0

shell CGI代码如下

bash#!/bin/bash

echo "Content-type:text/html"
echo 
echo "hello,Stupid"

然后telnet 127.0.0.1 80 输出如下

bash➜  ~  telnet 127.0.0.1 80          
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET /cgi-bin/test.cgi HTTP/1.1
Host: 127.0.0.1 

HTTP/1.1 200 OK
Date: Tue, 20 Jan 2015 00:40:38 GMT
Server: Apache/2.4.10 (Unix) PHP/5.6.4
Transfer-Encoding: chunked
Content-Type: text/html

d
hello,Stupid

0

Connection closed by foreign host.

提问是 hello,Stupid前后的 "D"&"0"是什么意思?
D是数据的意思? 0是结束的意思? 用NC是同样的结果 但是其它网站不会有这两个..比如


请留意你的CGI程序,因为没有指定响应内容的长度(Content-Length)就开始响应正文了,所以Apache调用CGI程序之后自动在头上添加了Transfer-Encoding: chunked。

“Transfer-Encoding: chunked”表示响应内容的长度不确定、将使用分块传输。首先传输第一块内容,也就是“hello,Stupid\n”,该块的长度是d(十六进制的D,十进制的13),刚好就是你字符串的长度,然后接着响应下一块,因为已经没有了,所以下一块的长度为0(0同时也标志内容结束了)。

综上所述,所以就看到了这个结果。

扩展一点,分块传输用于响应内容长度无法立即确定的情况,比如动态网页,静态资源的话是能够直接给Content-Length,当然也不是说所有的动态网网页都分块传输,因为如果服务器有能力把动态页面内容先缓存到内存里面(并且允许完全生成页面之后一次性返回),返回之前求出内容长度并设置Content-Length就不需要分块传输了。就我个人的经验而言,分块传输一般用在资源受限服务器,比如只有几十K内存的服务器(没错,嵌入式领域)却需要返回几百K的动态页面,其他很少用到。

详见维基百科分块传输编码

【热门文章】
【热门文章】