chinanic (黑冰cn)当前离线
巡海头狼
总版主
Internet是由各个协议连接起来的,而我们现在使用最广的莫过于HTTP协议了,也就是超文本传输协议,与FTP(文件传输协议)不同,由于主要用于超文本传输,因此HTTP协议显得更简单一点。今天我们来介绍一下HTTP协议的基本格式。 在这里,我们所谈及的HTTP协议以HTTP/1.1为标准,并且使用NetVampirePro4.0来取得与HTTP服务器的通信Log,您也可以使用其它的HTTP下载工具来取得通信Log。 在HTTP协议中,服务端是指提供HTTP服务的部分,客户端是指你使用的浏览器或者下载工具等等。在通讯时,由客户端发出请求连接,服务端建立连接;然后,客户端发出HTTP请求(Request),服务端返回响应信息(Respond),由此完成一个HTTP操作。我们来通过一个例子来了解这个过程:(以下是NetVampire进行的一次连接,以下红色字体为作者添加) P01-5-2616:10:43Connectingtogo2.163.com... //连接服务器 P01-5-2616:10:44Connectedtogo2.163.com[61.129.65.148] //解析IP地址,以下为HTTP操作 S01-5-2616:10:44GET/~minift/epretty/pretty.zipHTTP/1.1 //请求行(RequestLine),表示使用GET方式取得文件,使用HTTP/1.1协议 //以下为请求头部(RequestHead) S01-5-2616:10:44Connection:close //表示非持续性连接 S01-5-2616:10:44Host:go2.163.com //主机名称 S01-5-2616:10:44Accept:*/* //接受的数据类型 S01-5-2616:10:44Pragma:no-cache //参数(与以前的服务器兼容) S01-5-2616:10:44Cache-Control:no-cache //不使用缓存 S01-5-2616:10:44Referer:http://go2.163.com/~minift/epretty //从该网址转来 S01-5-2616:10:44User-Agent:Mozilla/4.04[en](Win95;I;Nav) //客户端标识 S01-5-2616:10:44Cookie:AdId=ACDDAAAAAAA S01-5-2616:10:44 //以下为Respond R01-5-2616:10:47HTTP/1.0200OK //响应行(RespondLine),服务器使用HTTP/1.0协议,状态值(StatusCode)为200,状态为OK,表示文件可以读取 R01-5-2616:10:47Date:Sat,26May200108:15:54GMT //现在的时间,用格林威治时间表示 R01-5-2616:10:47Server:Apache/1.3.14(Unix)mod_layout/2.9.9 //服务器类型 R01-5-2616:10:47Last-Modified:Fri,04May200102:42:56GMT //文件最后更新时间 R01-5-2616:10:47ETag:"e614cf-37965-3af21730" R01-5-2616:10:47Accept-Ranges:bytes //接受的范围单位 R01-5-2616:10:47Content-Length:227685 //文件长度 R01-5-2616:10:47Content-Type:application/zip //MIME类型 R01-5-2616:10:47X-Cache:MISSfromshca8 R01-5-2616:10:47X-Cache-Lookup:MISSfromshca8:80 R01-5-2616:10:47Connection:close //表示文件传输完毕就关闭连接。 R01-5-2616:10:47 //以下为文件传输 P01-5-2616:10:47Datatransferstarted 下面来讲解使用的格式([email=LRCF=@13@10]LRCF=@13@10[/email],即回车,SP=SPACE,即空格) Request: 协议方式SP文件URISP协议版本LRCF(请求行) (以下为头部) 头部类型:头部值LRCF 头部类型:头部值LRCF 头部类型:头部值LRCF ...... LRCF表示头部结束 (如果有体部,以下为体部) Respond: 协议版本SP状态值SP状态描述LRCF(响应行) (以下为头部) 头部类型:头部值LRCF 头部类型:头部值LRCF 头部类型:头部值LRCF ...... LRCF表示头部结束 (如果有体部,以下为体部) 由上可见,请求与相应的格式只有部分不同,是很容易理解的,现在你应该基本了解HTTP协议了吧,也能看懂那些通信Log了吧,下一次我们讲专门讲解在响应行中的状态值含义及一些特殊情况。 在一个协议中,最重要的是判断协议是否进行的成功,而在HTTP中是根据响应状态值来确定的,今天就来介绍一些状态码的含义。 200OK 这是最普遍的吧,也就是表示协议一切正常,凡是2开头的代码表示的都是成功进行中。 404NotFound 这也是最普遍的吧,其实大多数错误就是所要求的资源无法得到,通常表示文件不存在。 403Forbidden 表示服务器无法满足现在的请求,有可能是现在连接数太多等原因。 401Unauthorized 未认证的请求,通常浏览器接受到这个状态值,就会弹出一个对话框,要求你输入密码。 500InternalServerError 服务器内部错误,一般的原因是因为所执行的程序有错误,无法返回正确应答。 206PartialContent 部分的内容,这个状态码表示下面传递的是部分的内容,也是断点续传的标准返回码。
断点续传是我们现在经常接触的概念,那么HTTP协议是如何支持断点续传的呢。我们先从一个例子来看看。 下面是一个断点续传的例子:(使用NetVampire得到) I01-7-1219:19:23-------------------------Attempt1------------------------- P01-7-1219:19:24Connectingto127.0.0.3... P01-7-1219:19:24Connectedto127.0.0.3[127.0.0.3] S01-7-1219:19:24GET/VS0515AI.EXEHTTP/1.1 S01-7-1219:19:24Connection:close S01-7-1219:19:24Host:127.0.0.3 S01-7-1219:19:24Accept:*/* S01-7-1219:19:24Pragma:no-cache S01-7-1219:19:24Cache-Control:no-cache S01-7-1219:19:24Referer:http://127.0.0.3/ S01-7-1219:19:24User-Agent:Mozilla/4.04[en](Win95;I;Nav) S01-7-1219:19:24 R01-7-1219:19:24HTTP/1.1200OK R01-7-1219:19:24Server:ZeroHttpServer/1.0 R01-7-1219:19:24Date:Thu,12Jul200111:19:24GMT R01-7-1219:19:24Cache-Control:no-cache R01-7-1219:19:24Last-Modified:Tue,30Jan200113:11:30GMT R01-7-1219:19:24Content-Type:application/octet-stream R01-7-1219:19:24Content-Length:15143086 R01-7-1219:19:24Connection:close R01-7-1219:19:24 P01-7-1219:19:25Datatransferstarted I01-7-1219:19:32JobStoppedbyuser I01-7-1219:19:33Received5275648bytesin0:00:07(691435bytes/s) I01-7-1219:19:40-------------------------Attempt2------------------------- P01-7-1219:19:40Connectingto127.0.0.3... P01-7-1219:19:40Connectedto127.0.0.3[127.0.0.3] S01-7-1219:19:40GET/VS0515AI.EXEHTTP/1.1 S01-7-1219:19:40Connection:close S01-7-1219:19:40Host:127.0.0.3 S01-7-1219:19:40Accept:*/* S01-7-1219:19:40Pragma:no-cache S01-7-1219:19:40Cache-Control:no-cache S01-7-1219:19:40Referer:http://127.0.0.3/ S01-7-1219:19:40User-Agent:Mozilla/4.04[en](Win95;I;Nav) S01-7-1219:19:40Range:bytes=5275648- S01-7-1219:19:40 R01-7-1219:19:40HTTP/1.1206PartialContent R01-7-1219:19:40Server:ZeroHttpServer/1.0 R01-7-1219:19:40Date:Thu,12Jul200111:19:40GMT R01-7-1219:19:40Cache-Control:no-cache R01-7-1219:19:40Last-Modified:Tue,30Jan200113:11:30GMT R01-7-1219:19:40Content-Type:application/octet-stream R01-7-1219:19:40Content-Range:bytes5275648-15143085/15143086 R01-7-1219:19:40Content-Length:9867438 R01-7-1219:19:40Connection:close R01-7-1219:19:40 P01-7-1219:19:40Datatransferstarted I01-7-1219:19:41JobStoppedbyuser I01-7-1219:19:41Received1124756bytesin0:00:01(969617bytes/s) 第一次是普通的传输;第二次由于没有传完全,就发出了Range这个头部,从5275648字节开始传输(默认是按字节算),回应使用206状态值,表示现在开始部分传输,回复Content-Length头部,表示传输的部分,用字节记,然后就与普通传输没有区别了。 通过上面的例子,你应该了解HTTP断点续传的原理了吧。
TOP
HTTP请求头概述 (HttpServletRequest) HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说Content-Length必须出现。 下面是一些最常见的请求头 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类型。