HTTP服务器设计基础

By guenchi at 2018-02-22 • 0人收藏 • 204人看过

1、HTTP的GET请求

        打开浏览器,输入服务器IP,例如 http://192.168.0.3 ,如果端口号不是80,例如是8000,则输入 http://192.168.0.3:8000 。这时浏览器向服务器发送的HTTP协议头如下:


  1. GET / HTTP/1.1  

  2. Host: 192.168.0.3:8000  

  3. User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)  

  4. Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5  

  5. Accept-Language: en-us,en;q=0.5  

  6. Accept-Encoding: gzip,deflate  

  7. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7  

  8. Keep-Alive: 300  

  9. Connection: keep-alive  

        注意,其中每一行的末尾都是回车加换行(C语言的"\r\n"):

第一行是GET请求和协议版本,其余几行选项字段我们不讨论,HTTP协议头的最后有一个空行,也是回车加换行。

我们实现的Web服务器只要能正确解析第一行就行了,这是一个GET请求,请求的是服务目录的根目录/(在本例中实际上是/var/www),Web服务器应该把该目录下的索引页(默认是index.html)发给浏览器,也就是把/var/www/index.html发给浏览器。假如该文件的内容如下(HTML文件没必要以"\r\n"换行,以"\n"换行就可以了)。


2、HTTP的GET应答

        HTTP头的第一行是协议版本和应答码,200表示成功,后面的消息OK其实可以随意写,浏览器是不关心的,主要是为了调试时给开发人员看的。虽然网络协议最终是程序与程序之间的对话,但是在开发过程中却是人与程序之间的对话,一个设计透明的网络协议可以提供很多直观的信息给开发人员,因此,很多应用层网络协议,如HTTP、FTP、SMTP、POP3等都是基于文本的协议,为的是透明性。

        HTTP头的第二行表示即将发送的文件的类型(称为MIME类型),这里是text/html,纯文本文件是text/plain,图片则是image/jpg、image/png等。

        然后就发送文件的内容,发送完毕之后主动关闭连接,这样浏览器就知道文件发送完了。这一点比较特殊:通常网络通信都是客户端主动发起连接,主动发起请求,主动关闭连接,服务器只是被动地处理各种情况,而HTTP协议规定服务器主动关闭连接。有些Web服务器可以配置成Keep-Alive的。

        如果浏览器请求的文件在服务器上找不到,要应答一个404错误页面。如下是一个应答范例:



  1. HTTP/1.1 200 OK  

  2. Access-Control-Allow-Headers: *  

  3. Access-Control-Allow-Methods: GET,POST,OPTIONS  

  4. Access-Control-Allow-Origin: *  

  5. Access-Control-Request-Headers: *  

  6. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0  

  7. Connection: keep-alive  

  8. Content-Length: 2928  

  9. Content-Type: text/html; charset=utf-8  

  10. Date: Sat, 19 Sep 2015 07:29:48 GMT  

  11. Expires: Thu, 19 Nov 1981 08:52:00 GMT  

  12. Pragma: no-cache  

  13. Server: nginx/1.7.10  

  14. Set-Cookie: PHPSESSID=071udp6t82gdghcspl47s3he27; path=/  

  15. Set-Cookie: width=320; expires=Sat, 22-Mar-2025 12:49:48 GMT; path=/  

  16. Vary: Accept-Encoding  

  17. Vary: Accept-Encoding  

  18. X-Powered-By: PHP/5.4.40  


3、简单的服务器源码


源码


4、HTTP请求总结

服务器的开发过程中,大概注意这样的几点问题,如下:



  1. 1)解析浏览器的请求,在服务目录中查找相应的文件,如果找不到该文件就返回404错误页面  

  2. 2)如果找到了浏览器请求的文件,用stat(2)检查它是否可执行  

  3. 3)如果该文件可执行:  

  4.     发送HTTP/1.1 200 OK给客户端  

  5.     fork(2),然后用dup2(2)重定向子进程的标准输出到客户端socket  

  6.     在子进程中exec(3)该CGI程序  

  7.     关闭连接  

  8. 4)如果该文件不可执行:  

  9.     发送HTTP/1.1 200 OK给客户端  

  10.     如果是一个图片文件,根据图片的扩展名发送相应的Content-Type给客户端  

  11.     如果不是图片文件,这里我们简化处理,都当作Content-Type: text/html  

  12.     简单的HTTP协议头有这两行就足够了,再发一个空行表示结束  

  13.     读取文件的内容发送到客户端  

  14.     关闭连接  


http://blog.csdn.net/ljtyzhr/article/details/48446209

登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...