1.Http:HyperText Transfer Protocol,超文本传输协议。
属于应用层协议,是www上应用的最多的协议,目前版本是1.1,是一个基于请求/响应模式,无状态的协议.
在Intenet上,http通信基本上是基于tcp的连接方式, 还有基于其它协议或网络的实现方式.
HTTP假定传输是可靠的。
2.http Url的格式
HTTP消息分为请求消息,响应消息。
3.http请求由3部分组成:请求行,消息报头,请求正文
(1)请求行: Method Uri Http-Version CRLF (CRLF表示回车换行,/r/n)
请求方法包括GET POST HEAD PUT DELETE TRACE CONNECT OPTIONS,协议中的方法区分大小写,现在只能为大写形式。
GET方法是访问网页的默认方法,在浏览器中直接输入网址访问时就是采用GET方法。
POST方法,要求服务器接受附在请求后面的数据
HEAD方法只是请求消息报头,常用于测试超链接的有效性,最后是否有更新等.
如 GET /index.html HTTP/1.1 CRLF
(2)消息报头。消息报头后有一空行,表示消息报头结束.
(3)请求正文. 请求正文中可以包含提交的数据
如 UserName=wwk&Password=123
4.http响应也由3部分组成:状态行,消息报头,响应正文。
(1)状态行格式:HTTP-Version Status-code Reason-phrase CRLF
例 HTTP/1.1 200 OK 换行/r/n
状态代码由3位数字表示,第一个数字给出了响应的类别,
1XX-指标信息,表示请求已接收,继续处理。
2XX-成功,表示请求已被成功接收理解接受.
3XX-重定向,要完成请求必须进行更进一步的操作,
4XX-客户端错误,请求有语法错误,或请求无法实现。
5XX-服务端错误,服务器未能实现合法的请求。
例
200 OK 客户端请求成功,
301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动访问新的URL。
301,302跳转...
400 bad request 由于客户端请求有语法错误,不能被服务器理解
401 Uauthorized 请求未经授权,这个状态码必须和WWW-Authenticate响应报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务,服务器通常会在响应正文中给出不提供服务的原因。
404 Not Found 请求的资源不存在.
500 Internal server error 服务器发生了不可预期的错误,无法完成客户端的请求
503 Service Unavailable 服务器当前不能处理客户端的请求,在一段时间后可能恢复正常。
504 服务器超时
(2)消息报头。消息报头后也有一空行表示消息报头结束。
(3)响应正文,就是服务器返回的资源的内容。
5.消息报头分为 普通报头,请求报头,响应报头,实体报头。
每一个报头域格式为 名字:空格值 ,名字大小写无关
请求报头只能用于http请求中,响应报头只能用于http响应中,普通报头中有些可用于两者.
(1)普通报头,普通报头域应用于所有的请求和响应消息,常用的普通报头域:
·Cache-Control普通报头域用于指定缓存指令,缓存指令是单向的,分为请求时缓存指令和响应时缓存指令。最常用的缓存指令是no-cache 用于指示请求或响应消息不能缓存。例 为了指示IE浏览器客户端不要缓存页面,服务器端的jsp程序可以编写如下代码 response.setHeader("Cache-Control","no-cache");
·Date表示消息产生的日期和时间,服务器端响应应该总是在响应中包含它,在客户请求中应该在包含了消息正文时,才应该发送Date报头域.
·Connection指定连接的选项,如指定Keep-Alive表示连接是持续的,指定Close表示通知服务器在响应完成后关闭连接。
有时可以同时指定Pragma普通报头域,和Cache-Control报头域,以同时支持HTTP/1.0和HTTP/1.1
(2)请求报头,允许客户端向服务器端传递该请求的附加信息,以及客户端的自身信息。一些请求头的内容是根据上一次响应头信息而生成的.
·Accept指定客户端接受哪些类型的信息。 如text/html,image/gif,如果没有指定,则可接收任何类型。
·Accept-Charset指定可接受的字符集,如iso-8859-1,gb2312,如果没有指定,缺省任何字符集都可以接受.
·Accept-Encoding指定可接收的内容编码,如gzip,
·Accept-Language指定可接收的语言,如Zh-cn
·Authorization用于证明客户端有权查看某个资源,
·Host指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来,格式为 Host: host:端口,注意在发送
http请求时这个是必须的.例 Host: www.wangweike.com.cn 或Host:www.wangweike.com.cn:80
·User-Agent 允许客户端将他的操作系统,浏览器和其它属性告诉服务器
.Cookie 设置cookie,这是最重要的请求头信息之一
.Referer Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表, 可用来登陆、优化cache等;
它也允许废除的或错误的连接由于维护的目的被追踪。有些网站还会在Cookie中增加session防盗链.
(3)响应报头,主要用于一些附加响应信息,如对request-uri所标识的资源进行下一步访问的信息.
·Location 用于重定向接收者到一个新的位置
·Server服务器用来处理请求的软件信息。和User-Agent相对应。例Server: Apache-Coyote/1.1
·WWW-Authenticate必须被包含在401响应信息中.它和Authorization请求报头域是相关的。
.Set-Cookie 响应cookie
.Accept-Ranges 这个字段说明Web服务器是否支持Range(是否支持断点续传功能),如果支持,返回Accept-Ranges: bytes,如果不支持,返回Accept-Ranges: none。
.Content-Range 指定了返回的Web资源的字节范围。这个字段值的格式是:“开始字节位置-结束字节位置/Web资源的总字节数”。
下面是一个使用Content-Range的例子:Content-Range:1000-3000/5000
(4)实体报头,定义了关于实体正文和请求所标识的资源的元信息.
常用的实体报头:
·Content-Encoding 它指标了实体正文的内容编码.
·Content-Language描述了资源所用的自然语言
·Content-Length指明实体正文的字节数,仅包括实体正文的长度,没有包括实体报头
·Content-Type指明发送给接收者的实体正文的媒体类型
例Content-Type: text/html;charset=gb2312
text/html是html格式的正文,text/plain是无格式正文.
Content-Type: text/html;charset=utf-8
Content-Type: application/octet-stream
Content-Type: application/x-www-form-urlencoded
Content-Type: multipart/form-data
Content-Type: multipart/form-data; boundary=---------------------------7da3a06150514
·Last-Modified指示资源的最后修改日期及时间
·Expires给出响应过期的日期和时间,日期格式必须是RFC 1123中的日期格式.可以为了不让浏览器缓存页面,设置 Expires报头域值为0
6. 更深入的学习http协议,参看RFC2616.
See http://blog.cnw.com.cn/index.php/20937/viewspace-3418 For More.
7. Range字段头通过服务器只传输一部分Web资源。这个字段头可以用来实现断点续传功能。
有三种格式设置要传输的字节范围:
(1)Range: bytes=1000-2000,传输范围从1000到2000字节。
(2)Range: bytes=1000-,传输Web资源中第1000个字节以后的所有内容。
(3)Range bytes=1000,传输最后1000个字节。
8.boundary... 意为边界
因为RFC1867增加了文件上传得功能,而上传文件内容自然也会被加入到HTTP的实体中。现在因为既有HTTP一般的参数实体,又有上传文件的实体,所以用boundary把每种实体进行了分割.
Content-Type: multipart/form-data; boundary=---------------------------7da3a06150514
例:
---------------------------7da3a06150514
Content-Disposition: form-data; name="title"
\r\n
Today
---------------------------7da3a06150514
Content-Disposition: form-data; name="1.txt"; filename="C:\1.txt"
Content-Type: text/plain
\r\n
这里是1.txt文件的内容
---------------------------7da3a06150514--
\r\n
9.Transfer-Encoding: chunked 返回的头中可能没有Content-Length的情况
有时候,Web服务器生成HTTP Response是无法在Header就确定消息大小的,这时一般来说服务器将不会提供Content-Length的头信息,而采用Chunked编码动态的提供body内容的长度。
进行Chunked编码传输的HTTP Response会在消息头部设置:
Transfer-Encoding: chunked
表示Content Body将用Chunked编码传输内容。
http://blog.csdn.net/cxzhq2002/archive/2008/04/23/2317248.aspx
http://blog.aizhet.com/PHP/1357.html
http://www.redicecn.com/plus/view.php?aid=356
10.使用cmwap,有的地区的移动和联通可能会拦截掉cookie的传输。
11.CONNECT与TUNNEL研究。。。
12.判断是文件下载
Content-Disposition:有的值为attachment; filename="C8C4982A0987F6DD482579AF0033FC2E.doc",有的没有给这个值。
if( !contentType || [contentType hasPrefix:@"text/html"] || [contentType hasPrefix:@"text/vnd.wap.wml"])
{
isAttachment=NO;
}
else
{
isAttachment=YES;
}
contentType的可能值有:text/html,text/vnd.wap.wml,text/plain,text/css,
application/msword;charset=UTF-8,
application/vnd.android.package-archive,
application/octet-stream
等。
有的下载响应头为
Content-Disposition:attachment
Content-Type:application/octet-stream
13. HTTP Cache:基于资源的缓存机制,大大节省服务器程序资源,节约了很多网络带宽
参考
http://hi.baidu.com/webvsky/item/4ec84a8a1ef1ee56e63d1998
http://robbin.iteye.com/blog/462476当浏览器或者订阅程序访问这个URL地址的时候,服务器在response的header里面告诉浏览器这个网络资源的最后修改时间和Etag:
Etag "427fe7b6442f2096dff4f92339305444"
Last-Modified Fri, 04 Sep 2009 05:55:43 GMT
然后浏览器把这两个状态信息连同网页内容,在本地进行缓存,当浏览器再次访问这个地址的时候,浏览器会发送如下两个状态标识给服务器:
If-None-Match "427fe7b6442f2096dff4f92339305444"
If-Modified-Since Fri, 04 Sep 2009 05:55:43 GMT
告诉服务器本地缓存的网页最后修改时间和Etag,询问服务器的资源有没有在上次访问之后有更新,服务器核对如果该用户上次访问之后没有更新,服务器就发送一个304 Not Modified的消息,结束。
14. HTTP请求与服务器交互GET与POST方法的区别
GET 适用于多数请求,而保留 POST 仅用于更新站点。
根据HTTP 规范,GET用于信息获取,而且应该是安全和幂等的。安全意味着该操作用于获取信息而非修改信息,GET请求一般不应产生副作用。幂等意味着对同一 URL的多个请求应该返回同样的结果。
在FORM提交的时候,如果不指定Method,则默认 为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;
GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
HTTP Keep-Alive详解
http://liuzhigong.blog.163.com/blog/static/1782723752011412551547/
HTTP协议头部与Keep-Alive模式详解
https://www.byvoid.com/blog/http-keep-alive-header
15.