http 协议详解
1.
引言
web 服务器和浏览器之间的一问一答的过程必需遵守一定的规则,这个规则就是 http 协议( HypertextTransferProtocol ,超文本传输协议), HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。经过几年的使用与发展,得到不断地完善和扩展。
2.
HTTP 协议的主要特点可概括如下:
1. 支持客户 / 服务器模式。
2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET 、 HEAD 、 POST 。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
3. 灵活: HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标
记。
4. 无连接:无连接的含义是限制每次连接只处理一个请求 。服务器处理完客户的请求,并收到客户的应答后,即断开连接 。采用这种方式可以节省传输时间。
5. 无状态: HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
3. HTTP 是怎样工作的:
会话方式:
1. 客户端和服务器建立连接
2. 客户机发送请求到服务器
3. 服务器向客户机发送相应信息
4. 客户机和服务器断开连接
如图所示:
由 于 HTTP 协议是基于请求 / 响应范式的 ( 相当于客户机 / 服务器 ) 。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为:统一资源标识 符 (URL) 、协议版本号,后边是 MIME 信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容,这里面连接过程是短暂的,每一个页面访问浏览器和服务器都建立单独的一次连接 。
HTTP/1.0 和 HTTP/1.1 都把 TCP 作为底层的传输协议。 HTTP 客户首先发起建立与服务器 TCP 连接。一旦建立连接,浏览器进程和服务器进程就可以通过各自的套接字来访问 TCP 。如前所述,客户端套接字是客户进程和 TCP 连接之间的 “ 门 ” ,服务器端套接字是服务器进程和同一 TCP 连接之间的 “ 门 ” 。客户往自己的套接字发送 HTTP 请求消息,也从自己的套接字接收 HTTP 响应消息。类似地,服务器从自己的套接字接收 HTTP 请求消息,也往自己 的套接字发送 HTTP 响应消息。客户或服务器一旦把某个消息送入各自的套接字,这个消息就完全落入 TCP 的控制之中。 TCP 给 HTTP 提供一个可靠的数据 传输服务 ; 这意味着由客户发出的每个 HTTP 请求消息最终将无损地到达服务器,由服务器发出的每个 HTTP 响应消息最终也将无损地到达客户。我们可从中看 到分层网络体系结构的一个明显优势 ——HTTP 不必担心数据会丢失,也无需关心 TCP 如何从数据的丢失和错序中恢复出来的细节。这些是 TCP 和协议栈中更 低协议层的任务。
TCP 还使用一个拥塞控制机制。该机制迫使每个新的 TCP 连接一开始以相对缓慢的速率传输数据,然而只要网络不拥塞,每个连接可以迅速上升到相对较高的速率。这个慢速传输的初始阶段称为缓启动 (slow start) 。
需要注意的是,在向客户发送所请求文件的同时,服务器并没有存储关于该客户的任何状态信息。即便某个客户在几秒钟内再次请求同一个对象,服务器也不会响应说 : 自己刚刚给它发送了这个对象。相反,服务器重新发送这个对象,因为它已经彻底忘记早先做过什么。既然 HTTP 服务器不维护客户的状态信息,我们于是 说 HTTP 是一个无状态的协议 (stateless protocol) 。
HTTP 既可以使用非持久连接 (nonpersistent connection) ,也可以使用持久连接 (persistent connection) 。 HTTP/1.0 使用非持久连接, HTTP/1.1 默认使用持久连接。
4 . http 请求组成: http 请求消息由三部分组成:
1. 请求行
2. 消息报头
3. 请求正文
其中 2 , 3 是可选的
1 、请求行 格式如下: Method Request-URI HTTP-Version CRLF
其中 Method 表示请求方法; Request-URI 是一个统一资源标识符; HTTP-Version 表示请求的 HTTP 协议版本; CRLF 表示回车和换行(除了作为结尾的 CRLF 外,不允许出现单独的 CR 或 LF 字符)。
请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET :请求获取 Request-URI 所标识的资源
POST :在 Request-URI 所标识的资源后附加新的数据
HEAD :请求获取由 Request-URI 所标识的资源的响应消息报头
PUT :请求服务器存储一个资源,并用 Request-URI 作为其标识
DELETE :请求服务器删除 Request-URI 所标识的资源
TRACE :请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT :保留将来使用
OPTIONS :请求查询服务器的性能,或者查询与资源相关的选项和需求
例如: GET /form.html HTTP/1.1 (CRLF)
5. HTTP 响应也是由三个部分组成
1. 状态行
2. 消息报头
3. 响应正文
1 、状态行 格式如下: HTTP-Version Status-Code Reason-Phrase CRLF
其中, HTTP-Version 表示服务器 HTTP 协议的版本; Status-Code 表示服务器发回的响应状态代码; Reason-Phrase 表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx :指示信息 -- 表示请求已接收,继续处理
2xx :成功 -- 表示请求已被成功接收、理解、接受
3xx :重定向 -- 要完成请求必须进行更进一步的操作
4xx :客户端错误 -- 请求有语法错误或请求无法实现
5xx :服务器端错误 -- 服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK // 客户端请求成功
400 Bad Request // 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized // 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden // 服务器收到请求,但是拒绝提供服务
404 Not Found // 请求资源不存在, eg :输入了错误的 URL
500 Internal Server Error // 服务器发生不可预期的错误
503 Server Unavailable // 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
例如: HTTP/1.1 200 OK ( CRLF )
6.. 消息报头详解
消息报头 :可以实现 HTTP 客户机和服务器直接的请求和应答,相当于服务器和客户机直接的暗号,主要有有四部分组成的:
1 、普通报头 :在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。 常用的有:
1.Cache-Control 用于指定缓存指令,例如: Cache-Control:no-cache
2.Connection: :客户端和服务器是否保持连接,例如: Connection: : keep-alive
2. 请求头 :请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。 常用的请求报头:
Host :请求报头域主要用于指定被请求资源的 Internet 主机和端口号,它通常从 HTTP URL 中提取出来的((发送请求时,该报头域是必需的)
User-Agent :你所使用的浏览器的名称和版本
Accept :请求报头域用于指定客户端接受哪些类型的信息。例如: text/html ,表明客户端希望接受 html 文本。
Accept-Charset :请求报头域用于指定客户端接受的字符集
Accept-Encoding :用于指定可接受的内容编码。
Accept-Language :指定一种自然语言
Authorization :请求报头域主要用于证明客户端有权查看某个资源
请求报头举例:
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,zh-cn;q=0.7,zh;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
3 、响应报头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对 Request-URI 所标识的资源进行下一步访问的信息。
常用的响应报头:
1.Location :响应报头域用于重定向接受者到一个新的位置。 Location 响应报头域常用在更换域名的时候。
2.Serve :响应报头域包含了服务器用来处理请求的软件信息。与 User-Agent 请求报头域是相对应的。
例如: Server: Resin/3.0.19
4 、实体报头
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文( eg :有无实体正文)和请求所标识的资源的元信息。
常用的实体报头 :
1.Content- Encoding 实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得 Content-Type 报头域中所 引用的媒体类型,必须采用相应的解码机制。 Content-Encoding 这样用于记录文档的压缩方法,例如: Content- Encoding : gzip
2.content-Language 实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读
者。例如: Content-Language:da
3.Content-Length 实体报头域用于指明实体正文的长度,以字节方式存储的十进制数 4.Content-Type 实体报头域用语指明发送给接收者的实体正文的媒体类型。例如:
Content-Type:text/html;charset=GB2312
5.Last-Modified 实体报头域用于指示资源的最后修改日期和时间。
6.Expires 实体报头域给出响应过期的日期和时间。例如: Expires : Thu , 15 Sep 2006 16:23:12 GMT , HTTP1.1 的客户端和缓存必须将其他非法的日期格式(包括 0 )看作已经过期。例如:为了让浏览器不要缓存页面,我们也可以利用 Expires 实体报头域,设置为 0 , jsp 中程序如下: response.setDateHeader("Expires","0");
例如:请求的实体报头和实体内容
Content-Type: application/x-www-form-urlencoded
Content-Length: 87
username=BJXZ201045&password=http%3A%2F%2F211.136.202.42%2Feaf%2F&addcode=2380&button=+
响应实体报头:
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html;charset=GBK
Content-Length: 4189
注意: 客户端向服务器端发送请求时会在服务器端创建 session 对象记录会话信息,同时每一次服务器响应都要设置在客户端设置 Set-Cookie 这个属性。这样在客户端与服务器的交互过程中,通过 JSESSIONID 字符串唯一标识 session 对象(客户端只需要保存 JSESSIONID 这个字符串,服务器端只需要保存 JSESSIONID 和真实的 session 对象之间的关联关系)。
7. 用 telnet 测试 http 协议
4.
1. 首先打开 cmd ,输入 telnet www.baidu.com 80 (要测试的 IP 地址和端口号) , 测试百度服务器 80 端口
2. 会出现黑屏一片漆黑, 在输入 ctrl+}, 屏幕会换屏,继续输入 GET/HTTP1.0 ( 请求行 )按两次回车,就会出现 baidu 首页的源代码 , 大家可以试试。
另外可以参考: http://www.cnblogs.com/hellofei/archive/2010/01/13/1646276.html