HTTP协议定义了浏览器怎么向万维网请求万维网文档,以及服务器怎么把万维网文档传给浏览器,
HTTP是面向事务的应用层协议。
所谓面向事务就是指一系列的信息交换,这些交换的信息是一个整体,要么这些信息全部交换,要么就不交换。
HTTP不仅能传送超文本跳转信息所必须的信息,而且也能传输任何能在互联网上得到的信息。
HTTP概念:
每个万维网网点都有一个服务器进程,用来监视TCP的端口80,以便发现是否有浏览器向它发出建立连接请求,一但监听到需要建立TCP连接,浏览器就会向万维网发出浏览某个页面的请求,而万维网对这个请求的页面做出响应,最后,TCP连接释放。在浏览器和服务器之间的请求与响应的交互,必须按照一定的格式和规则,这些格式和规则就是超文本传输协议HTTP。
HTTP协议本身是无连接的,虽然HTTP需要用到TCP作为运输层协议,但是在通信双方交换HTTP报文之前不需要建立HTTP连接。
HTTP本身是无状态的,也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次一样,因为服务器不记得曾经访问过的用户,也不记得这个用户访问了多少次。
HTTP的版本
HTTP/1.0的主要缺点:每当请求一个文档,就需要两倍的RTT的开销(一个RTT是用于TCP的连接,另一个RTT用于请求和接受万维网文档),如果有很多个对象需要建立连接,那么每一次连接都需要2*RTT的时间开销。另一方面,每一次请求都需要建立TCP连接,并且万维网通常都服务于大量的请求,所以这种非持续性的连接会导致万维网的负荷过大。
HTTP/1.1采用的是持续连接,就是在建立连接后的一段时间内任然保持连接,使得同一个客户和服务器传送后续的请求的响应。
持续连接有两种工作方式,非流水线和流水线。
非流水线:客户在收到上一个响应才能发出下一个请求。缺点:服务器在发送了一个对象后,TCP处于空闲状态,浪费资源
流水线:客户在收到HTTP的响应报文之前,就能够接着发送新的请求。
HTTP的报文结构:
请求报文:客户向服务器发送请求报文
请求报文:服务器给客户的响应
HTTP的请求和响应报文都是由三部分组成:
1.开始行
请求报文:方法+URL+版本
请求报文:版本+状态+短语
2.首部行
用来说明浏览器和服务器和报文主体的一些信息。
3.正文
请求报文中的方法:
【GET:获取资源】
GET方法用来请求已被URI识别的资源。指定的资源经服务器端解析后返回响应内容(也就是说,如果请求的资源是文本,那就保持原样返回;如果是CGI[通用网关接口]那样的程序,则返回经过执行后的输出结果)。
【POST:传输实体文本】
POST方法用来传输实体的主体。
虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法;虽然GET方法和POST方法很相似,但是POST的主要目的并不是获取响应的主体内容。
在这里我们来比较GET方法和POST方法本质上的区别:
1、GET方法用于信息获取,它是安全的(安全:指非修改信息,如数据库方面的信息),而POST方法是用于修改服务器上资源的请求;
2、GET请求的数据会附在URL之后,而POST方法提交的数据则放置在HTTP报文实体的主体里,所以POST方法的安全性比GET方法要高;
3、GET方法传输的数据量一般限制在2KB,其原因在于:GET是通过URL提交数据,而URL本身对于数据没有限制,但是不同的浏览器对于URL是有限制的,比如IE浏览器对于URL的限制为2KB,而Chrome,FireFox浏览器理论上对于URL是没有限制的,它真正的限制取决于操作系统本身;POST方法对于数据大小是无限制的,真正影响到数据大小的是服务器处理程序的能力。
【HEAD:获得报文首部】
HEAD方法和GET方法一样,知识不返回豹纹的主体部分,用于确认URI的有效性及资源更新的日期时间等。
具体来说:1、判断类型; 2、查看响应中的状态码,看对象是否存在(响应:请求执行成功了,但无数据返回); 3、测试资源是否被修改过
HEAD方法和GET方法的区别: GET方法有实体,HEAD方法无实体。
【PUT:传输文件】
PUT方法用来传输文件,就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存在请求URI指定的位置。但是HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全问题,故一般不用。
【DELETE:删除文件】
指明客户端想让服务器删除某个资源,与PUT方法相反,按URI删除指定资源
【OPTIONS:询问支持的方法】
OPTIONS方法用来查询针对请求URI指定资源支持的方法(客户端询问服务器可以提交哪些请求方法)
【TRACE:追踪路径】
客户端可以对请求消息的传输路径进行追踪,TRACE方法是让Web服务器端将之前的请求通信还给客户端的方法
【CONNECT:要求用隧道协议连接代理】
CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。
首部行的首部字段名和含义:
常见的请求头字段含义:
Accept: 浏览器可接受的MIME类型。
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Content-Length:表示请求消息正文的长度。
Host: 客户机通过这个头告诉服务器,想访问的主机名。Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。只有当所请求的内容在指定的时间后又经过修改才返回它,否则返回304“Not Modified”应答。
Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:User-Agent头域的内容包含发出请求的用户信息。浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
Connection:处理完这次请求后是否断开连接还是继续保持连接。如果Servlet看到这里的值为“Keep- Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
Range:Range头域可以请求实体的一个或者多个子范围。例如,
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。
响应报文中的状态码:
五大类
1.1xx 表示通知信息,比如请求收到了和正在处理
2.2xx 表示成功
3.3xx 表示重定向,如果请求成功需要进一步的操作
4.4xx 表示客户端的差错
5.5xx 表示服务器的差错