逖靖寒的世界

每天进步一点点

浅析HTTP协议

浅析HTTP协议

HTTP协议是什么?

简单来说,就是一个基于应用层的通信规范:双方要进行通信,大家都要遵守一个规范,这个规范就是HTTP协议。

HTTP协议能做什么?

很多人首先一定会想到:浏览网页。没错,浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。

HTTP协议如何工作?

大家都知道一般的通信流程:首先客户端发送一个请求(request)给服务器,服务器在接收到这个请求后将生成一个响应(response)返回给客户端。

在这个通信的过程中HTTP协议在以下4个方面做了规定:

1.         RequestResponse的格式

Request格式:

HTTP请求行
(请求)头
空行
可选的消息体

注:请求行和标题必须以<CR><LF> 作为结尾(也就是,回车然后换行)。空行内必须只有<CR><LF>而无其他空格。在HTTP/1.1 协议中,所有的请求头,除Host外,都是可选的。

 

实例:

GET / HTTP/1.1

Host: gpcuster.cnblogs.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

If-Modified-Since: Mon, 25 May 2009 03:19:18 GMT

Response格式:

HTTP状态行
(应答)头
空行
可选的消息体

 

实例:

HTTP/1.1 200 OK

Cache-Control: private, max-age=30

Content-Type: text/html; charset=utf-8

Content-Encoding: gzip

Expires: Mon, 25 May 2009 03:20:33 GMT

Last-Modified: Mon, 25 May 2009 03:20:03 GMT

Vary: Accept-Encoding

Server: Microsoft-IIS/7.0

X-AspNet-Version: 2.0.50727

X-Powered-By: ASP.NET

Date: Mon, 25 May 2009 03:20:02 GMT

Content-Length: 12173

 

­消息体的内容(略)

 

       详细的信息请参考:RFC 2616

       关于HTTP headers的简要介绍,请查看:Quick reference to HTTP headers

2.         建立连接的方式

HTTP支持2中建立连接的方式:非持久连接和持久连接(HTTP1.1默认的连接方式为持久连接)

1)         非持久连接

让我们查看一下非持久连接情况下从服务器到客户传送一个Web页面的步骤。假设该贝面由1个基本HTML文件和10个JPEG图像构成,而且所有这些对象都存放在同一台服务器主机中。再假设该基本HTML文件的URL为:gpcuster.cnblogs.com/index.html。

下面是具体步骡:

1.HTTP客户初始化一个与服务器主机gpcuster.cnblogs.com中的HTTP服务器的TCP连接。HTTP服务器使用默认端口号80监听来自HTTP客户的连接建立请求。

2.HTTP客户经由与TCP连接相关联的本地套接字发出—个HTTP请求消息。这个消息中包含路径名/somepath/index.html。

3.HTTP服务器经由与TCP连接相关联的本地套接字接收这个请求消息,再从服务器主机的内存或硬盘中取出对象/somepath/index.html,经由同一个套接字发出包含该对象的响应消息。

4.HTTP服务器告知TCP关闭这个TCP连接(不过TCP要到客户收到刚才这个响应消息之后才会真正终止这个连接)。

5.HTTP客户经由同一个套接字接收这个响应消息。TCP连接随后终止。该消息标明所封装的对象是一个HTML文件。客户从中取出这个文件,加以分析后发现其中有10个JPEG对象的引用。

6.给每一个引用到的JPEG对象重复步骡1-4。

上述步骤之所以称为使用非持久连接,原因是每次服务器发出一个对象后,相应的TCP连接就被关闭,也就是说每个连接都没有持续到可用于传送其他对象。每个TCP连接只用于传输一个请求消息和一个响应消息。就上述例子而言,用户每请求一次那个web页面,就产生11个TCP连接。

2)         持久连接

