http协议

1.Http:HyperText Transfer Protocol,超文本传输协议。

属于应用层协议,是www上应用的最多的协议,目前版本是1.1,是一个基于请求/响应模式,无状态的协议.

在Intenet上,http通信基本上是基于tcp的连接方式,   还有基于其它协议或网络的实现方式.
HTTP假定传输是可靠的。

 

2.http Url的格式

http://host[:port][URI ]

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

可同时有多个同name的段出现。

 

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值