http协议

概要


超文本文档中包括有超链接,指向其它的资源。超文本文档是万维网(WorldWide Web。即www)的基础。

HTTP协议解决文件传输的问题。HTTP是应用层协议,主要建立在TCP协议之上(偶尔也能够UDP为底层)。

它随着万维网的发展而流行。HTTP协议目的是,怎样在万维网的网络环境下。更好的利用TCP协议,以实现文件,特别是超文本文件的传输。

早期的HTTP协议主要传输静态文件,即真实存储在server上的文件。

随着万维网的发展,HTTP协议被用于传输“动态文件”。server上的程序依据HTTP请求即时生成的动态文件。我们将HTTP的传输对象统称为资源(resource)。

 

点单

 

HTTP实现了资源的订购和传送。其工作方式类似于快餐点单。

请求(request):顾客向服务员提出请求:“来个鸡腿汉堡”。

回复(response):服务员依据情况,回应顾客的请求

 

依据情况的不同,服务员的回应可能有非常多。比方:

服务员准备鸡腿汉堡,将鸡腿汉堡交给顾客。(一切OK)

服务员发现自己仅仅是个甜品站。

他让顾客前往正式柜台点单。(又一次定向)

服务员告诉顾客鸡腿汉堡没有了。

(无法找到)

交易结束后,服务员就将刚才的交易抛到脑后。准备服务下一位顾客。

 

以下来看一下HTTP是怎样详细实现的。

 

格式

 

HTTP协议的通信是一次request-responce交流。client(guest)向server发出请求(request)。server(server)回复(response)client。

 


HTTP协议规定了请求和回复的格式:

起始行(start line)
头信息 (headers)

主体(entitybody)

 

起始行仅仅有一行。它包括了请求/回复最重要的信息。请求的起始行表示(顾客)“想要什么”。回复的起始行表示(后厨)“发生什么”。

头信息能够有多行。每一行是一对键值对(key-valuepair)。比方:

Content-type:text/plain

它表示。包括有一个名为Content-type的參数,该參数的值为text/plain。头信息是对起始行的补充。请求的头信息对server有指导意义(好像在菜单上注明: 鸡腿不要辣)。

回复的头信息则是提示client(比方,在盒子上注明: 小心烫)

主体部分包括了详细的资源。

上图的请求中并没有主体,由于我们仅仅是在下单。而不用该后厨送什么东西(请求是能够有主体内容的)。

回复中包括的主体是一段文本文字(Hello World!)。

这段文本文字正是顾客所期待的,鸡腿汉堡。

 

请求

 

我们深入一些细节。先来看一下请求:

GET /index.htmlHTTP/1.1
Host: www.example.com

在起始行中,有三段信息:

GET方法。用于说明想要server运行的操作。

/index.html资源的路径。

这里指向server上的index.html文件。

HTTP/1.1协议的版本号。HTTP第一个广泛使用的版本号是1.0,当前版本号为1.1。

早期的HTTP协议仅仅有GET方法。遵从HTTP协议,server接收到GET请求后,会将特定资源传送给客户。

这类似于客户点单,并获得汉堡的过程。

使用GET方法时,是客户向server索取资源,所以请求往往没有主体部分。

GET方法也能够用于传输一些不重要的数据。它是通过改写URL的方式实现的。GET的数据利用URL?变量名=变量值的方法传输。比方向http://127.0.0.1发送一个变量“q”。它的值为“a”。那么,实际的URL为http://127.0.0.1?q=a。

server收到请求后,就能够知道"q"的值为"a"。

GET方法之外,最经常使用的是POST方法。它用于从client向server提交数据。

使用POST方法时,URL不再被改写。

数据位于http请求的主体。POST方法最用于提交HTML的form数据。

server往往会对POST方法提交的数据进行一定的处理,比方存入server数据库。

例子请求中有一行头信息。该头信息的名字是Host。

HTTP的请求必须有Host头信息,用于说明server的地址和port。

HTTP协议的默认port是80,假设在HOST中没有说明port,那么将默认採取该port。

在该例子中。server的域名为www.example.com。port为80。域名将通过DNSserver转换为IP地址,从而确定server在互联网上的地址。

 

回复

 

server在接收到请求之后,会依据程序。生成相应于该请求的回复,比方:

HTTP/1.1200 OK
Content-type: text/plain
Content-length: 12

HelloWorld!

回复的起始行相同包括三段信息

HTTP/1.1 协议版本号

200 状态码(status code)。

OK 状态描写叙述

OK是对状态码200的文字描写叙述,它仅仅是为了便于人类的阅读。电脑仅仅关心三位的状态码(statuscode),即这里的200。200表示一切OK,资源正常返回。状态码代表了server回应动作的类型。

其他常见的状态码还有:

302,又一次定向(redirect):我这里没有你想要的资源,但我知道还有一个地方xxx有,你能够去那里找。

404。无法找到(not found):我找不到你想要的资源,无能为力。

(又一次定向时,client能够依据302的建议前往xxx寻找资源。也能够忽略该建议。)

Content-type说明了主体所包括的资源的类型。依据类型的不同,client能够启动不同的处理程序(比方显示图像文件,播放声音文件等等)。以下是一些常见的资源

text/plain 普通文本

text/html HTML文本

image/jpeg jpeg图片

image/gif gif图片

Content-length说明了主体部分的长度。以字节(byte)为单位。

回应的主体部分为一段普通文本,即

Hello World!

 

无状态

 

依据早期的HTTP协议,每次request-reponse时,都要又一次建立TCP连接。TCP连接每次都又一次建立,所以server无法知道上次请求和本次请求是否来自于同一个client。因此,HTTP通信是无状态(stateless)的。

server觉得每次请求都是一个全新的请求。不管该请求是否来自同一地址。

想象高级餐厅和快餐店。高级餐厅会知道客人所在的位置。假设新增点单,那么服务员知道这和上一单同一桌。而在快餐店中,不好意思,服务员并不记录客人的特征。想再次点单?请又一次排队……

随着HTTP协议的发展,HTTP协议同意TCP连接复用,以节省建立连接所耗费的时间。但HTTP协议依旧保持无状态的特性。

 

总结

HTTP协议实现了万维网上的资源传输,採用request-response的工作方式。



posted @ 2016-02-27 08:31  zfyouxi  阅读(177)  评论(0编辑  收藏  举报