HTTP对于因特网来说可谓是无处不在,但我们可能对他熟视无睹;这个也很正常,如果你不搞什么web service或分布式,你接触HTTP协议也就是在定义一个超链接或为一个表单设置method属性,但作为搞web程序猿的我们,这是远远不够的;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(1)首先介绍点关于HTTP的基础常识:
1.HTTP是hypertext transfer protocol(超文本传输协议)的简称,它是TCP/IP协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数 据本身的格式;
2.HTTP协议的版本:HTTP/ 1.0 HTTP /1.1 HTTP-NG
(2)HTTP使用之URL:
HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI; 如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
例如:http://localhost:8080/HelloWorld/index.jsp
(3)HTTP/1.0与HTTP/1.1:
1.HTTP/1.0的会话过程:四步骤:1.建立连接 2.发出请求信息 3.回送响应信息 4 .关闭连接。
a. 浏览器与WEB服务器间的连接过程是短暂的,每次连接只处理一个请求和响应,对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接
(包括同一页面的不同请求);
b.浏览器与WEB服务器之间的所有通讯都是完全独立,分开的请求和响应对(如我们在接收到返回的页面后,拔掉网线,再插上网线,再点此链接服务器仍然能回应)。
c.支持代理:在浏览器与WEB服务器间可有多台代理服务器,当代理服务器接收到浏览器的请求后,若代理服务器的本地缓存中没有请求的资源,则代理服务器会向
WEB服务器请求资源并返回给浏览器,并且并将资源保存在代理服务器的本地缓存中。
d.HTTP/1.0在用户访问多图的网页时会有性能的缺陷,需要多次请求和响应,先是响应网页文档,在响应停止后,网页会发觉有许多的图片URL地址,就每张图片向
服务器访问一次;
而在HTTP/1.1中的变化:
e.在一个TCP连接上可以传送多个HTTP请求和响应。但每个单独的网页文件还是会分开连接的。
f.多次请求和响应过程可以重叠运行,即不需要等响应回来后就可再次请求。
g.增加了更多的请求头和响应头(支持Host请求字段,使得WEB服务器能支持基于主机名的虚拟主机)。
(4)HTTP协议之请求
请求消息的结构:一个请求行,若干消息头,以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。用GET方式请求时不包含实体内容,但在消息头后仍需空行已表示消息头已输完;只有(POST,PUT, DELETE)才能会包含实体内容;
下面介绍几种不同请求方式的使用:
a.GET 用来获取文档的 b.用来提交html表单的 c.HEAD 用来获取一个文件的首部信息 d.PUT 用于向服务器上传文档 e.DELETE 用来删除服务器上的文档;
以GET方式举例:
GET /books/java.htnl HTTP/1.1(请求行)注意大写
Accept: */*(以下为消息头)
Accept-language: en-us
Connection: Keep-Alive
Host: localhost
(空行)
。。。。。(实体内容,但GET方式是没有的)
(4)HTTP协议之响应:
响应消息的结构:一个状态行,若干消息头,以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。返回的实体内容就是我们在网页中查看源文件所能看到的东西。
举例:HTTP/1.1 200 OK(状态行)
Server: Micorosoft-IIS/5.0(消息头)
Date: Thu, 13
(空行)
<HTML>(实体内容)
<BODY>
………………
对于HTTP/1.1来说,如果HTTP包含实体内容,且没有采用chunked传输编码方式,那么消息头部分必须包含内容长度的字段,否则,客户和服务器程序就无法知道实体内容何时结束。
补充:在HTTP协议中,还可以使用简单的请求消息和响应消息,他们都没有消息头部分。简单请求消息只能用于GET方式,且请求行中不用指定HTTP版本号,对于简单的请求消息,服务器返回简单的响应消息,只包含实体内容。
(5)HTTP协议之消息头:
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。
------------------------------------------------------------------------------------
使用消息头作用:
使用消息头,可以实现HTTP客户机与服务器之间条件请求和应答,消息头相当于服务器与浏览器间的一些暗号指令(如可以让服务器知道当前用户的请求是通过哪个网页的超链接导航进入的)。
--------------------------------------------------------------------------------------------
消息头格式:
a.每个消息头包含一个头字段名称,然后依次是冒号,空格,值,回车和换行符
举例:Accept-Language: en-us
b.消息头字段名是不区分大小写的,但习惯上将每个单词的头字母大写,
c.整个消息头部分中的各行消息头可安任何顺序排列;
d.许多请求头字段都允许客户端在值部分指定多个可接受的选项,多个项之间以逗号分隔;
e.有些头字段可以出现多次,例如:响应消息中可以包含多个“warn”头字段
举例:Accept-Encoding: gzip,compress
--------------------------------------------------------------------------------------------
消息头分类:
消息头有可分为:通用消息头,请求头,响应头,字体头等四类;
------------------------------------------------------------------------------------
(6) HTTP协议之请求行和状态行
a.请求行: 格式: 请求方式 资源路径 HTTP版本号<CRLF>
举例:GET/text.html HTTP/1.1
请求方式:POST HEAD OPTIONS DELETE TRACE PUT
b.状态行:格式:HTTP版本号 状态码 原因叙述<CRLF>
举例:HTTP/1.1 200 OK
使用GET 和POST 方式传递参数
1.GET方式:
举例:GET/servlet/ParamsServlet?prame1=abc&prame2=123 HTTP/1.1
特点:传送的数据量有限,一般限制在1kb以下
2.POST方式:
举例:POST/ servlet/ParamsServlet HTTP/1.1
Host:
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
prame1=abc&prame2=123//参数作为实体信息传递
特点:传输的数据量要比GET方式大的多
(7)介绍下状态响应码:
响应状态码:用于表示服务器对请求的各种不同处理结果和状态,它是一个三位的十进制数,响应状态码可分为5种类别,使用最高位为1----5来分类;
(1)100~199:表示成功接受请求;要求用户提交下一次请求才能完成整个过程
(2)200~299:表示成功接受请求并已完成整个处理过程;
(3)300~399:为完成请求客户需要进一步细化请求,
(4)400~499客户端的请求有错误
(5)500~599服务器端出现错误
常见的一些响应码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报 //头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后, //可能恢复正常
(7)HTTP协议之通用消息头
通用消息头:即能用于请求信息也能用于响应信息,他包括一些与被传输实体内容无关的常用消息字段;
Cache-Control: no-cache(不读取缓存)
Connection: close(读取后就断开)
Date: Tue. 11 Jul 2000 18:23:51 GMT
Pragma: no-cache(与Cache-Control,不过Cache-Control更可靠)
Trailer: Date(表示date头文件放在实体内容之后)
Transfer-Encoding: chunked
服务器在发送实体内容给客户端时,先将实体内容存在一个缓存区中,若缓存区满了, 则发送给客户端以腾空出缓存区,再向缓存区写入内容,此时它便不知道实体内容的大小了 就会用Transfer-Encoding的头字段。若一次写入缓存区未满但实体内容已写完,服务器就会发送实体内容给客户端,此是它便知道实体内容的大小,就会用content-length: (举例30)的头字段
(8)HTTPS:
它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。
它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安 全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使 用40位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。
与http的区别:
(1)https协议需要到ca申请证书,一般免费证书很少,需要交费。
(2)http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议
(3)http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
(4)http的连接很简单,是无状态的
(5)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全