当前位置: 首页 > 工具软件 > mini-httpd > 使用案例 >

mini_httpd-对http服务器和CGI原理的理解

云默
2023-12-01

一、铺垫

        http协议即超文本传输协议,我们在使用浏览器访问服务器的时候就是使用它,在传输层使用tcp协议,网络层使用ip协议,那么通过http协议到底是如何完成对服务器的访问从而将页面显示出来或者将数据提交到服务器进行处理的呢,这里就涉及httpd。

注:以下只是对httpd运行原理以及设计思想的理解,对http报头我也不是特别清楚,见谅!

二、httpd主函数都做了什么

        其实主函数做的工作非常简单,由于http在传输层使用tcp协议,而tcp协议是面向连接的传输协议,它为每一个连接成功之后会重新创建一个套接字专门为其服务,所以主函数主要就是创建侦听套接字–绑定服务器地址信息–开始侦听,然后死循环接收连接,每接收到一个连接就创建一个线程负责该连接。

三、线程入口函数都做了什么

        既然该线程是专门为现在所建立的连接服务的,那么从大的角度来说无非就是收发数据,但是对于这次服务而言,要做的是两件事,如果浏览器是要请求一个页面,则通过对头部的解析,得到正确的路径,然后找到对应文件,将文件内容一一发送出去即可,如果是提交了一些数据需要后台进行处理,就需要涉及到CGI模块。

四、CGI模块都做了什么

        走到这一模块注定是要和后台处理程序打交道了,所以首先将可能要处理的头部数据解析出来,然后重点就来了,CGI模块在这里的设计思想很是精辟,最值得细品的有两点,第一点是进程和进程程序替换,创建一个子进程,然后子进程中处理好相应的数据之后通过定义环境变量的思想间接转交给后台程序,后台程序只需要获取对应的环境变量即可,然后通过进程程序替换替换为后台处理程序开始运行,而父进程(也就还是该服务程序)基本就是负责和子进程(后台)通信,收发数据并且等待后台程序执行完毕,既然涉及到进程间通信了,第二点,管道和重定向的利用,由于管道是半双工通信,所以定义了两根管道,一根负责将接收到的数据发送给后台,另一根负责从后台接收数据,进而发送到前端,而且在创建子进程之前管道要创建好,这样子进程(后台)才能写入数据,然后比较有技巧性的就来了,在子进程程序替换之前,将两根管道对应到后台读写数据的那两个口分别重定向到标准输入和标准输出中去,那么在后台服务程序的编写中我们只需要从标准输入读数据,从标准输出写数据,根本就不知道有管道的存在,完全不用关心httpd是怎么实现的。

五、总结

        对于httpd的理解就这一些,我觉得这个东西很值得深究,涉及操作系统超级多的知识点,而且能帮助我们更加深入的理解所学知识。
 类似资料: