使用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是同样的结果 但是其它网站不会有这两个..比如segmentfault
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
请留意你的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的动态页面,其他很少用到。
详见维基百科分块传输编码