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

发布于 2022-08-31 20:27:16 字数 674 浏览 14 评论 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是同样的结果 但是其它网站不会有这两个..比如segmentfault

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

简单爱 2022-09-07 20:27:16

请留意你的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的动态页面,其他很少用到。

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文