非持久连接有些缺点。首先,客户得为每个待请求的对象建立并维护一个新的连接。对于每个这样的连接,TCP得在客户端和服务器端分配TCP缓冲区,并维持TCP变量。对于有可能同时为来自数百个不同客户的请求提供服务的web服务器来说,这会严重增加其负担。其次,如前所述,每个对象都有2RTT的响应延长——一个RTT用于建立TCP连接,另—个RTT用于请求和接收对象。最后,每个对象都遭受TCP缓启动,因为每个TCP连接都起始于缓启动阶段。不过并行TCP连接的使用能够部分减轻RTT延迟和缓启动延迟的影响。

在持久连接情况下,服务器在发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。整个Web页面(上例中为包含一个基本HTMLL文件和10个图像的页面)自不用说可以通过单个持久TCP连接发送:甚至存放在同一个服务器中的多个web页面也可以通过单个持久TCP连接发送。通常,HTTP服务器在某个连接闲置一段特定时间后关闭它,而这段时间通常是可以配置的。持久连接分为不带流水线(without pipelining)和带流水线(with pipelining)两个版本。如果是不带流水线的版本,那么客户只在收到前一个请求的响应后才发出新的请求。这种情况下,web页面所引用的每个对象(上例中的10个图像)都经历1RTT的延迟,用于请求和接收该对象。与非持久连接2RTT的延迟相比,不带流水线的持久连接已有所改善,不过带流水线的持久连接还能进一步降低响应延迟。不带流水线版本的另一个缺点是,服务器送出一个对象后开始等待下一个请求,而这个新请求却不能马上到达。这段时间服务器资源便闲置了。

HTTP/1.1的默认模式使用带流水线的持久连接。这种情况下,HTTP客户每碰到一个引用就立即发出一个请求,因而HTTP客户可以一个接一个紧挨着发出各个引用对象的请求。服务器收到这些请求后,也可以一个接一个紧挨着发出各个对象。如果所有的请求和响应都是紧挨着发送的,那么所有引用到的对象一共只经历1RTT的延迟(而不是像不带流水线的版本那样,每个引用到的对象都各有1RTT的延迟)。另外,带流水线的持久连接中服务器空等请求的时间比较少。与非持久连接相比,持久连接(不论是否带流水线)除降低了1RTT的响应延迟外,缓启动延迟也比较小。其原因在于既然各个对象使用同一个TCP连接,服务器发出第一个对象后就不必再以一开始的缓慢速率发送后续对象。相反,服务器可以按照第一个对象发送完毕时的速率开始发送下一个对象。

3.         缓存的机制

HTTP/1.1中缓存的目的是为了在很多情况下减少发送请求,同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量;HTTP利用一个“过期(expiration)”机制来为此目的。后者减少了网络应用的带宽;HTTP用“验证(validation)”机制来为此目的。

HTTP定义了3种缓存机制:

l Freshness allows a response to be used without re-checking it on the origin server, and can be controlled by both the server and the client. For example, the Expires response header gives a date when the document becomes stale, and the Cache-Control: max-age directive tells the cache how many seconds the response is fresh for.

l Validation can be used to check whether a cached response is still good after it becomes stale. For example, if the response has a Last-Modified header, a cache can make a conditional request using the If-Modified-Since header to see if it has changed.

l Invalidation is usually a side effect of another request that passes through the cache. For example, if URL associated with a cached response subsequently gets a POST, PUT or DELETE request, the cached response will be invalidated.

