目录
HTTP概况
Web术语
HTTP基本
HTTP是无状态协议
HTTP连接方式
非持续连接HTTP
例子
花费时间
持续连接的HTTP
非持续的缺点;
HTTP报文格式
请求报文
HTTP请求报文的通用格式 及GET、POST、HEAD等常用方法
HTTP响应报文格式
HTTP响应报文通用格式及状态码
Web的应用层协议是超文本传输协议,它是Web的核心,在[RFC 1945]和[RFC 2616]中进行了定义。HTTP有两个程序实现:客户端——服务端 ;客户程序和服务器程序运行不同的端系统中,通过交替HTTP报文进行会话,HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式,所以了解HTTP之前,先了解Web术语。
Web页面(也叫文档)是由对象组成的。一个对象只是一个文件,例如HTML文件、JPEG图形、Java小程序等;他们可通过URL地址寻址。
例如:一个Web页面含有HTML文本和5个JPEG图形,那么这个Web页面有六个对象:一个HTML基本文件加五个图形。HTML基本文件通过对象的URL地址引用页面中的其他对象。
每个URL地址由两部分组成:存放对象的服务器主机名和对象的路径名,如图:;
Web浏览器实现了HTTP的客户端,所以Web环境中我们经常交替使用“浏览器”和“客户”这两个术语。Web服务器实现了HTTP的服务器端,它用于存储Web对象,每个对象由URL寻址。流行的Web服务器由Apache和Microsoft Ineternet Information Server(微软互联网信息服务器)
HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面方式。当用户请求一个Web页面(如点第一个超链接)时,浏览器向服务器发出对该页面中所包含对象的HTTP请求报文,服务器接收到请求并用包含这些对象的HTTP响应报文进行响应,如图;
HTTP使用TCP作为它的支撑运输协议(而不是UDP上运行)。HTTP客户首先发起一个与服务器的TCP连接,一旦连接建立,浏览器就和服务器进程就可以通过套接字接口访问TCP;
服务器向客户发送被请求的文件,而不存储任何关于客户的状态信息。加入某个特定的客户在短短的几秒内两次请求同一个对象,服务器并不会因为刚刚为客户发送该对象就不在作出反应,而是重新发送该对象,就像服务武器已经完全忘记不久之前所做过的事一样。因为HTTP服务器并不保存关于客户的任何信息,所以我们说HTTP是无状态协议。
假设从服务器向客户端传送了一个Web页面步骤,假设该页面含有一个HTML基本文件和10个JPEG图形,并且这11个对象位于同一台服务器上,进一步假设该HTML文件的URL为:http://www.someSchool.edu/someDepartment/home.index。
下面简单估算一下从客户请求HTTP基本文件起到该客户收到整个文件为止所花费的时间。
定义:往返时间(RTT)RTT包括分组的传播时间、分组在中间路由器的和交换机上的排队时延以及分组处理时延。
如图所示:当用户点击超链接会首先在C-S中建立一个TCP连接;涉及到“三次握手”过程,即C给,S发送一个小的TCP的报文段,S用一个小的TCP报文段进行回应,最后,C向S返回确认。三次握手前两部分所耗费的时间占用一个RTT。完成了三次握手的前两部分后,客户结合三次握手的第三部分(确认)向该TCP连接发送一个HTTP请求报文。一旦该请求报文到达服务器,服务器就在该TCP连接上发送HTML文件。该HTTP请求/响应用去了另一个RTT。因此,粗略的讲,总的响应时间就是两个RTT加上服务器传输HTML文件时间。
在采用HTTP1.1持续连接的情况下,服务器在发送响应后保持该TCP连接打开。在相同的客户端与服务器之间,后续的请求和响应报文能通过相同的连接进行传送。特别的是,一个完整的Web页面可以用单个持续的TCP连接进行传送。更有甚者,位于同一台服务器的多个Web页面在从该服务器发送给同一个客户时,可以在单个持续的TCP连接上进行。对对象的这些请求可以一个接一个的发出,而不必等待对未决请求(流水线)的回答。一般来说,如果一条连接经过一定时间间隔(一个可配置的超时间隔)仍未被使用,HTTP服务器就关闭该连接。HTTP默认模式是使用流水线的持续连接。
该报文由5行组成,每行由一个回车和换行符结束。最后一行后再附加一个回车换行符。虽然这个特定的报文仅有5行,但一个请求报文能够具有更多的行或者至少为一行。HTTP请求报文的第一行叫作请求行( request line),其后继的行叫作首部行( headerline)。请求行有3个字段:方法字段、URL 字段和HTTP版本字段。方法字段可以取几种不同的值,包括GET、POST、HEAD、PUT和DELETE。绝大部分的HTTP请求报文使用GET方法。当浏览器请求一个对象时,使用GET方法,在URL字段带有请求对象的标识。
在首部行(和附加的回车和换行)后有一个“实体体”( entity body)。
它有三个部分:一个初始状态行(status line),6个首部行(header line),然后是实体体( entity body)。实体体部分是报文的主要部分,即它包含了所请求的对象本身(表示为data data data data data ..。
状态行有3个字段:协议版本字段、状态码和相应状态信息。在这个例子中,状态行指示服务器正在使用HTTP/1.1,并且一切正常(即服务器已经找到并正在发送所请求的对象)。
下状态码和它们对应的短语。状态码及其相应的短语指示了请求的结果。一些常见的状态码和相关的短语包括: