Http协议知识整理

来源:互联网 发布:淘宝网招聘官网 编辑:程序博客网 时间:2024/05/01 12:55

一、HTTP协议详解之URL篇

    http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

   HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:

   http://host[":"port][abs_path]

   http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
eg:
1
、输入:www.guet.edu.cn
浏览器自动转换成:http://www.guet.edu.cn/
2http:192.168.0.116:8080/index.jsp 

注:URL组成举例http://www.microsoft.com/china/index.htm。它的含义如下:

1.http://:代表超文本传输协议,通知microsoft.com服务器显示Web页,通常不用输入;

2.www:代表一个Web(万维网)服务器;

3.Microsoft.com/:这是装有网页的服务器的域名,或站点服务器的名称;

4.China/:为该服务器上的子目录,就好像我们的文件夹;

5.Index.htmindex.htm是文件夹中的一个HTML文件(网页)

二、Http请求消息和响应消息

   Http请求消息格式

   请求行

   通用信息头|请求头|实体头

   CRLF(回车换行)

   实体内容

 

   HTTP响应消息格式

   状态行

   通用信息头|响应头|实体头

   CRLF(回车换行)

   实体内容

 

通用信息头:

Cache-Control:此字段用于通知客户机和服务器之间的代理服务器如何使用已缓存的页面。

Connection:用于指定处理完本次请求/响应后,客户端和服务器是否还要继续保持连接。

Date:用于表示HTTP消息产生的当前时间。

Transfer-Encoding:用于指定实体内容的传输编码方式。

 

请求头:

Accept:用于指定客户端程序能够处理的MIME类型。有多个时用逗号隔开。

Accept-Charset:指出客户端程序可以使用的字符集。有多个时用逗号隔开。

Accept-Encoding:指定客户机能够进行解码的数据编码方式。有多个时用逗号隔开。

Accept-Language:指定客户机期望服务器返回哪个国家语言的文档。有多个时用逗号隔开。

Host:指定资源所在的主机名和端口号。

 

响应头:

Accept-Range:用于说明当前WEB服务器是否接受Range请求和Range请求中指定的数据的单位。

Location:用于通知客户机应该到哪个新的地址去获取文档。由于当前响应并没有直接返回内容给客户机,所以使用Location头的HTTP消息不应该有实体内容,由此可见,在消息头中不能同时出现Location和Contect-Type这两个头自段。

 

实体头:

Allow:用于指定客户机请求的资源所支持的请求方法。

Content-Encoding:用于指定实体内容的压缩编码方式。

Content-Language:用于指定返回的网页文档的国家语言类型。

Content-Length:用于指定实体内容的长度。

Content-Location:用于指定响应消息中所封装的实体内容的实际位置路径。

Content-Type:用于指定实体内容的MIME类型。客户机通过检查服务器响应消息的此字段中的MIME类型就能知道实体内容的数据格式和知道以 何种方式来进行处理了。<Tomcat>安装目录下的conf目录下的web.xml文件里面就定义了很多的类型。

Last-Modified:用于指定文档的最后修改时间。

 

扩展头:

Refresh:此字段告诉浏览器隔多长时间刷新。

 

(1)请求消息

请求方法:HTTP规范定义了8种可能的请求方法:

GET            检索URI中标识资源的一个简单请求

HEAD           与GET方法相同,服务器只返回状态行和头标,并不返回请求文档

POST           服务器接受被写入客户端输出流中的数据的请求

PUT            服务器保存请求数据作为指定URI新内容的请求

DELETE         服务器删除URI中命名的资源的请求

OPTIONS        关于服务器支持的请求方法信息的请求

TRACE          Web服务器反馈Http请求和其头标的请求

CONNECT        已文档化但当前未实现的一个方法,预留做隧道处理

当然我们最常用的也就是get和post方法。

 

HTTP最常见的请求头如下:

     Accept:浏览器可接受的MIME类型;

     Accept-Charset:浏览器可接受的字符集;

     Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间;

    Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;

    Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;

    Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;

    Content-Length:表示请求消息正文的长度;

    Cookie:这是最重要的请求头信息之一;

    From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它;

    Host:初始URL中的主机和端口;

    If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答;

    Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;

    Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

    User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用;

    UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

    例如:

POST hysj.jsp HTTP/1.1

Host: search.cnipr.com

User-Agent: Mozilla/5.0(Windows; U; Windows NT 6.0; zh-CN; rv:1.9.1.13) Gecko/20100914 Firefox/3.5.13( .NET CLR 3.5.30729)

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

Accept-Language:zh-cn,zh;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset:GB2312,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

Referer: http://search.cnipr.com/cnipr/zljs/hyjs-biaodan-y.jsp

Content-Length: 405