关于web缓存方面的内容可以参考:Caching Tutorial for Web Authors and Webmasters英文版)(中文版

4.         响应授权激发机制

这些机制能被用于服务器激发客户端请求并且使客户端授权。

详细的信息请参考:RFC 2617: HTTP Authentication: Basic and Digest Access

5.        基于HTTP的应用

1 HTTP代理

原理

index_img3

分类

  1. 透明代理
  2. 非透明代理
  3. 反向代理

index_img4

index_img5

2 多线程下载

  1.  
    1. 下载工具开启多个发出HTTP请求的线程
    2. 每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000
    3. 合并每个线程下载的文件

3 HTTPS传输协议原理

两种基本的加解密算法类型

对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等

index_img6

非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等

index_img7

HTTPS通信过程

index_img8

优点

  1.  
    1. 客户端产生的密钥只有客户端和服务器端能得到
    2. 加密的数据只有客户端和服务器端才能得到明文
    3. 客户端到服务端的通信是安全的

 

4 开发web程序时常用的Request Methods

HEAD

(Head方法)要求响应与相应的GET请求的响应一样,但是没有的响应体(response body)。这用来获得响应头(response header)中的元数据信息(meta-infomation)有(很)帮助,(因为)它不需要传输所有的内容。

TRACE

(Trace方法告诉服务器端)返回收到的请求。客户端可以(通过此方法)察看在请求过程中中间服务器添加或者改变哪些内容。

OPTIONS

返回服务器(在指定URL上)支持的HTTP方法。通过请求“*”而不是指定的资源,这个方法可以用来检查网络服务器的功能。

CONNECT

将请求的连接转换成透明的TCP/IP通道,通常用来简化通过非加密的HTTP代理的SSL-加密通讯(HTTPS)。

5 用户与服务器的交互

  1.  
    1. 身份认证
    2. cookie
    3. 带条件的GET

6 基于Socket编程编写遵循HTTP的程序

 

 

后记:

这篇文章只是对HTTP协议做了一个大概介绍,很多细节都有遗漏,请有兴趣的朋友阅读RFC 2616

学习HTTP协议的好书:

1.O'Reilly - HTTP Pocket Reference:这是一本比较简短的介绍HTTP协议的书,可以作为入门读物

2.O'Reilly - HTTP The Definitive Guide:这是一本宝典级别的书,因为它包含的内容实在多,可以作为全面学习的HTTP协议的首选读物

3.Sams - HTTP Developers Handbook:这是比HTTP The Definitive Guide稍微比HTTP The Definitive Guide简单。不过从我的感觉,这本书比HTTP The Definitive Guide要好,因为它篇幅比较少,介绍的是HTTP精髓,我认为这本书应该是web程序员的首选读物

 

如果您对Cassandra感兴趣,可以看看我的相关文章:http://www.cnblogs.com/gpcuster/tag/Cassandra/

posted on 2009-05-25 11:31 逖靖寒 阅读(46070) 评论(35) 编辑 收藏

Feedback

#1楼 2009-05-25 11:32 孟兆斌      

嘿,现在园子里这样的文章很少,再接再厉。  回复 引用 查看   

#2楼 2009-05-25 11:36 Artech      

个人比较喜欢这种介绍“基础”知识的文章!  回复 引用 查看   

#3楼 2009-05-25 11:51 一抹红      

呵呵,不错  回复 引用 查看   

#4楼 2009-05-25 11:52 飘过而己[未注册用户]

老大,QQ是UDP协议,什么时候QQ变成TCP协议了?  回复 引用   

#5楼 2009-05-25 11:55 O(∩_∩)O哈哈~[未注册用户]

刚好最近用到,谢谢!  回复 引用   

#6楼 2009-05-25 11:57 韦恩卑鄙      

QQ从5年前开始就多协议了
一开始tcp是提供会员的 后来所有人都自动绑定TCP 和http协议了
 回复 引用 查看   

#7楼 2009-05-25 12:13 火星人.NET      

QQ:
局域网是UDP
广域网 tcp
 回复 引用 查看   

#8楼 2009-05-25 12:24 阿炬      

个人比较喜欢这种介绍“基础”知识的文章!  回复 引用 查看   

#9楼 2009-05-25 12:36 canbeing      

最近也在看http,但一直没有找到一个汉化得好的RFC 2616  回复 引用 查看   

#10楼 2009-05-25 13:22 Justin      

--引用--------------------------------------------------
Artech: 个人比较喜欢这种介绍“基础”知识的文章!
--------------------------------------------------------
同上
 回复 引用 查看   

#11楼 2009-05-25 13:26 蛙蛙池塘      

谁从头到尾看了,并且看懂了,才评论?  回复 引用 查看   

#12楼 2009-05-25 13:48 killkill      

HTTP协议是什么?
简单来说,就是一个基于应用层的通信规范:双方要进行通信,大家都要遵守一个规范,这个规范就是HTTP协议。

HTTP是应用层的协议,基于传输层.......
双方要进行通信,大家都要遵守一个规范,这个规范 "不一定就是就是HTTP协议"。
 回复 引用 查看   

#13楼 2009-05-25 14:06 Brett      

很不错,有收获!!  回复 引用 查看   

#14楼 2009-05-25 14:21 sujiantao      

不错,我还不是很清楚这个  回复 引用 查看   

#15楼 2009-05-25 14:37 爱上理财      

受益了  回复 引用 查看   

#16楼 2009-05-25 15:14 Nicholas_F      

很不错  回复 引用 查看   

#17楼 2009-05-25 15:23 ~_~[未注册用户]

@canbeing
有中文版的, 不知道质量如何, 根据以往经验, 比看英文累.
话说翻译 RFC 是非常吃力不讨好的事情, 如果不是大机构推动, 实在没必要吧.
 回复 引用   

#18楼 2009-05-25 17:17 耗子horse      

学习了。正受中文版RFC2616的毒害中……还是看英文的吧。  回复 引用 查看   

#19楼 2009-05-25 19:05 kk.1230      

学习啊...
谁能告知点,qq服务器怎么发消息给客户端的...穿透nat...
 回复 引用 查看   

#20楼 2009-05-25 19:46 Kevin Dai      

嗯,科普一下大家也不错噢。
ASP.NET就可以面对HTTP协议进行编程的吧。
 回复 引用 查看   

#21楼 2009-05-25 21:58 黄泉天上来      

我觉得 基础知识还是要和 现有的联系起来介绍比较好
比如访问一个网站 抓包出来 分析一下
 回复 引用 查看   

#22楼 2009-05-26 09:00 月照孤周      

使用Fiddler2,会知道许多http的东西  回复 引用 查看   

#23楼 2009-06-23 19:33 Silent Void      

图,图,文不如图,我喜欢看图...  回复 引用 查看   

#24楼 2009-07-23 11:19 水边走[未注册用户]

不严谨  回复 引用   

#25楼 2009-07-23 14:35 fsadf[未注册用户]

hao  回复 引用   

#26楼 2009-07-26 20:33 36[未注册用户]

写的不太明白  回复 引用   

#27楼 2009-07-27 16:24 joking[未注册用户]

受益了  回复 引用   

#28楼 2009-10-05 10:26 香槟      

非常感谢,很好的文章,受益了  回复 引用 查看   

#29楼 2009-11-09 12:58 Shine---阳阳      

还好 收藏哈 。。。。。。。。。。。  回复 引用 查看   

#30楼 2009-12-09 16:02 intcrm[未注册用户]

IntCRM是为网络公司量身定制的一套crm系统:强大的客户校验及跟踪功能,完美的解决了销售人员撞单问题、优秀的合同预领功能及合同管理功能,解决了众多网络公司合同丢失、合同收款及员工合同管理防签私单问题。数据防拷贝为公司保障了数据的安全性。组织结构及功能权限完全自主设置,灵活性强。多模式的统计功能,让管理者能很好的掌握公司员工、部门、收入、支出的发展趋势。
IntCRM V2.7已发布,请联系试用,测试地址:http://www/intcrm/cn
KeyWords:网络公司合同管理 网络公司客户管理 客户合同管理系统 网络公司客户合同管理系统 Create At:16:02:30
 回复 引用   

#31楼 2009-12-24 00:58 GaGeGe      

写的不错 从头看到尾了 有点收获  回复 引用 查看   

#32楼 2010-03-23 15:08 jacky2009      

的确是讲解不错  回复 引用 查看   

#33楼 2010-06-29 19:02 xin_ny      

学习了  回复 引用 查看   

#34楼 2010-11-30 11:08 StephenJu      

就上述例子而言,用户每请求一次那个web页面,就产生11个TCP连接。
11个链接???
 回复 引用 查看   

#35楼 2011-09-27 23:28 leather0906      

讲的的浅显易懂,适合我这初学者。  回复 引用 查看