TinyHTTPd 编译及 HTTP 浅析

继前文分析了TinyHTTPd源码。这里给出修改地方,然后运行下该项目。之后结合该开源项目介绍下 HTTP 涉及的部分。

编译环境:Deepin Linux 2014.2,内核版本 Linux 3.13.0,GCC 4.8.2

修改处(所指位置为源码位置):因为现在 Linux 已经支持 pthread 了,所以不需要按照它给定的英文注释那样修改代码了。

1、33行改为 void* accept_request(void *); 相应的该函数的实现也要做出修改:

void* accept_request(void *pclient)
{
	int client = *(int*)pclient;
	……
	unimplemented(client);
	return NULL;//r77
	……
	close(client);//r128
	return NULL;//
}
返回值也得相应修改,上面的修改主要是为了适应 pthread_create() 函数参数。(参见《Unix 高级环境编程》)

2、438行和483行(源码436行和481行)的变量类型改为 socklen_t

3、497行(源码495行)改为 if (pthread_create(&newthread , NULL, accept_request, (void*)&client_sock) != 0)

4、Makefile 文件中编译的一行改为 gcc -W -Wall -o httpd httpd.c -lpthread 后面要加上-lpthread 依赖,去掉对libsocket的依赖。


然后 make,可以得到运行端口号,然后在浏览器中输入 localhost:运行端口号,就可以看到下面的结果。

    TinyHTTPd 编译及 HTTP 浅析_第1张图片


HTTP 

TinyHTTPd 是一个超轻量级的 HTTP Server。源码里面自然涉及到相应的HTTP,尤其是 accept_request 函数。这里简单的介绍下HTTP协议。

uri 和 url

URI 是统一资源标识符,某个协议方案表示的资源的定位标识符。相比之下,我们更熟悉 URL(统一资源定位符),它就是Web 浏览器访问Web页面时需要输入的网页地址。比如http://hacker.jp/ 就是 URL。

URI 用字符串标识某一互联网资源,而URL 表示资源的地点(互联网上所处的位置,你输入浏览器的网址,标明了互联网上所处的位置)

HTTP 协议使用 URI 定位互联网上的资源,正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到(如果没有GFW)

HTTP 协议用于客户端和服务器端之间的通信,在两台计算机之间使用 HTTP 协议通信时,在一条通信线路上必定有一端是客户端,另一端则是服务器端。HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回,换句话说,肯定是先从客户端开始建立通信的,服务器端没有接收到请求之间不会发送响应,在TinyHTTPd中,服务器端是在接收到客户端的请求之后才做出的响应。


告知服务器意图的 HTTP 方法

体现在TinyHTTPd中的为 GET 和 POST method。

GET:获取资源

GET 方法用来请求访问已被 URI 识别的资源。指定的资源进服务器端解析后返回响应内容。换言之,如果请求的资源是文本(静态页面请求),那就保持原样返回;如果是像CGI 那样的程序(动态页面请求),则返回经过执行后的输出结果。

TinyHTTPd 编译及 HTTP 浅析_第2张图片TinyHTTPd 编译及 HTTP 浅析_第3张图片

POST:传输实体主体

POST 的主要目的是用来传输实体的主体,不是获取响应的主体内容

TinyHTTPd 编译及 HTTP 浅析_第4张图片TinyHTTPd 编译及 HTTP 浅析_第5张图片

本博文插画来源于《图解HTTP》(日本)。体外说一下,我发现日本的技术类书籍,一般写的比较简单易懂,有的甚至像儿童读物那种,以前读过几本电子类的书籍大抵是这样,各种插画,可以在轻松的条件下阅读,而美国的则不同,比较严谨,系统,专业化,需要静下心来细细研读。中国的技术类书籍,只要是大学教授写的,呵呵,你懂的。

其余几种方法TinyHTTPd中没涉及到,这里就不赘述了。


HTTP报文

请求端(客户端)的HTTP报文叫做请求报文,响应段(服务器端)的叫做响应报文。HTTP报文本身是由多行(CR+LF作换行符'\r\n')数据构成的字符串文本

请求报文和响应报文的结构

TinyHTTPd 编译及 HTTP 浅析_第6张图片TinyHTTPd 编译及 HTTP 浅析_第7张图片


看看左图的响应报文,状态行:协议版本+状态码+状态码的原因短语,下面是响应首部字段,通用首部字段,实体首部字段等信息,使用首部字段是为了给浏览器和服务器提供报文主体大小,所使用的语言,认证信息等内容,最下面的报文主体即网页内容。你打开浏览器,右键查看网页源代码,显示的这一部分就是报文内容。

下面用 wireshark 实时抓包一下请求 www.baidu.com 的数据包

TinyHTTPd 编译及 HTTP 浅析_第8张图片

上面同样标明各类信息,如首部字段信息,请求URI等。



你可能感兴趣的:(http,tinyhttpd)