http协议能干什么
我们在学一个东西之前,我们总是能问,这个东西到底能干什么?现在的生活压力这么大,谁会耐着性子去学一个无用的东西呢?那么,http到底能干什么呢?要回答这个问题,我们环顾一下我们的周围,从一个普通用户的角度,可以说,没有http协议,就没有互联网的丰富多彩。从一个web开发者的角度,了解了http协议,才能了解web网站的实质。学会了http协议,你就会发现web后台开发的语言,无论是c++还是php或者是java,他们都是对http协议的一种封装和实现,道理是相通的,这就是道,明白了这个道,开发起web网站来,事半而功倍,才能触类旁通。
怎么学习http协议?当然,最详细最权威的方法还是看rfc文档,但是要让一个初学者看完、看懂如此专业属于遍布,内容很长的一个文档,是不太现实的,也是很痛苦的。我主张的方法是:在使用中学习,由易到难,逐步学习。学习的最好方法就是看例子。
第一个例子:
第一个例子以访问google主页www.google.cn,抓包工具使用httpwatch,如果不了解这个工具,那就google一下看看怎么用。假如你已经安装好了,打开IE,打开httpwatch,然后输入www.google.cn,键下回车键:
Httpwatch抓了个这样的包,下面来解释这个这个过程:
1 在IE的url栏里输入www.google.cn并敲回车,此时IE解析这个url,分离host和请求的资源,此时url中没有请求的资源,说明是请求的默认资源。IE和域名为www.google.cn的机器建立一个socket连接,发送一个协议流过去,这个协议流中描述了本机器的一些配置和要请求的那个网页,以及指明了接收服务器返回的网页的编码类型,这个请求看起来是这样的:
第一行指明http协议中信息提交的方式,最常用的有两种方式,第一种为GET,第二种为POST,这两种方式的区别待会再讲,现在先对这个http请求有个整体的认识。
第二行Accept指定接受的返回方式,比如返回的网页是一个jpg、纯文本、gif等
第三行指定Accept-Language指定返回的字符集,这里zh-cn表示是中文
第四行Accept-Encoding指定返回的支付编码,gzip表示可以是gzip压缩
第五行User-Agent是提交的浏览器的信息,可以不用关注
第六行Host指定这个请求的host
第七行Connection: Kepp-Alive表示使用socket长连接
第八行Cookie就是表示cookie信息
总体意思:这个请求头部就是告诉www.google.cn这个域名的服务器,我要请求默认的网页,这个网页的的格式可以是gif,x-xbitmap,jpeg,flash,ppt,word,纯文本等。我接受的字符集是中文,返回的字节流可以是经过gzip和deflate编码的。并且在信息传输的过程中使用长连接,并且我的cookie中的信息是PREF=ID…
好了,常用的http请求头部应该就上面那么多,其他的想了解更多就需要自己查文档了。
当服务器接收到这个请求后,根据这个请求的描述,返回相应的内容:
第一行,指定http的协议和返回码,指定使用的是http/1.1协议,返回码是200 ok
第二行,Cache-Control表示使用的缓存机制
第三行,Date表示这个资源的最后更新日期
第四行,Expires表示超时时间
第五行,Content-Type指定返回资源的类型,这里是一个utf-8编码的html网页
第六行,Sever表示服务器使用的是什么web服务器
第七行,Content-Encoding表示采用的编码方式,这里是采用gzip压缩
第八行,Transfer-Encoding,传输的类型,这里采用chunked方式
浏览器接收到这个信息后,就按照响应中指定的类型,解析出内容,并显示出来。
GET和POST方式的区别
此时第一行的GET编程POST,并且名值对放到头部的最后,并和头部之间用空行隔开
提交信息的长度在协议中并没有指定,但是浏览器在实现时还是用区别的,一般都是对post没有长度限制,对get方式提交的信息长度有限制