返回列表 发帖

[转载] 浅谈HTTP协议

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
部分的内容,这个状态码表示下面传递的是部分的内容,也是断点续传的标准返回码。

天行健,君子以自强不息
地势坤,君子以厚德载物
黑色海岸线欢迎您

QQ群:7212260
致力于探索WEB技术精髓:http://www.bitechcn.com
点这里加我!

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类型。
天行健,君子以自强不息
地势坤,君子以厚德载物
黑色海岸线欢迎您

QQ群:7212260
致力于探索WEB技术精髓:http://www.bitechcn.com
点这里加我!

TOP

断点续传是我们现在经常接触的概念,那么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断点续传的原理了吧。
天行健,君子以自强不息
地势坤,君子以厚德载物
黑色海岸线欢迎您

QQ群:7212260
致力于探索WEB技术精髓:http://www.bitechcn.com
点这里加我!

TOP

返回列表 回复 发帖