美学原理开源代码学习的Tinyhttpd

   
想开始陆续研究一些谢谢兴趣之开源代码于是先挑一个代码量短的来接一下,写这首博客的目的是记录下好攻读之历程。Tinyhttpd算是一个微型的web服务器,浏览器和Web服务器之间的通信采用的是Http,所以同样开始的切入点是HTTP协议,这里说一些如来开HTTP通信的出要看一下RFC中对两样版本HTTP的定义,以下原理部分还是起《后台开发:核心技术与应用实践》中HTTP协议章节中推出来的,对后大感兴趣的同学可以拘留一下,讲述后台开发所用拥有的技能点同样随颇科学的开。

一、HTTP协议

HTTP工作流程:

  于OSI七层模型中,HTTP是因TCP上之应用层协议如果我们所说之HTTPS基于同处应用层的TLS、SSL协议层之上。HTTP默认的捧口号为80,HTTPS默认的端口号也443。在HTTP1.1面临(通过Connection头设置)默认在HTTP传输就后持续开TCP连接,在此之前的HTTP版本则默认是断开连接的,也就是说这次请与上次请求是不同的简单独TCP连接。一破HTTP操作称为一个事务,其工作过程得分成以下四步。

  (1)首先客户机与服务器需要树立连接 。 只要单击某个超级链接, HTTP
的行事便开始 。
  (2)建立连接后,客户机发送一个请求被服务器,请求方式的格式为:统一资源标识符(URL
)、协议版本号,后边是 MIME
信息(包括要修饰符、客户机信息和可能的内容) 。

  (3)服务器收到请求后,给予相应的响应信息,其格式为一个态行,包括信息的情商版本号、一个中标还是不当的代码,后边是
MTh伍信息(包括服务器信息、实体信息与可能的情节) 。

  (4)客户端接收服务器所返的信经过浏览器显示在用户之显示屏上,然后客户机与服务器断开连接

HTTP协议结构:

  HTTP 协议无论是请求报文还是对报文,都分为以下 4 只片 。

  (1)报文头( initial line ),上面的事例中的“ GET
http://www.baidu.com/favicon.icoHTTP/1.1 ”表示为此 GET 方法要
http://www.baidu.com/favicon. ic。这个文件,用的是HTTP/1.1 协议。

  (2) 0 只或多只请求头( header line ),例如 Accept-Language: en

  (3)空行(作为 header lines 的结束) 。

  (4)可摘的音讯体 。

  HTTP 协议是根据行之协议,每一样履 以 \r\n 作为分隔符 。
报文头通常表明报文的种(例如请求类型),且报文头只占一行
;请求头附带一些新鲜信息,每一个请求求头占一履行,其格式为 name:value
,即以分行作为分隔; 空行也就算盖一个 \r\n 分隔;可选 body
通常含数据,例如服务器返回的有静态 HTML 文件的情 。

  HTTP请求方法:

  HTTP/ 1.1 协议中共定义了 9 种办法(有时也于“动作”)来表 明
Request-URI 指定的资源的不比操作方法,如下所陈述。

  ( 1 ) OPTIONS :返回服务器对特定资源所支撑之 HTTP
请求方法;也足以以为 Web服务器发送“*”的乞求来测试服务器的功能性。

  ( 2) HEAD :向服务器需要和 GET
请求相平等的响应,只不过响应体将未会见受归 。
这无异法好在不必传输整个响应内容之情事下,就好抱包含在响应消息头着之长信息
。该方法常用于测试超过链接的卓有成效,是否足以看,以及新近是否更新等消息

  ( 3) GET :向特定的资源发出请求 。 注意 : GET
方法不该吃用来产生“副作用”的操作中,例如在 web app .
中之运,其中一个由是 GET 可能会见给网蜘蛛等随意访问 。

  ( 4 ) POST