username=guest&extension=&issearch=on&searchword=pd%3D%2820100901%29&presearchword=&sortfield=RELEVANCE&sRecordNumber=&searchType=0&searchFrom=0&channelid=14%2C15%2C16&searchChannel=14%2C15%2C16&strdb=14&strdb=15&strdb=16&cizi=2&sortcolumn=RELEVANCE&R1=-&txtA=&txtB=&txtC=&txtD=20100901&txtE=&txtF=&txtG=&txtH=&txtI=&txtJ=&txtK=&txtL=&txtM=&txtN=&txtP=&txtQ=&txtR=&txtSearchWord=&Submit=%BC%EC%A1%A1%CB%F7

 

(2)响应头

    响应头状态码含义:

    HTTP最常见的响应头如下所示:

Allow:服务器支持哪些请求方法(如GET、POST等);

     Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面;

    Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容;

    Content-Type: 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentTyep。可在web.xml文件中配置扩展名和MIME类型的对应关系;

    Date:当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦;

    Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它。

    Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置;

    Location:表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302;

    Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。注意这种功能通常是通过设置HTML页面HEAD区的<METAHTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。

    Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

 

例如

 Location:http://www.it315.org/index.jsp

 Server:apache tomcat

 Content-Encoding: gzip

 Content-Length: 80

 Content-Language: zh-cn

 Content-Type: text/html; charset=GB2312

 Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT

 Refresh: 1;url=http://www.it315.org

 Content-Disposition: attachment;filename=aaa.zip

 Transfer-Encoding: chunked 

 Set-Cookie:SS=Q0=5Lb_nQ; path=/search

 ETag: W/"7777-1242234904000"

 Expires: -1

 Cache-Control: no-cache 

 Pragma: no-cache  

 Connection: close/Keep-Alive  

 Date: Tue, 11 Jul 2000 18:23:51 GMT

 

 

(3)GET和POST的区别

    GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

    1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.  POST方法是把提交的数据放在HTTP包的Body中.

    2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制,一般为2KB),而POST方法提交的数据没有限制.

    3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

    4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

 

三、利用telnet观察http协议的通讯过程

    实验目的及原理:

    利用MS的telnet工具,通过手动输入http请求信息的方式,向服务器发出请求,服务器接收、解释和接受请求后,会返回一个响应,该响应会在telnet窗口上显示出来,从而从感性上加深对http协议的通讯过程的认识。

    实验步骤:

1、打开telnet

    1.1 打开telnet

    运行-->cmd-->telnet

    1.2 打开telnet回显功能

    set localecho

2、连接服务器并发送请求

    2.1 open www.guet.edu.cn80  //注意端口号不能省略

    HEAD /index.aspHTTP/1.0

     Host:www.guet.edu.cn

    /*我们可以变换请求方法,请求桂林电子主页内容,输入消息如下*/

     open www.guet.edu.cn80

 

     GET /index.aspHTTP/1.0  //请求资源的内容

    Host:www.guet.edu.cn 

 

    2.2 open www.sina.com.cn80  //在命令提示符号下直接输入telnet www.sina.com.cn 80

     HEAD /index.aspHTTP/1.0

     Host:www.sina.com.cn

3 实验结果:

 

    3.1 请求信息2.1得到的响应是:

 

    HTTP/1.1 200 OK                                             //请求成功

    Server: Microsoft-IIS/5.0                                    //web服务器

    Date: Thu,08 Mar 200707:17:51GMT

    Connection: Keep-Alive                                

    Content-Length: 23330

    Content-Type: text/html

    Expries: Thu,08 Mar 200707:16:51 GMT

    Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/

    Cache-control: private

 

    //资源内容省略

 

    3.2 请求信息2.2得到的响应是:

 

    HTTP/1.0 404 Not Found       //请求失败

    Date: Thu, 08 Mar 200707:50:50 GMT

    Server: Apache/2.0.54 <Unix>

    Last-Modified: Thu, 30 Nov 2006 11:35:41 GMT

    ETag:"6277a-415-e7c76980"

    Accept-Ranges: bytes

    X-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remix

    Vary: Accept-Encoding

    Content-Type: text/html

    X-Cache: MISS from zjm152-78.sina.com.cn

    Via: 1.0zjm152-78.sina.com.cn:80<squid/2.6.STABLES-20061207>

    X-Cache: MISS from th-143.sina.com.cn

    Connection: close

    失去了跟主机的连接

 

    按任意键继续...

 

有关Http协议的同类Blog链接:

 

http://www.cnblogs.com/TankXiao/category/415412.html

 

http://www.cnblogs.com/CareySon/archive/2012/04/27/HTTP-Protocol.html

 

http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

 

0 0
原创粉丝点击