HTTP 协议基础
1、HTTP与WEB服务 HTTP应用层协议是Web的核心。 HTTP协议运行在客户程序和服务器程序中。不同端系统上的客户程序和服务器程序通过交换HTTP消息彼此交流。 HTTP定义Web客户(即浏览器)如何从web服务器请求Web页面,以及服务器如何把Web页面传送给客户。
Web页面(web page,也称为文档)由多个对象构成。对象(object)仅仅是可由单个URL寻址的文件,例如HTML文件、JPG图像、GIF图像、JAVA小应用程序、语音片段等。 例如,如果一个Web页面包含HTML文本和5个JPEG图像,那么它由6个对象构成,即基本H1ML文件加5个图像。
浏览器是web的用户代理,它显示所请求的Web页面,并提供大量的导航与配置特性。Web浏览器还实现HTTP的客户端 Web服务器存放可由URL寻址的Web对象,web服务器还实现HTTP的服务器端。
2、Http工作流程 HTTP客户端启动TCP连接(创建插口) 到服务器, 端口 80。一旦建立连接,浏览器进程和服务器进程就可以通过各自的套接字来访问。 http 报文(应用层协议报文) 在浏览器 (http client) 和Web服务器(http server)之间进行交换。 客户端套接字。客户往自己的套接字发送HTTP请求消息,也从自己的套接字接收HTTP响应消息。
服务器从自己的套接字接收HTTP请求消息,也往自己的套接字发送HTTP响应消息。 关闭TCP 连接 注意:在向客户发送所请求文件的同时,服务器并没有存储关于该客户的任何状态信息。即便某个客户在几秒钟内再次请求同一个对象,服务器也不会响应说:自己刚刚给它发送了这个对象。 所以http 是 “无状态(stateless)”的服务,不保留任何访问过的请求信息 HTTP/1.0和HTTP/1.1都把TCP作为底层的传输协议。HTTP客户首先发起建立与服务器TCP连接。一旦建立连接,浏览器进程和服务器进程就可以通过各自的套接字来访问TCP。如前所述,客户端套接字是客户进程和TCP连接之间的“门”,服务器端套接字是服务器进程和同一TCP连接之间的“门”。客户往自己的套接字发送HTTP请求消息,也从自己的套接字接收HTTP响应消息。类似地,服务器从自己的套接字接收HTTP请求消息,也往自己的套接字发送HTTP响应消息。客户或服务器一旦把某个消息送入各自的套接字,这个消息就完全落入TCP的控制之中。TCP给HTTP提供一个可靠的数据传输服务;这意味着由客户发出的每个HTTP请求消息最终将无损地到达服务器,由服务器发出的每个HTTP响应消息最终也将无损地到达客户。我们可从中看到分层网络体系结构的一个明显优势——HTTP不必担心数据会丢失,也无需关心TCP如何从数据的丢失和错序中恢复出来的细节。这些是TCP和协议栈中更低协议层的任务。
当用户请求一个Web页面(譬如说点击某个超链接)时,浏览器把请求该页面中各个对象的HTTP请求消息发送给服务器。服务器收到请求后,以运送含有这些对象HTTP响应消息作为响应。
3、HTTP连接的类型 非持久连接和持久连接 HTTP既可以使用非持久连接(nonpersistent connection),也可以使用持久连接(persistent connection)。HTTP/1.0使用非持久连接,HTTP/1.1默认使用持久连接。
3.1 非持久连接 非持久连接情况下从服务器到客户传送一个Web页面的步骤。假设该贝面由1个基本HTML文件和10个JPEG图像构成,而且所有这些对象都存放在同一台服务器主机中。 再假设该基本HTML文件的URL为:www.chinaitlab.com/somepath/index.html。
下面是具体步骡: 1. HTTP客户初始化一个与服务器主机www. chinaitlab 下面是具体步骡: 1.HTTP客户初始化一个与服务器主机www.chinaitlab.com中的HTTP服务器的TCP连接。HTTP服务器使用默认端口号80监听来自HTTP客户的连接建立请求。 2.HTTP客户经由与TCP连接相关联的本地套接字发出—个HTTP请求消息。这个消息中包含路径名/somepath/index.html。
3. HTTP服务器经由与TCP连接相关联的本地套接字接收这个请求消息,再从服务器主机的内存或硬盘中取出对象/somepath/index 3.HTTP服务器经由与TCP连接相关联的本地套接字接收这个请求消息,再从服务器主机的内存或硬盘中取出对象/somepath/index.html,经由同一个套接字发出包含该对象的响应消息。 4.HTTP服务器告知TCP关闭这个TCP连接(不过TCP要到客户收到刚才这个响应消息之后才会真正终止这个连接)。
5.HTTP客户经由同一个套接字接收这个响应消息。TCP连接随后终止。该消息标明所封装的对象是一个HTML文件。客户从中取出这个文件,加以分析后发现其中有10个JPEG对象的引用。 6.给每一个引用到的JPEG对象重复步骡1-4。
3.2持久连接 持久连接情况下,服务器在发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。 通常,HTTP服务器在某个连接闲置一段特定时间后关闭它,而这段时间通常是可以配置的。 持久连接分为不带流水线(without pipelining)和带流水线(with pipelining)两个版本。如果是不带流水线的版本,那么客户只在收到前一个请求的响应后才发出新的请求。 持久连接情况下,服务器在发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。整个Web页面(上例中为包含一个基本HTMLL文件和10个图像的页面)自不用说可以通过单个持久TCP连接发送:甚至存放在同一个服务器中的多个web页面也可以通过单个持久TCP连接发送。通常,HTTP服务器在某个连接闲置一段特定时间后关闭它,而这段时间通常是可以配置的。持久连接分为不带流水线(without pipelining)和带流水线(with pipelining)两个版本。如果是不带流水线的版本,那么客户只在收到前一个请求的响应后才发出新的请求。这种情况下,web页面所引用的每个对象(上例中的10个图像)都经历1个RTT的延迟,用于请求和接收该对象。与非持久连接2个RTT的延迟相比,不带流水线的持久连接已有所改善,不过带流水线的持久连接还能进一步降低响应延迟。不带流水线版本的另一个缺点是,服务器送出一个对象后开始等待下一个请求,而这个新请求却不能马上到达。这段时间服务器资源便闲置了。
HTTP/1.1的默认模式使用带流水线的持久连接。这种情况下,HTTP客户每碰到一个引用就立即发出一个请求,因而HTTP客户可以一个接一个紧挨着发出各个引用对象的请求。服务器收到这些请求后,也可以一个接一个紧挨着发出各个对象。
3.3 流水线和非流水线方式 流水线方式指没有收到上一个请求的对象就发送新的对象的请求 非流水线方式指必须要等到上一个请求的对象到达之后再发送新的对象的请求
4、HTTP消息格式 HTTP规范1.0[RPcl945]和HTTP1.1 [RFC 2616]定义了HTTP消息的格式。HTTP消息分为请求消息和响应稍息两类。
4.1 HTTP请求消息 下面是一个典型的HTTP请求消息: GET /somedir/page.html HTTP/1.1 Host:www.chinaitlab.com Connection:close User-agent:Mozilla/4.0 Accept-language:zh-cn (额外的回车符和换行符)
首先,这个消息是用普通的ASCII文本书写的。 其次,这个消息共有5行(每行以一个回车符和一个换行符结束),最后一行后面还有额外的一个回车特和换行符。 请求行有3个宁段:方法字段、URL字段、HTTP版本宇段。
方法字段有若干个值可供选择,包括GET、POST和HEAD。HTTP请求消息绝大多数使用GET方法, 头部行Host:www.chinaitlab.com定存放所请求对象的主机。 请求消息中包含头部Connection:close是在告知服务器本浏览器不想使用持久连接;服务器发出所请求的对象后应关闭连接。
User-agent头部行指定用户代理,也就是产生当前请求的浏览器的类型。本例的用户代理是Mozilla/4 User-agent头部行指定用户代理,也就是产生当前请求的浏览器的类型。本例的用户代理是Mozilla/4.0,它是Nelscape浏览器的一个版本。
请求报文的类型是由它所采用的方法决定的。 HTTP请求标准格式 Request 方 法 URL 版 本 首部字段名 首部行 : 值 … 实体主体 (通常不用) 请求行 空格 回车换行 CRLF 请求报文的类型是由它所采用的方法决定的。
附属体不在GET方法中使用,而是在POST方法中使用。 POST方法适用于需由用户填写表单的场合,如往google搜索引擎中填入待搜索的词。用户提交表单后, HEAD方法与GET方法类似,两者的差别只是服务器在对HEAD方法的响应消息中去掉了所请求的对象,其他内容则与对GET方法的响应消息一样。HEAD方法通常用于HTTP服务器软件开发人员进行调试。
4.2 HTTP响应消息 下面是一个典型的HTTP响应消息: HTTP/1.1 200 0K Connectlon:close Date: Thu, 13 Oct 2005 03:17:33 GMT Server: Apache/2.0.54 (Unix) Last—Nodified:Mon,22 Jun 1998 09;23;24 GMT Content—Length:682l Content—Type:text/html (数据 数据 数据 数据 数据…………)
HTTP响应标准格式 Response 开始行 响应报文的开始行是状态行。 空格 回车换行 开始行 版 本 状态码 短 语 CRLF 状态行 首部字段名 : 值 CRLF … 首部行 首部字段名 : 值 CRLF CRLF : 实体主体 (有些响应报文不用) 响应报文的开始行是状态行。 状态行包括三项内容,即 HTTP 的版本,状态码,以及解释状态码的简单短语。
5 HTTP常用状态码 1xx 表示通知信息的,如请求收到了或正在进行处理。 2xx 表示成功,如接受或知道了。 5 HTTP常用状态码 1xx 表示通知信息的,如请求收到了或正在进行处理。 2xx 表示成功,如接受或知道了。 3xx 表示重定向,表示要完成请求还必须采取进一步的行动。 4xx 表示客户的差错,如请求中有错误的语法或不能完成。 5xx 表示服务器的差错,如服务器失效无法完成请求。
●200 0K;请求成功,所请求信息在响应消息中返回。 ●301 Moved Permanently:所请求的对象己永久性迁移;新的URL在本响应消息的Location:头部指出。客户软件会自动请求这个新的URL。 ●400 Bad Request;表示服务器无法理解相应请求的普通错误的状态码
●404 Not Found:服务器上不存在所请求的文档。 ●HTTP Version Not Support:服务器不支持所请求的HTTP协议版本。
Cookies: 保存 “状态” 服务器产生一个 # , 服务器认识这个 #, 以备不时之需: client server 认证 记忆用户的前序访问, 先前的选择 服务器在响应报文中发送 “cookie” 给客户端 Set-cookie: 1678453 客户端可以在后继的请求中发送“cookie” cookie: 1678453 client server 普通 http 请求报文 普通 http响应报文+ Set-cookie: # 普通 http 请求报文 cookie: # cookie- 特定的 普通 http响应报文 普通 http 请求报文 cookie: # cookie- 特定的 普通 http响应报文
Conditional GET: 客户端缓存机制 目的: 如果客户端缓存了最新的请求对象,则服务器不必重复发送 客户端: 在http请求报文中声明所缓存拷贝的生成日期 If-modified-since: <date> 服务器: 如果客户端缓存的拷贝是最新的,则在响应报文中不发请求的对象: HTTP/1.0 304 Not Modified client server http请求报文 If-modified-since: <date> 对象未经修改 http响应报文 HTTP/1.0 304 Not Modified http请求报文 If-modified-since: <date> 对象已 经修改 http响应报文 HTTP/1.1 200 OK <data>
用telnet测试 http (客户端操作) 打开 TCP 连接到 port 80 (默认的http 服务器端口) 位于 202.117.35.70 后续键入的内容将发送到202.117.35.70 的 80 号端口 $telnet 202.117.35.70 80 2. 键入一条 http请求报文: 将该指令键入后 (按两次回车键), 就将此最短之 (但是完整的) GET 请求发到了 http 服务器 GET /~j1010/hello.htm HTTP/1.0 3. 注意观察http服务器发回的响应报文!