将请求的URL转换为实际的文件名
- read获取的数据内容就是HTTP请求消息。
- Web服务器公开的目录其实并不是磁盘上的实际目录,而是虚拟目录。当读取文件时,需要先查询虚拟目录与实际目录的对应关系,并将URI转换成实际的文件名后,才能读取文件并返回数据。
- URI中的路径省略了文件名的情况,这时服务器会读取事先设置好的默认文件名
http://www.glasscom.com/tone/
http://www.glasscom.com/tone/index.html
- 出于某些原因Web服务器的目录和文件名发生变化,但又希望用户通过原来的网址进行访问的时候,这个功能非常有用
运行CGI程序
- 如果URL文件指定的内容是一个程序。会运行这个程序,然后将程序的输出结果返回给客户端。
表单数据发送目标的程序名
- Web服务器会检查URI指定的文件名,看一看这个文件是不是一个程序(例如将.
cgi
、.php
等扩展名的文件设置为程序) - 如果判断要访问的文件为程序文件,Web服务器会委托操作系统运行这个程序,然后从请求消息中取出数据嵌入到HTML中并交给运行的程序
Web服务器的访问控制
客户端IP地址:
- 在调用accept接受连接时,就已经知道客户端的IP地址了,只要检查其是否允许访问就可以了
客户端域名:
- 先根据客户端IP地址查询客户端域名:
其实根据IP地址反查域名也可以使用DNS服务器
- 为了保险起见,还需要用这个域名查询一下IP地址,看看结果与发送方IP地址是否一致。这是因为有一种在DNS服务器上注册假域名的攻击方式,因此我们需要进行双重检查。
用户名和密码:
- Web服务器会向用户发送一条响应消息,告诉用户需要在请求消息中放入用户名和密码
- 浏览器收到这条响应消息后,会弹出一个输入用户名和密码的窗口,用户输入用户名和密码后,浏览器将这些信息放入请求消息中重新发送给服务器
- Web服务器查看接收到的用户名和密码与事先设置好的用户名和密码是否一致,以此判断是否允许访问,如果允许访问,则返回数据
返回响应消息
- Web服务器调用Socket库的write
- 这时,需要告诉协议栈这个响应消息应该发给谁,但我们并不需要直接告知客户端的IP地址等信息,而是只需要给出表示通信使用的套接字的描述符就可以了。套接字中保存了所有的通信状态,其中也包括通信对象的信息,因此只要有描述符就万事大吉了
- 协议栈会将数据拆分成多个网络包,然后加上头部发送出去