:向指定资源提交数据进行处理要(例如提交表单或者上传文书) 。
数据被含有在伸手求体中 。 POST
请求或会见促成新的资源的树或者对曾发资源的改动 。

  ( 5 ) PUT :向指定资源职务上传其最新内容 。

  ( 6) DELETE : 请求服务器删除 Request-URI 所标识的资源 。

  ( 7 ) TRACE :回显服务器收到的要,主要用来测试或确诊。

  ( 8) CONNECT: HTTP/ 1.1
协议被养给能够用连接改吧管道方式的代理服务器 。

  ( 9) PATCH :用来以一部分修改以为某一样资源,该操作添加于规范盯C5789
中 。

  HTTP 服务器至少应该实现 GET 和 HEAD 方法,其他措施都是可选的 。
此外,除了上述措施,特定的 HTTP 服务器还会扩大自定义的方法 。

  HTTP 常见的求头:

  于 HTTP/ l.l 协议被,所有的乞求求头(除 Host
外)都是可选的,因为Host主要用于请求的服务器的IP地址与端口号,请求头有Host、Connection、Accept、Accept-Encoding、User-Agent、Cookie等,请求头太多这里就是非排出来了。

  HTTP回应报文:

  返回码由 3 个数字组合,第一只数字定义了响应的类,且发出 5
种可能的取值。

  ( 1 ) lxx :指示信息,表示请都接到,继续处理。

  ( 2) 2xx :成功,表示要都让成功接到、理解 、 接受 。

  ( 3) 3xx :重定向,要到位请求必须进行重复进一步的操作 。

  ( 4 ) 4xx :客户端错误,请求有语法错误或要无法兑现。

  ( 5) 5xx :服务器端错误,服务器未能落实合法的请求 。

  Date :表示消息发送的时间,时间的讲述格式由 rfc822 定义 。

  Server : 指明 Web 服务器用来拍卖要的软件信息 。

  Accept-Ranges : Web
服务器表明自己是不是收取获取其有实体的一律有些(比如文件之一律有的)的恳求
。 bytes 表示接到, none 代表未收。

  Vary: Web 服务器用该头部的情告诉 Cache
服务器,在啊法下才会就此本应所返的靶子应后续之乞求 。

  Content-Encoding : Web 服务器表明自己下了呀压缩方法( gzip,
deflate)压缩响应中的目标。

  Content-Length: Web 服务器告诉浏览器自己应的靶子的长短 。

  Content-Type: Web 服务器告诉浏览器自己应的靶子的类型 。

二、CGI

  CGI ( Common Gateway Interface ,通用网关接口)是 HTTP
协议中最为紧要的技术有,有着不可替代的根本位置 。 CGI 是一个 Web
服务器提供信息服务之标准接口 。 通过 CGI 接口, Web
服务器即能够获取客户端提交的音,转交给劳务器端的 CGI
程序进行拍卖,最后回来结果被客户端 。 组成 CGI 通信系统的凡少部分:
一部分凡是 HTML
页面,就是当用户端浏览器上显示的页面;另一样有则是运行在服务器上之 CG I
程序 。

  浏览器就待指定执行服务器上的哪位CGI程序即使执行,一般情况下,服务器和
CGI
程序中是经规范输入输出来展开数据传递的(就比如tinyhttpd中调用CGI程序),而这进程要环境变茸的搭档方可实现。环境变量在
CGI 中颇具重大之身份,每个 CGI
程序只能处理一个用户请求,所以当激活一个CGI程序进程时为开创了属于该过程的环境变量,CGI程序会用Python、PERL、Shell、C或C++等语言来落实。

  CGI 环境变量在 CGI 程序启动时初始化,在得了时销毁。当一个 CGI
