CGI指的不是CGI程序本身,而是连接程序与Web服务器程序的接口规格。
服务器概览
服务器可以分为很多种类,其硬件和操作系统与客户端是有所不同的。但是,网络相关的部分,如网卡、协议栈、Socket库等功能和客户端却并不二致。不过他们二者调用的Socket组件不同。
服务器程序的结构:程序分成两个模块,即等待连接模块和负责与客户端通信的模块。当服务器程序启动并读取配置文件完成初始化操作后,就会运行等待连接模块。这个模块会创建套接字,然后进入等待连接的暂停状态。
每次有新的客户端发起连接时,都会启动一个新的客户端通信模块,因些与客户端是一对一的关系。启动新的程序会花费一点时间,一般会事先启动几个客户端通信模块。
服务器端的套接字和端口号:服务器上可能存在多个端口号相同的套接字,但客户端有套接字都是对不同的端口号的,因此我们可以通过客户端的端口号来确认服务器上的套接字。
不过,使用不同端口号的规则仅限一台客户端的内部,当有多个客户端连接时,它们之间端口号是可能重复的。因此,我们还必须要加上客户端的IP地址才能进行判断。
使用描述符来指代套接字的原因如下:等待连接的套接字中没有客户端的IP地址和端口号使用描述符这一信息比较简单
服务器的接收操作
网卡将接收到的信号转换成数字的信息,网卡的MAC模块将网络包从信号还原为数字信息,校验FCS并存入缓冲区。网卡驱动会根据MAC头部判断协议类型,并将包交给相应的协议栈。
协议栈的IP模块会检查IP头部(1)判断是不是发给自己的;(2)判断网络包是否经过分片;(3)将包转交给TCP模块或UDP模块。
如果接收的是发起连接的包,则TCP模块会(1)确认TCP头部的控制位SYN;(2)检查接收方的端口号;(3)为相应的等待连接套接字复制一个新的副本;(4)记录发送方IP地址和端口号待信息。
收到数据包时,TCP模块会(1)根据收到的包的发送方IP地址、发送方端口号、接收方IP地址、接收方端口号找到相对应的套接字;(2)将数据块拼合起来并保存在接收缓冲区中;(3)向客户端返回ACK.
Web服务器程序解释请求消息并作出响应
将请求的URI转换为实际的文件名。如果URI指定的文件内容为HTML文档或图片,那么只要直接将文件内容作为响应消息返回客户端就可以了。
但URI指定的文件内容不仅限于HTML文档,也有可能是一个程序(例cgi程序)。在这个情况下,服务器不会直接返回文件内容,而是会运行这个程序,然后将程序输出的数据返回给客户端。
如果判断为程序文件,Web服务器会委托操作系统运行这个程序,然后从请求消息中取出数据并交给运行的程序。运行的程序收到数据后会进行一系列处理,并将输出的数据返回给Web服务器。
web服务器还可以检查事先设置的一些规则,并根据规则允许或禁止访问。这种根据规则判断是否允许访问的功能称为访问控制。
访问控制规则主要有3种:客户端的IP地址、客户端的域名、用户名和密码。
浏览器接收响应消息并显示内容
只要根据数据类型调用用于显示内容的程序,将数据显示出来就可以了。对于HTML文档、纯文本、图片这些基本数据类型,浏览器自身具有显示这边内容的功能,因此由浏览器自身负责显示。