HTTP/1.0 这是第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。
HTTP/1.1 当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。
HTTP/1.1相较于 HTTP/1.0 协议的区别主要体现在:
1 缓存处理
2 带宽优化及网络连接的使用
3 错误通知的管理
4 消息在网络中的发送
5 互联网地址的维护
6 安全性及完整性
一个问题很多人搞不清楚:
一个web页面中,使用img标签引用三幅图片,当客户端访问服务器中的这个web页面时,客户端总共会会访问几次服务器,即向服务器发送了几次Http请求。
客户端会向服务器发送4次请求,第一次是请求html的内容 ,解析到图片标签然后在去请求对应的图片资源,3张图片所以会再请求3次。
web页面设计的时候尽量少的访问访问服务器次数。如:引用js文件的时候能放到一个js文件的就别拆分。
Http请求:
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个Http请求。
一个完整的Http请求包括如下内容:
一个请求行、若干请求头、以及实体内容
例如:
GET /books/java.html HTTP/1.1 //这个叫请求行
Accept:﹡/﹡
Accpet-Language:en-us
Connection:Keep-Alive
Host:localhost
Referer: http://localhost/links.asp
User-Agent:Mozilla/4.0
Accept-Encoding:gizp,deflate
除了上面的请求行下面的都是请求头,请求头往下有个空格行,空格行下面就数据内容了,如果有的话。
一个请求由部分组成:请求行、请求消息头、数据内容。
请求行:请求行包括请求方式、请求的资源名称、HTTP协议版本号。
请求消息头:消息头用于描述客户端请求那台主机,以及客户端的一个环境信息等。
Http请求的细节——请求行
请求行中的GET称之为请求方式,请求方式有:
POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
常用的有:GET、POST
用户如没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输入地址访问,点击草连接访问等都是get,用户如想把请求方式改为post,可以通过更改表单的提交方式实现。
不管post或者get请求,都是想服务器请求某个web资源,这两种方式的区别主要表现在数据的传递上。
如:请求方式为get请求,则可以在请求的url地址后以?的形式带上交给服务器的数据,多个数据之间用&进行分隔,例如:GET /mail/1.html?name=abc&password=123 HTTP/1.1
GET方式的请求特点在URL后面附加的请求参数是有限的,其数据大小一般不能超过1K。
如果POST方式,则可以在请求的实体内容中向服务器发送数据,传输的数据量无限制。
Http请求的细节——消息头
用于Http请求中的常用头:
Accept:text/html,image/*
该头表示告诉服务器客户端可以接收的类型。
Accept-Charset:ISO-8859-1
该头表示告诉服务器客户端采用的编码。
Accept-Encoding:gizp,compress
该头表示告诉服务器,客户端支持的数据压缩格式。
Accept-Language:en-us,zh-cn
该头表示告诉服务器,客户端语言环境。
Host:www.it315.org:80
该头表示告诉服务器,客户端要访问的主机名。
If-Modified-Since: Tue,11 Jul 2018 18:23:51 GMT
该头表示告诉服务器,资源的缓存时间。比如:请求的时候服务器会拿到该时间和服务器对应的网页的时间对比,发现网页没有更新过内容,那么不会重新把数据再次发给客户端,而是让客户端加载本地缓存的数据。
Referer: http://www.it315.org/index.jsp
该头表示告诉服务器,它是从哪个资源来访问服务器的(可用于防盗链)。比如:你看到一个新闻标题,然后点进去结果是跳转到一个新的网站,那么这个网站可以根据这个请求头信息判断是不是从他的主页跳转过来的,如果不是他的主页跳转过来的,那么他可以直接响应成他自己的网站的首页。这也就是防盗链 防止别人从别的地方直接跳转到自己的内容。
User-Agent:Mozilla/4.0(compatible;MSIE 5.5;Windows NT 5.0)
该头告诉服务器 客户端的软件环境。
Cookie
该头客户端可以用该头带数据给服务器。
Connection:close/Keep-Alive
该头设置表示客户端请求完成后断开或保持该链接。
Date: Tue,11 Jul 2018 18:23:51 GMT
该头表示客户端当前时间。
Range:
Range头只是服务器只传输一部分Web资源。这个头可以用来实现断点续传功能。Range字段可以通过三种格式设置要传输的自己范围:
例如:
Range:bytes=1000-2000 ;传输范围从1000到2000字节。
Range:bytes=1000- ; 传输web资源中第1000个字节以后的所有内容。
Range:bytes=1000 ;传输最后1000个字节。
Http响应:
一个Http响应代表服务器向客户端返回的数据,它包括:一个状态行、若干响应消息头以及实体内容。
状态行:用于描述服务器对请求的处理结果。
响应头:用来描述服务器的基本信息,以及响应数据的描述,服务器通个这些数据的描述信息,可以通知客户端如何处理他返给的数据。
实体内容:服务器返回的客户的数据。
Http响应的细节——状态行
-
状态行
格式:HTTP版本号 状态码 原因叙述
举例:HTTP/1.1 200 OK
-
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应码分为五类,如下:
状态码 含义 100~199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程 200~299 表示成功接收请求并已完成了整个处理过程,常用:200 300~399 为完成请求,客户端需进一步细化请求;例如:请求的资源已经移动到了新地址,常用的302、307和304;
服务器返回302时会返回一个location,表示让客户端去请求其他地址,location会携带着这个地址,浏览器会自动请求新的地址。304或307表示让客户端去哪本地的缓冲。400~499 客户端请求有错误。常见404没该资源、403表示客户端没有权限访问 500~599 服务器端出现错误。常见500
Http响应细节——常用响应消息头
Location: http://www.it315.org/index.jsp
该消息头告诉浏览器要重定向的地址;
Server:Apache tomcat
该消息头告诉浏览器服务器的名称;
Content-Encoding: gizp
该消息头返回给浏览器的数据是什么压缩格式。
Content-Length: 80
该消息头表示返回给浏览器数据的长度。
Content-Language:zh-cn
该消息头返回浏览器的数据的语言类型。
Content-Type:text/html;charset=GB2312
该消息头表示返回给浏览器的数据类型是什么。比如:如果返回的是jpg图片,那么Content-type对应的值就为image/JPEG,关于怎么查询各种格式对应的类型,去tomcat下找到一个web.xml 去查询。
Last-Modified:
服务器通过这个头,告诉浏览器当前资源的缓存时间。
Refresh:
服务器通过这个头,告诉浏览器多长时间刷新。也可以指定刷新到某个地址
Content-Disposition:
服务器通过这个头,告诉浏览器以下载的方式打开数据。
Transfer-Encoding: chunked
服务器通个这个,告诉浏览器数据的传送格式。
Set-Cookie:
设置cookie;
ETag:
缓存相关的消息头。服务器会把返回的每个资源计算一个字符串标识,放到这个ETag消息头返回给浏览器,等下次浏览器再次访问服务器时会携带着这个ETag消息头,服务器检查ETag的值和服务器上的资源最后被更改后计算出的字符串标识,进行比较,如果一致就让浏览器取缓存,如果不一致就把服务器的最新资源返给浏览器。这个ETag消息头的特点是:可以实现实时监测,比如一毫秒内你发送了两次,他也会监测的。和其他缓存相关的消息头的区别是其他的是秒级别的。
Expires:
服务器通过这个消息头,告诉浏览器把返回的数据资源缓存多长时间,-1或0表示不缓存。
Cache-Control:no-cache
Pragma:no-cache
服务器通过Cache-Control、Pragma消息头也是控制浏览器不要缓存数据。为什么会有这么多控制缓存的消息头呢,因为浏览器历史的原因,各种不同的浏览器的控制是否缓存用的消息头不一致,所以要想市面上浏览器都不要缓存数据的话,就要把Cache-Control、Pragma、Expires都设置上。
Connection:close/keep-Alive
控制当前连接断开或保持。
Date:
当前服务器时间日期。
Accept-Ranges:
这个字段说明web服务器是否支持Range,支持则返回Accept-Ranges:bytes,如果不支持,则返回Accept-Ranges:none;
Content-Range:
指定了返回的Web资源的字节范围。这个字段值的格式是:列子:Content-Range:1000-3000/5000;返回到1000到3000的资源,资源总大小是5000.
断点续传:
可以用请求消息头里面的Range和响应消息头里面的Content-Range,实现断点续传,注意必须服务器支持,tomcat6.0以后都是默认支持。
网友评论