程序不是被 HTTP 服务器调用时,它的环境变盘几乎是网环境变量的复制
。当此 CGI 程序让 HTTP 服务器调用时,它的环境变量就会见多矣以下关于HTTP
服务器、客户端、 CGI 传输过程等种类。CGI 相关的环境变量有 3
种:与请求相关的环境变量、与服务器相关的环境变量和与客户端相关的环境变量,,详细呈现表
12-1 。

  美学原理 1

  CGI 工作规律:每当客户要 CGI 的早晚 Web
服务器即请操作系统生成一个新的CGI
进程,该过程处理了要后退出,下一个请求来常又创新过程 。
当然,这样于访问量很少没有出现的场面中,可是当访问量增大且并发存在时时,这种方法就是不切合了,于是便产生矣FastCGI。

  一般景象下, FastCGI 的所有办事流程如下所陈述。

  ( 1 ) Web Server 启动时载入 FastCGI 进程管理器( IIS ISAPI 或 Apache
Module ) 。

  ( 2 )FastCGI 进程管理器自身初始化,启动多只 CGI 进程并等来自 Web
服务器的连接 。

  ( 3 )当客户端请求到达 Web Server 时, FastCGI
进程管理器选择并连续至一个 FastCGI进程 。 Web 服务器将 CGI
环境变量和规范输入发送至 FastCGI 进程 。

  ( 4) FastCGI 子进程就处理后拿业内输出及错误信息从平连接返回 Web
Server。当FastCGI 子进程关闭连接时,请求虽为告知处理完 。 FastCGI
进程就等待并拍卖来自FastCGI 进程管理器(运行于 Web
服务器中)的下一个连接 。

三、tinyhttpd解析

  关于tinyhttpd的代码解析的博客太多矣,流程与注释都讲述的雅详细,随便搜个tinyhttpd解析就有成千上万博客出现,这里要写一下好在扣押这卖源码时欠的知识点,因为自身几乎从未linux下编程的涉,所以本着linux下用的Glib库调用不极端熟悉,TCP协议栈也是自身只有看罢了轻量级Lwip的源码。

  1.bind函数当传入的port为0时凡会自由分配一个端口号,所以tinyhttpd中才见面发出显示随机的捧口号,getsockname函数获取套接字之地方将动态分配的端口号值取出。

  美学原理 2美学原理 3

  2.int stat(const char *file_name, struct stat
*buf);通过文件名filename获取文件信息,并保留于buf所因的结构体stat中,S_IXUSR:文件所有者拥有可实施权,S_IXGRP:用户组具可实行权,S_IXOTH:其他用户具可读博权限。

美学原理 4

  3.int pipe(int filedes[2]);

  返回值:成功,返回0,否则回-1。参数数组包含pipe使用的鲜个公文的叙述吻合。fd[0]:读管道,fd[1]:写管道。

  必须于fork()中调用pipe(),否则子进程不会见持续文件讲述吻合。两单过程不联合享祖先进程,就非克采取pipe。但是得利用命名管道。

  pipe(cgi_output)执行成功后,cgi_output[0]:读通道
cgi_output[1]:写通道

  美学原理 5

   int dup2(int oldfd,int newfd);函数的用意是复制文件讲述吻合。

  4.fork函数,创建一个子进程,fork函数之后的一对由当fork函数执行完毕后,如果创建新历程成功,则出现个别单过程,一个是子进程,一个凡大进程。在旁进程面临,fork函数返回0,在爸爸进程遭到,fork返回新创建子进程的过程ID,有工夫还拘留fork源码是何等贯彻之。

  5.execl函数行,第一参数path字符指针所指为而实践之文书路径,后面跟着可易参数,这里说一些出于GCC使用AAPCS规范,可转移参数的实现小于四单的语是于r0-r3抱,大于四独底言辞虽设由栈中获取参数。 

  6.pid_t waitpid(pid_t pid, int * status, int
options);会暂时停止目前进程的行, 直到起信号到或子进程结束. 

  于编辑博客边看tinyhttpd,目前温馨之不够明亮的函数就地方几乎独,有空再看看它的源码实现。