HTTP协议的头信息详解. txt10有了执著生命旅程上的寂寞可以铺成一片蓝天有了执著孤单可以演绎成一排鸿雁有了执著欢乐可以绽放成满圆的鲜花。
HTTP协议的头信息详解
在数据挖崛方面有时候会经常分析网页内容这时候就需要对HTTP协议有一定的了解下边摘录了网上关于这方面的介绍
HTTPHyperTextTransferProtocol是超文本传输协议的缩写它用于传送WWW方式的数据关于HTTP协议的详细内容请参考RFC2616。 HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应相应的内容包括消息协议的版本成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行一个或者多个头域一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头请求头响应头和实体头四个部分。每个头域由一个域名 冒号 : 和域值三部分组成。域名是大小写无关的域值前可以添加任何数量的空格符头域可以被扩展为多行在每行开始处使用至少一个空格或制表符。
通用头域
通用头域包含请求和响应消息都支持的头域通用头域包含Cache-Control 、Connection、 Date、 Pragma、 Transfer-Encoding、 Upgrade、 Via。对通用头域的扩展要求通讯双方都支持此扩展如果存在不支持的通用头域一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。
Cache-Control头域
Cache -Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、 no-store、 max-age、 max-stale、 min-fresh、 only-if-cached 响应消息中的指令包括public、 private、 no-cache、 no- store、 no-transform、 must-revalidate、proxy-revalidate、 max-age。各个消息中的指令含义如下
Public指示响应可被任何缓存区缓存。
Private指示对于单个用户的整个或部分响应消息不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息此响应消息对于其他用户的请求无效。no-cache指示请求或响应消息不能缓存no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。max-age指示客户机可以接收生存期不大于指定时间以秒为单位的响应。min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值那么客户机可以接收超出超时期指定值之内的响应消息。
Date头域
Date头域表示消息发送的时间 时间的描述格式由 rfc822定义。 例如Date:Mon,31Dec200104:25:57GMT。 Date描述的时间表示世界标准时换算成本地时间需要知道用户所在的时区。
Pragma头域
Pragma头域用来包含实现特定的指令最常用的是Pragma:no-cache。在HTTP/1. 1协议中它的含义和Cache- Control:no-cache相同。
请求消息
请求消息的第一行为下面的格式
MethodSPRequest-URISPHTTP-VersionCRLFMethod表示对于Request-URI完成的方法这个字段是大小写敏感的包括OPTIONS、 GET、 HEAD、 POST、 PUT、 DELETE、 TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持其他所有方法的实现是可选的。 GET方法取回由Request-URI标识的信息。 HEAD方法也是取回由Request-URI标识的信息只是可以在响应时不返回消息体。 POST方法可以请求服务器接收包含在请求中的实体信息可以用于提交表单 向新闻组、 BBS、邮件群组和数据库发送消息。
SP表示空格。 Request-URI遵循URI格式在此字段为星号*时说明请求并不用于某个特定的资源地址而是用于服务器本身。 HTTP-Version表示支持的HTTP版本例如为HTTP/1. 1。CRLF表示换行回车符。请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept-Encoding、Accept-Language 、 Authorization、 From、 Host 、 If-Modified-Since 、 If- Match、If-None-Match 、 If-Range 、 If-Range 、 If-Unmodif ied-Since 、 Max-Forwards 、Proxy-Authorization、 Range、 Referer、 User-Agent。对请求头域的扩展要求通讯双方都支持如果存在不支持的请求头域一般将会作为实体头域处理。
典型的请求消息
GET http://download.microtool.de:80/somedata.exe
Host: download.microtool.de
Accept:*/*
Pragma: no-cache
Cache-Control: no-cache
Referer: http://download.microtool.de/
User-Agent:Mozilla/4.04[en] (Win95;I;Nav)
Range:bytes=554554-
上例第一行表示HTTP客户端可能是浏览器、下载程序通过GET方法获得指定URL下的文件。棕色的部分表示请求头域的信息绿色的部分表示通用头部分。
Host头域
Host头域指定请求资源的Intenet主机和端口号必须表示请求url的原始服务器或网关的位置。 HTTP/1. 1请求必须包含主机头域否则系统会以400状态码返回。
Referer头域
Referer头域允许客户端指定请求uri的源资源地址这可以允许服务器生成回退链表可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址 Referer不能被发送。如果指定的是部分uri地址则此地址应该是一个相对地址。
Range头域
Range头域可以请求实体的一个或者多个子范围。例如
表示头500个字节 bytes=0-499
表示第二个500字节 bytes=500-999
表示最后500个字节 bytes=-500
表示500字节以后的范围 bytes=500-
第一个和最后一个字节 bytes=0-0,-1
同时指定几个范围 bytes=500-600,601-999
但是服务器可以忽略此请求头如果无条件GET包含Range请求头响应会以状态码206PartialContent返回而不是以200 OK。
User-Agent头域
User-Agent头域的内容包含发出请求的用户信息。
响应消息
响应消息的第一行为下面的格式
HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF
HTTP -Version表示支持的HTTP版本例如为HTTP/1. 1。 Status- Code是一个三个数字的结果代码。Reason-Phrase给Status-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别 Reason-Phrase主要用于帮助用户理解。 Status-Code的第一个数字定义响应的类别后两个数字没有分类的作用。第一个数字可能取5个不同的值
1xx:信息响应类表示接收到请求并且继续处理
2xx:处理成功响应类表示动作被成功接收、理解和接受
3xx:重定向响应类为了完成指定的动作必须接受进一步处理
4xx:客户端错误客户请求包含语法错误或者是不能正确执行
5xx:服务端错误服务器不能正确执行一个正确的请求
响应头域允许服务器传递不能放在状态行的附加信息这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、 Location、 Proxy-Authenticate、 Public、Retry-After、 Server、 Vary、 Warning、 WWW-Authenticate。对响应头域的扩展要求通讯双方都支持如果存在不支持的响应头域一般将会作为实体头域处理。
典型的响应消息
HTTP/1.0200OK
Date:Mon,31Dec200104:25:57GMT
Server:Apache/1.3. 14(Unix)
Content-type:text/html
Last-modif ied:Tue, 17Apr200106:46:28GMT
Etag:"a030f020ac7c01: 1e9f"
Content-length:39725426
Content-range:bytes554554-40279979/40279980
上例第一行表示HTTP服务端响应一个GET方法。棕色的部分表示响应头域的信息绿色的部分表示通用头部分红色的部分表示实体头域的信息。
Location响应头
Location响应头用于重定向接收者到一个新URI地址。
Server响应头
Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释产品标识一般按照重要性排序。
实体
请求消息和响应消息都可以包含实体信息实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息实体头包括Allow、 Content- Base、 Content-Encoding、Content-Language、 Content-Length、 Content-Location、 Content-MD5、 Content-Range、Content-Type、 Etag、 Expires、 Last-Modified、 extension-header。 extension-header允许客户端定义新的实体头但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流 它的编码方式由 Content-Encoding或Content-Type定义 它的长度由Content-Length或Content-Range定义。
Content-Type实体头
Content-Type实体头用于向接收方指示实体的介质类型指定HEAD方法送到接收方的实体介质类型或GET方法发送的请求介质类型Content-Range实体头
Content-Range实体头用于指定整个实体中的一部分的插入位置他也指示了整个实体的长度。在服务器向客户返回一个部分响应它必须描述响应覆盖的范围和整个实体长度。一般格式
Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth
例如传送头500个字节次字段的形式Content-Range:bytes0-499/1234如果一个http消息包含此节例如对范围请求的响应或对一系列范围的重叠请求 Content-Range表示传送的范围 Content-Length表示实际传送的字节数。
Last-modified实体头
应答头说明
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的浏览器返回经gz ip压缩的HTML页面为其他浏览器返回普通页面。
Content-Length表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势可以把输出文档写入ByteArrayOutputStram完成后查看其大小 然 后 把 该 值 放 入 Content-Length 头 最 后 通 过byteArrayStream.writeTo(response.getOutputStream()发送内容。
Content-Type表示后面的文档属于什么MIME类型。 Servlet默认为text/plain但通常需要显式地指定为text/html。 由于经常要设置Content-Type 因此HttpServletResponse提供了一个专用的方法setContentTyep。
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区的META HTTP-EQUIV="Refresh"CONTENT="5;URL=http://host/path"实现这是因为 自动刷新或重定向对于那些不能使
用CGI或Servlet的HTML编写者十分重要。但是对于Servlet来说直接设置Refresh头更加方便。
注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”而不是“每隔N秒刷新本页面或访问指定页面”。因此连续刷新要求每次都发送一个Refresh头而发送204状态代码则 可以阻止浏览器继续刷新 不管是使用 Refresh 头还是METAHTTP-EQUIV="Refresh" . . .。
注意Refresh头不属于HTTP 1. 1正式规范的一部分而是一个扩展但Netscape和IE都支持它。
Server服务器名字。 Servlet一般不设置这个值而是由Web服务器自己设置。
Set-Cookie 设 置 和 页 面 关 联 的 Cookie 。 Servlet 不 应 使 用response. setHeader("Set-Cookie", . . . ) 而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。
WWW-Authenticate客户应该在Authorization头中提供什么类型的授权信息在包含401 Unauthorized 状态行的应答中这个头是必需 的 。 例如 response. setHeader("WWW-Authenticate", "BASIC realm="executives"") 。注意Servlet一般不进行这方面的处理而是让Web服务器的专门机制来控制受密码保护页面的访问例如.htaccess。
一初识HTTP消息头
但凡搞WEB开发的人都离不开HTTP超文本传输协议而要了解HTTP除了HTML本身以外还有一部分不可忽视的就是HTTP消息头。
做过Socket编程的人都知道当我们设计一个通信协议时 “消息头/消息体”的分割方式是很常用的消息头告诉对方这个消息是干什么的消息体告诉对方怎么干。 HTTP传输的消息也是这样规定的每一个HTTP包都分为HTTP头和HTTP体两部分后者是可选的而前者是必须的。每当我们打开一个网页在上面点击右键选择“查看源文件”这时看到的HTML代码就是HTTP的消息体那么消息头又在哪呢 IE浏览器不让我们看到这部分但我们可以通过截取数据包等方法看到它。
下面就来看一个简单的例子
首先制作一个非常简单的网页它的内容只有一行
<html><body>hello world</body></html>
把它放到 WEB 服务器上 比如 I IS 然后用 IE 浏览器请求这个页面http://localhost:8080/simple.htm当我们请求这个页面时浏览器实际做了以下四项工作
1解析我们输入的地址从中分解出协议名、主机名、端口、对象路径等部分对于我们的这个地址解析得到的结果如下
协议名 http
主机名 localhost
端口 8080
对象路径 /simple.htm
2把以上部分结合本机自己的信息封装成一个HTTP请求数据包
3使用TCP协议连接到主机的指定端口 localhost, 8080并发送已封装好的数据包
4等待服务器返回数据并解析返回数据最后显示出来
由截取到的数据包我们不难发现浏览器生成的HTTP数据包的内容如下
GET /simple.htm HTTP/1. 1<CR>
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,application/x-shockwave-flash, application/vnd.ms-excel,application/vnd.ms-powerpoint, application/msword, */*<CR>
Accept-Language: zh-cn<CR>
Accept-Encoding: gzip, deflate<CR>
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5. 1 ; SV1 ; .NET CLR
1. 1.4322; .NET CLR 2.0.50727)<CR>
Host: localhost:8080<CR>
Connection: Keep-Alive<CR>
<CR>
为了显示清楚我把所有的回车的地方都加上了“<CR>”注意最后还有一个空行加一个回车这个空行正是HTTP规定的消息头和消息体的分界线第一个空行以下的内容就是消息体这个请求数据包是没有消息体的。
消息的第一行“GET”表示我们所使用的HTTP动作其他可能的还有“POST”等 GET的消息没有消息体而POST消息是有消息体的 消息体的内容就是要POST的数据。后面/simple.htm就是我们要请求的对象之后HTTP1. 1表示使用的是HTTP1. 1协议。
第二行表示我们所用的浏览器能接受的Content-type三四两行则是语言和编码信息第五行显示出本机的相关系信息包括浏览器类型、操作系统信息等很多网站可以显示出你所使用的浏览器和操作系统版本就是因为可以从这里获取到这些信息。
第六行表示我们所请求的主机和端口第七行表示使用Keep-Alive方式即数据传递完并不立即关闭连接。
服务器接收到这样的数据包以后会根据其内容做相应的处理例如查找有没有“/simple.htm”这个对象如果有根据服务器的设置来决定如何处理如果是HTM则不需要什么复杂的处理直接返回其内容即可。但在直接返回之前还需要加上HTTP消息头。
服务器发回的完整HTTP消息如下
HTTP/1. 1 200 OK<CR>
Server: Microsoft-IIS/5. 1<CR>
X-Powered-By: ASP.NET<CR>
Date: Fri, 03 Mar 2006 06:34:03 GMT<CR>
Content-Type: text/html<CR>
Accept-Ranges: bytes<CR>
Last-Modified: Fri, 03 Mar 2006 06:33: 18 GMT<CR>
ETag: "5ca4f75b8c3ec61:9ee"<CR>
Content-Length: 37<CR>
<CR>
<html><body>hello world</body></html>
同样我用“<CR>”来表示回车。可以看到这个消息也是用空行切分成消息头和消息体两部分消息体的部分正是我们前面写好的HTML代码。
消息头第一行“HTTP/1. 1”也是表示所使用的协议后面的“200 OK”是HTTP返回代码 200就表示操作成功还有其他常见的如404表示对象未找到 500表示服务器错误 403表示不能浏览目录等等。
第二行表示这个服务器使用的WEB服务器软件这里是IIS 5. 1。第三行是ASP.Net的一个附加提示没什么实际用处。第四行是处理此请求的时间。第五行就是所返回的消息的content-type浏览器会根据它来决定如何处理消息体里面的内容例如这里是text/html那么浏览器就会启用HTML解析器来处理它如果是image/jpeg那么就会使用JPEG的解码器来处理。
消息头最后一行“Content-Length”表示消息体的长度从空行以后的内容算起 以字节为单位浏览器接收到它所指定的字节数的内容以后就会认为这个消息已经被完整接收了。?
常见的HTTP返回码
在服务器返回的HTTP消息头里有一个“HTTP/1. 1 200 OK”这里的200是HTTP规定的返回代码表示请求已经被正常处理完成。浏览器通过这个返回代码就可以知道服务器对所发请求的处理情况是什么每一种返回代码都有自己的含义。这里列举几种常见的返回码。1 403 Access Forbidden
如果我们试图请求服务器上一个文件夹而在WEB服务器上这个文件夹并没有允许对这个文件夹列目录的话就会返回这个代码。一个完整的403回复可能是这样的 IIS5. 1HTTP/1. 1 403 Access Forbidden
Server: Microsoft-IIS/5. 1
Date: Mon, 06 Mar 2006 08:57:39 GMT
Connection: close
Content-Type: text/html
Content-Length: 172
?
<html><head><title>Directory Listing Denied</title></head>
<body><h1>Directory Listing Denied</h1>This Virtual Directory does not allowcontents to be listed. </body></html>
2 404 Object not found
当我们请求的对象在服务器上并不存在时就会给出这个返回代码这可能也是最常见的错误代码了。 IIS给出的404消息内容很长除了消息头以外还有一个完整的说明“为什么会这样”的网页。 APACHE服务器的404消息比较简短如下
HTTP/1. 1 404 Not Found
Date: Mon, 06 Mar 2006 09:03: 14 GMT
Server: Apache/2.0.55 (Unix) PHP/5.0.5
Content-Length: 291
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
?
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /notexist was not found on this server. </p>
<hr>
<address>Apache/2.0.55 (Unix) PHP/5.0.5 Server at localhost Port 8080</address></body></html>
也许你会问无论是404还是200都会在消息体内给出一个说明网页那么对于客户端来说二者有什么区别呢一个比较明显的区别在于200是成功请求浏览器会记录下这个地址以便下次再访问时可以自动提示该地址而404是失败请求浏览器只会显示出返回的页面内容并不会记录此地址要再次访问时还需要输入完整的地址。
3 401 Access Denied
当WEB服务器不允许匿名访问而我们又没有提供正确的用户名/密码时服务器就会给出这个返回代码。在IIS中设置IIS的安全属性为不允许匿名访问此时直接访问的话就会得到以下返回结果
HTTP/1. 1 401 Access Denied
Server: Microsoft-IIS/5. 1
Date: Mon, 06 Mar 2006 09: 15:55 GMT
WWW-Authenticate: Negotiate
WWW-Authent i cate: NTLM
Connection: close
Content-Length: 3964
Content-Type: text/html
?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html dir=ltr>
„„
此时浏览器上让我们输入用户名和密码
因返回信息中消息体较长只取前面两行内容。注意如果是用localhost来访问本机的IIS因IE可以直接取得当前用户的身份它会和服务器间直接进行协商所以不会看到401提示。当我们在输入了用户名和密码以后服务器与客户端会再进行两次对话。首先客户端向服务器索取一个公钥服务器端会返回一个公钥二者都用BASE64编码相应的消息如下编码部分已经做了处理
GET / HTTP/1. 1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,application/x-shockwave-flash, application/vnd.ms-excel,application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5. 1 ; SV1 ; .NET CLR
1. 1.4322; .NET CLR 2.0.50727)
Host: 192. 168.0.55:8080
Connection: Keep-Alive
Authorization: Negotiate ABCDEFG„„
?
cmivps香港VPS带来了3个新消息:(1)双向流量改为单向流量,相当于流量间接扩大一倍;(2)Hong Kong 2T、Hong Kong 3T、Hong Kong 无限流量,这三款VPS开始支持Windows系统,如果需要中文版Windows系统请下单付款完成之后发ticket要求官方更改即可;(3)全场7折年付、8折月付优惠,优惠码有效期一个月!官方网站:https://www.cmivp...
对于DMIT商家已经关注有一些时候,看到不少的隔壁朋友们都有分享到,但是这篇还是我第一次分享这个服务商。根据看介绍,DMIT是一家成立于2017年的美国商家,据说是由几位留美学生创立的,数据中心位于香港、伯力G-Core和洛杉矶,主打香港CN2直连云服务器、美国CN2直连云服务器产品。最近看到DMIT商家有对洛杉矶CN2 GIA VPS端口进行了升级,不过价格没有变化,依然是季付28.88美元起。...
关于HostDare服务商在之前的文章中有介绍过几次,算是比较老牌的服务商,但是商家背景财力不是特别雄厚,算是比较小众的个人服务商。目前主流提供CKVM和QKVM套餐。前者是电信CN2 GIA,不过库存储备也不是很足,这不九月份发布新的补货库存活动,有提供九折优惠CN2 GIA,以及六五折优惠QKVM普通线路方案。这次活动截止到9月30日,不清楚商家这次库存补货多少。比如 QKVM基础的五个方案都...