您的位置:首页 > 理论基础 > 计算机网络

HTTP协议

2015-12-24 17:42 447 查看
1、简介



  HTTP(hypertext transport protocol):超文本传输协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。

  HTTP就是一个通信规则,这个通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式,就像写信也要有写信的格式一样。HTTP协议包括两个内容:客户端发送给服务器的格式叫“请求协议”;服务器发送给客户端的格式叫“响应协议”。

  HTTP称为超文本传输协议,这与HTML很像,HTML称为超文本标记语言,简单来说,HTTP是用来传递HTML的。

  附:HTML也分为两种,一种本身类型就是HTML;一种是将JSP等转换而来的HTML。

2、请求协议

  请求协议分为get请求和post请求两种,请求协议内容依次为:请求首行、请求头、请求体。

(1)get请求协议

  前边已经简单阐述过get和post(请点击这里),此处直接以get请求实例来进行分析:

<span style="font-size:18px;">GET /HelloWorld/index.jsp HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.4; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98</span>


分析:

  GET /hello/index.jsp HTTP/1.1:请求首行。表示请求方式为GET请求,请求服务器路径为 /HelloWorld/index.jsp(请求地址,即请求URL)的jsp文件,协议版本为1.1。

  ●Host:localhost:请求头。表示请求的主机名为localhost(请求头中冒号前为头名,后为头值)。

  User-Agent: Mozilla/5.0 (Windows NT 6.4;
rv:5.0) Gecko/20100101 Firefox/5.0:
请求头。这是与浏览器品牌和OS(操作系统)相关的信息。有些网页会为用户显示出当前的系统版本和浏览器版本信息,这都是通过获取User-Agent头信息得来的。此处的windows NT6.4(内核版本)表示本机系统为win10。

  ●Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8:请求头。告诉服务器,当前客户端可以接收的文档类型。后面*/*的意思表示可以接受任意类型文件。

  Accept-Language: zh-cn,zh;q=0.5:请求头。表示当前客户端支持的语言环境,可以在浏览器的工具----选项中找到语言相关信息;

  Accept-Encoding: gzip, deflate:请求头。表示当前浏览器支持的压缩格式(数据在网络上传递时,服务器可能会将数据压缩后再发送)。

  Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7:请求头。表示当前客户端支持的编码类型。

  Connection: keep-alive:请求头。客户端支持的链接方式,表示将连接保持一段时间,从而能够使得在本次连接范围内能够向服务器发送多次请求,默认时间为3000ms。

  Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:请求头。Cookie由服务器发送给客户端并保存在本地客户端,当非第一次向服务器请求相同的URL时,客户端会将上次服务器响应中发送过来的Cookie在请求中一并发送过去;这里这个Cookie的名字为JSESSIONID。

(2)post请求协议

post请求实例:

<span style="font-size:18px;">POST /hello/index.jsp HTTP/1.1
Accept: image/gif, image/jpeg, imag e/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: http://localhost:8080/HelloWorld/index.jsp Accept-Language: zh-cn,en-US;q=0.5
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 13
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=E365D980343B9307023A1D271CC48E7D

keyword=hello
</span>
分析(这里只说一些和get请求不相同的地方):

  Referer: http://localhost:8080/hello/index.jsp:请求头。表示请求来自哪个页面,例如我们从百度页面上点击链接到了这里,那么就会Referer:http://www.baidu.com;值得注意的是,Referer表示请求来自哪个页面,如果直接在浏览器地址栏中输入的地址访问的页面,请求头中就没有Referer了。
  Content-Type: application/x-www-form-urlencoded:请求头。表示表单的数据类型,urlencoded说明会使用url格式编码数据;url编码的数据都是以“%”为前缀,后面跟随两位的16进制用于对能够显示在地址栏内的敏感的信息进行加密。

  Content-Length:13:请求头。这里记录了请求体的长度,表示为13个字节。

  keyword=hello:请求体。hello是在表单中输入的数据,keyword是表单字段的名字。

对比发现,get是没有请求体的,请求内容和请求首行放在一起;POST请求是有请求体的,请求内容放在请求体中。

附:Referer请求头的作用?

  (1)统计工作:假如我是一个做Java软件的公司,我希望在百度搜索Java时第一个出来的是我的公司,那么我要向百度交钱来让百度将我的公司放在搜索结果靠前的位置。那么我想知道到底我在百度做广告给我们网站的访问量带来了多大的影响,这时候就可以对每个请求中的Referer进行分析,如果很大一部分Referer显示为百度,那么说明这些用户都是通过百度找到我们网站的,说明给百度的钱没有浪费。

  (2)防盗链:我公司网站上有一个下载《秦时明月》的A链接,但有某网页有一个链接指向我们网站的A链接,用户点击它的链接就能直接从我网站上下载《秦时明月》,这说明用户没有访问我的网站,没有看我们网站的广告,却下载走了我网站的资源。

  这时可以使用Referer进行防盗链,在资源被下载之前,我们对Referer进行判断,如果请求首行中的路径是我们网站的路径,表示请求来自于我们网站,那么就允许下载《秦时明月》,如果请求不是来源于我网站,那我先让你跳转到我网站看完广告,再允许下载。

3、响应协议



响应协议内容依次为:响应首行、响应头、响应体。例:

<span style="font-size:18px;">HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 724
Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello
Date: Wed, 25 Sep 2012 04:15:03 GMT 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="http://localhost:8080/hello/">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
<form action="" method="post">
  关键字:<input type="text" name="keyword"/>
  <input type="submit" value="提交"/>
</form>
  </body>
</html>
</span></span>

分析:

  HTTP/1.1 200 OK:响应首行。表示响应协议为HTTP1.1,状态码为200,表示请求成功,OK是对状态码的解释。

  Server: Apache-Coyote/1.1:响应头。表示服务器的版本信息。

  Content-Type: text/html;charset=UTF-8:响应头。表示告诉客户端浏览器响应体使用的编码为UTF-8。

  Content-Length: 724:响应头。表示响应体长度为724字节。

  Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4;
Path=/hello:
响应头。服务器响应给客户端的Cookie。

  Date: Wed, 25 Sep 2012 04:15:03 GMT:响应的时间,因为时差原因,会和我们有8小时的时区差;在时区中中国属于东八区。

  响应头下边的HTML代码为响应体。

附:常见的状态码如下:

  状态码对浏览器来说很重要,它说明了响应的真正含义。例如200表示响应成功了,302表示重定向。

  200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中。

  404:请求的资源没有找到,说明客户端错误的请求了不存在的资源(4开头的状态码一般表示是客户端的错)。

  500:请求资源找到了,但服务器内部出现了错误(5开头的状态码一般表示服务器出错)。

  ●302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址。

  ●304:当用户第一次请求index.html时,服务器会添加一个名为Last-Modified响应头,这个头说明了index.html的最后修改时间,浏览器会把index.html内容,以及最后响应时间缓存下来。当用户第二次请求index.html时,在请求中包含一个名为If-Modified-Since请求头,它的值就是第一次请求时服务器通过Last-Modified响应头发送给浏览器的值,即index.html最后的修改时间。

  If-Modified-Since请求头就是在告诉服务器,我这里浏览器缓存的index.html最后修改时间是这个,您看看现在的index.html最后修改时间是不是这个,如果还是,那么您就不用再响应这个index.html内容了,我会把缓存的内容直接显示出来。而服务器端会获取If-Modified-Since值,与index.html的当前最后修改时间比对,如果相同,服务器会发响应码304,表示index.html与浏览器上次缓存的相同,无需再次发送,浏览器可以显示自己的缓存页面,如果比对不同,那么说明index.html已经做了修改,服务器会响应200。

4、其它的一些响应、请求头

(1)Refresh:

  ●Refresh: 3;url=http://www.baidu.com

  这个响应头在命令浏览器在3秒之后自动跳转到百度首页。

(2)If-Modified-Since:

  表示将把上次请求的文件最后修改时间还给服务器;服务器会比较If-Modified-Since的时间与服务器端存储的文件最后修改时间是否一致,如果一致,说明此文件未发生改变,服务器会响应304,而且不会有响应正文,表示浏览器缓存的就是最新版本,浏览器会直接使用本地缓存而不是从服务器重新加载。

5、HTML中指定响应头

  在HTMl页面中可以加入<meta http-equiv=" " content=" ">来指定响应头,例如在index.html页面中给出:

  ●<meta http-equiv="Refresh" content="3;url=http://www.baidu.com">

  这条指令表示浏览器会显示index.html页面3秒,然后自动跳转到百度首页。

  小结:HTTP协议是客户端与服务器端的通信格式,如果比作写信的话,客户端写给服务器的信就称为请求,信的格式就是请求协议;服务器给客户端的回信就叫做响应,响应格式叫做响应协议。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: