您的位置:首页 > 理论基础 > 计算机网络

TinyHttp学习(一): 基础知识学习和该项目的需求

2018-02-22 21:00 197 查看
TinyHttp是一个非常棒的学习项目, 短短500行便实现了一个轻量级的HTTP服务器,对于我们学习网络编程和HTTP非常有帮助。
这里先提供一下学习该项目必备的基础知识,着重面向对HTTP和socket编程毫无概念的新手朋友们。

一、HTTP协议基础
    1.HTTP消息格式

通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
典型的HTTP请求格式包括 请求行,请求头,请求体三个部分。如下所示,其中\r\n只是我特意标出来的换行符,实际上并不显示。 POST/GET http://google.com  HTTP/1.1\r\n Accept:*/*\r\n Pragma: no-cache\r\n Cache-Control: no-cache\r\n  \r\n    【请求体】

其中第一行就是请求行,    其格式包括 请求方法、请求url地址和协版本。
第2-4行是请求头, 分别代表了4个头域。头域通常是Web服务器去使用的。
请求头后跟着一个空行, 接下来就是请求体。请求体没有固定格式, Web服务器通常不参与请求体的解析,由用户自己完成。

典型的HTTP响应格式包括 响应行,响应头,响应体三个部分。如下所示

HTTP/1.1 200 OK\r\nContent-Type: text/html \r\nServer: jdbhttpd/0.1.0\r\n
\r\n【响应体】第一行就是响应行,  响应成功就会回复200,  响应不成功会回复404等错误代号,
第2-3行就是响应头。  Content-Type指数据类型,一般为text类型,有时是一些图片或者app类型时,要修改一下。
一个空行之后,就是响应体。

2.   HTTP响应过程

    通常,先是由客户端(浏览器)发出HTTP请求
    发出后与服务器建立一个TCP连接
    服务器先判断请求方法是GET还是POST还是其他。

    接着读取url,url代表了该请求要访问的文件或者接口。 url有时候可以为 url?query_string,  即中间隔一个问号,后面跟着一些请求参数。
    接着再读取响应头,并根据每个响应头做出相应的措施。
    请求体一般由用户处理。

二、网络编程基础
    这里给出接下来TinyHttp会用到的所有函数,届时可以在这里进行比对,但不会太详细地去介绍,具体的请参阅《UNIX高级编程》和《UNIX网络编程》两本书

网络编程相关函数socket
bind
listen
getsockname
htons
ntohs
acceptIO以及多线程相关:fgets
recv
write
pipe
fork
dup
pthread_create

三、  CGI脚本
CGI代表Common Gateway Interface(通用网关界面),它使在网络服务器下运行外部分应用程序(或网关)成为可能。CGI-BIN 目录是存放CGI脚本的地方。这些脚本使WWW服务器和浏览器能运行外部程序,而无需启动另一个原因程序。

它是运行在Web服务器上的一个程序,并由来自于浏览者的输人触发。CGI是在HTTP服务器下运行外部程序(或网关)的一个接口,它能让网络用户访问远程系统上的使用类型程序,就好像他们在实际使用那些远程计算机一样。 CGI应用程序的工作原理是这样的:

1.浏览器通过HTML表单或超链接请求指上一个CGI应用程序的URL。

2.服务器收发到请求。

3.服务器执行指定所CGI应用程序。

4.CGI应用程序执行所需要的操作,通常是基于浏览者输人的内容。

5.CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。

6.网络服务器把结果返回到浏览器中。

四、 TinyHttp的实现需求
先理解tinyhttp要做什么。这里的需求用于希望不直接借助源码,先自己用C语言写一遍的同学。实现需求:
    1. 使用多线程服务器模型,  服务器时刻监听, 每当收到一个请求, 则新建一个线程来处理这个请求。

    2. 从客户端读取消息时,每次读一行
        从第一行中,判断出方法是GET还是POST

        如果是GET,且没有url?qurey_string 形式,即没有携带请求参数时,且请求的文件是非执行文件, 则直接返回url中所对应的文件数据。  例如url为/lsx/data/blog.txt    ,则找到该文件blog.txt, 并给客户端发送响应消息。  注意,响应消息要先发响应行,即200 OK, 再发响应头, 发几个重要的头部即可,不需要都发。   空行之后,再发送这个文件的数据即可。
        如果Get带有请求参数,或者GET是可执行文件, 或者为POST,则一定会调用一个的处理脚本,来返回一串数据。我们需要做的就是调用那个处理脚本,然后将脚本所输出的内容(通常为标准输出,这时候我们需要重定向)发回到客户端(不要遗漏响应行和响应头)
3.加上响应的错误消息,例如文件不存在等错误返回。

fgetsdupforkpiperecvwrite
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: