Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4020929
  • 博文数量: 251
  • 博客积分: 11197
  • 博客等级: 上将
  • 技术积分: 6862
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 14:41
个人简介

@HUST张友东 work@taobao zyd_com@126.com

文章分类

全部博文(251)

文章存档

2014年(10)

2013年(20)

2012年(22)

2011年(74)

2010年(98)

2009年(27)

分类: LINUX

2011-11-18 16:05:20

http协议

网络通信领域,协议是指通信双方约定的规则,彼此按照规则交互,才能理解对方。http是超文本传输协议,之所以需要这样一个规则,是因为现实世界中,C/S请求应答模式的应用占据绝大部分,如果每一种服务都定义自己的格式,世界就会开始变的混乱了,每个人在开发服务器的时候都需要开发对应的客户端,而这个工作显然是不必要的。而为什么选择http而不是其他的规则呢,因为其简单、无状态,能满足应用需求。

 

http协议定义了请求及应答的格式,http的请求和应答是以文本的格式传递的(而不是二进制,二进制格式通常占用更少的空间,但不可读),下面是http请求和应答内容的实例(通过wfetch工具获取,下载wfetch )。

 

 

其中第一行为请求方法(GET),请求URI/)以及版本信息,第二行为目标host信息,第三行为接受的格式(*表示通配符),第四行为空行表示请求结束。一个http请求还可以包含其他的一些描述信息,以文本行(\r\n)为单位分割。

 

上面的请求是对百度主页的get请求,接下来看看应答的内容:


应答通常包括应答头部和数据两部分(数据不是必须的),上面以H开头的行代表头部,以D开头的代表数据(只截取了部分),头部和数据以空行(\r\n)分割。应答信息的第一行代表的版本信息,以及状态信息(请求是否成功及原因),第二行是Date信息,后面还包含Server信息,以及Content-Length(数据部分的长度,本次应答长度为6818bytes,Content-Type(数据的类型,text/html代表是html文件)等。

 

更多关于http协议的描述参考:

 

httphtml与浏览器

http的应答数据通常是html格式(超文本标记语言)返回给客户端(也可以其它格式,如图片,文本等,由应答中的Content-Type决定),而浏览器则是一个能发送http请求,解析html(目前的浏览器的功能很丰富,通常都支持ftp等多种协议)的工具。

 

服务器实现

http服务器是网络服务器的一种,它接受客户的http请求并应答。我在之前的博文中提到过,不同的服务器(这里指基于TCP协议的服务)的不同之处在于处理请求任务的逻辑不同,所有要实现http服务器,只需要在回调函数中分析http请求并回送应答,然后把回调传递给服务器框架。(http://blog.chinaunix.net/space.php?uid=20196318&do=blog&id=3020071

 

在回调函数中做的工作类似于下面的代码片段:

int do_task(cfd)  // cfd与客户端建立的连接

{

1.       读取一行获取请求方法、URI等;(see fdopen

2.       继续读取其它的请求描述信息直到遇到空行(\r\n);

3.       根据服务器的根目录及请求的URI读取资源信息;

4.       构造http应答头部及数据(步骤5中获取),并发送给客户端;

5.       关闭与客户端之间的连接(无状态);

}

 

如果对这部分内容有疑问的可以先阅读下microhttpd的实现,参考如下链接:http://blog.chinaunix.net/space.php?uid=20196318&do=blog&id=362885

 

服务器安全

如果你的服务器完成了上面的工作,那么它就可以跑起来提供服务,但仅仅是能提供服务,你必须做一些工作来保证他能很好的工作,而安全是必须考虑的问题之一,这里主要指防攻击。

 

如果服务器接收到请求内容为空的请求?

如果服务器接受到内容不合法的请求?

如果服务器接收到根目录以外的资源请求?

如果服务器接收到某些客户非常频繁的请求?

如果服务器短期内接收到大量的请求?

……

 

对于每一个连接,服务器需要用掉一个文件描述符资源,而系统可以使用的文件描述符的个数是有限制的,故服务器必须要自我保护意识,当识别出一些错误或非法的请求,主动应答错误信息并关闭客户端的连接,而不是等着客户关闭连接时被动的关闭。

 

为了防护非法请求,可以定义固定的请求格式(如每个请求必须以某个魔数开始),但这仅仅只是增加攻击的难度。当用户请求URI中包含../之类的内容就要注意了,不要让你的服务器访问到超出服务器根目录范围的资源。

 

另外,服务器还需要记录客户的访问信息,如IP(地点),时间,请求URI等,通过分析访问信息来揪出一些恶意客户。服务器还要结合自身的服务能力,持续监控请求数是否超出自己的访问能力的趋势并采取应对措施。

 

阅读(3766) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~