在两台计算机之间使用HTTP协议进行通信的时候,在一条链路上必定有一端是客户端,另外一端则是服务端(但是角色可能会互换)。
就仅一条通信链路而言,服务端和客户端的角色是固定的,而用HTTP协议能够区分哪个是客户端,哪个是服务端。
HTTP协议规定,请求从客户端发出,最后服务器端响应请求并返回。也就是说服务端在没有接收到请求之前不会发送响应。
HTTP协议是无状态的协议,HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或者响应都不做持久化处理。
但是无状态可能会导致业务处理变得棘手的情况增多,比如登陆到一家购物网站,即使跳转到该网站的其他页面,也需要能继续保持登陆状态。为了实现这个功能,于是引入了Cookie技术
1、URI为完整的请求URI
GET http://hackr.jp/index.htm HTTP/1.1
URI在请求头中
2、在首部字段HOST中写明网络域名或IP地址
GET /index.htm HTTP/1.1
Host:hackr.jp
在Host中写明域名或者IP
GET方法用来请求访问已被URI识别的资源。指定的资源经服务端解析后返回内容。
也就是说,如果是文本,那么就直接原样返回,如果是像CGI那样的程序,那么返回经过执行后的输出结果
实体主体可以理解成请求体
虽然用GET也可以传输实体的主体,但是一般不用get,虽然POST和GET相似,但是POST的主要目的不是获取响应的主体内容。
要求在请求报文的主体中包含文件内容。然后保存到请求URI的指定的位置。
HEAD和GET方法一样,只是不返回报文主体部分,用于确认URI的有效性即资源更新日期时间等。
DELETE方法用来删除文件,是与PUT相反的方法,用于按请求URI删除指定的资源。
OPTIONS方法用来查询针对请求URI指定的资源支持的方法。
TRACE方法是让WEB服务器端将之前的请求通信返回给客户端。
发送请求的时候,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将数字减去1,当数值刚好减到0的时候,就停止传输,最后接收到请求的服务器端返回状态码200 OK的响应。
客户端可以通过TRACE方法查询发送出去的请求是怎么样被加工修改的。这是因为连接到目标服务器可能会通过代理中转。
中间可能会经过多个代理服务器,返回当Max-Forwards为0的时候,此时那个服务器或者代理服务器收到的请求。
请求:
TRACE /HTTP/1.1
Host:hackr.jp
Max-Forwards:2
响应:
HTTP/1.1 200 OK
Content-Type:message/http
Content-Length:1024
TRACE /HTTP/1.1
Host:hackr.jp
Max-Forwards:2
在上面的响应体中,返回响应包含的请求内容
CONNECT方法要求在代理服务器通信时候建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接字)和TLS(Transport Layer Security,传输层安全)协议把内容加密后经网络隧道传输。
CONNECT方法的格式如下所示:
使用CONNECT方法的请求-响应的例子:
请求
CONNECT proxy.hackr.jp:8080 HTTP/1.1
HOST:proxy.hackr.jp
响应
HTTP/1.1 200 OK(之后进入网络隧道)
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体实体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获取报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
在这里列举了中多方法,LINK和UNLINK已经被HTTP/1.1废弃,不再支持。
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
下面的建立连接和断开连接可以以左边为客户端右边为服务端为例子看
如果不支持持久连接,在很多HTML页面中,可能要加载或者很多图片等,那么就需要多次TCP的连接和断开。
为了解决TCP连接的问题,HTTP/1.1和一部分HTTP/1.0想出了持久连接的方法,持久连接的特点是,只要任意一端没有明确断开连接,则保持TCP连接状态。
在HTTP/1.1中,所有的连接默认都是持久连接,但是在1.0的时候还没有标准化。
持久连接使得多数请求以管线化(Pipeling)方式发送成为可能。从前发送请求需要等待并收到响应,才能发送下一个请求,管线化技术出现后,不用等待响应即可直接发送下一个请求。
因为HTTP是无状态的,不对之前的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。
无状态好处:
Cookie技术通过在请求和响应的报文中写入Cookie信息来控制客户端的状态。
GET /reader/ HTTP/1.1
Host:hackr.jp
HTTP/1.1 200 OK
Date: Thu,12 Jul 2012 07:12:20 GMT
Server:Apache
Set-Cookie:sid=13520771420226724;path=/;expires=Wed,10-Oct-12 07:12:20 GMT
Context-Type:text/plain;charset=UTF-8
GET /image/ HTTP/1.1
Host:hackr.jp
Cookie:sid=13520771420226724
请求报文结构
响应报文结构:
编码的操作需要计算机完成,因此会消耗更多的CPU资源。
常见的压缩编码有下面几种:
在HTTP通信过程中,请求的编码实体资源尚未传输完成之前是无法显示请求页面的,在传输大容量时,通过把数据分割成多块,能够让浏览器逐步显示页面。
这种把实体主体分块的功能称为分块传输编码。
MIME(Multipurpose Internet Mail Extensions):多用途因特网邮件扩展
在把输出结果传送到浏览器上的时候,浏览器必须启动适当的应用程序来处理这个传输文档,这就可以通过MIME来完成。在HTTP中,MIME类型被定义在Content-Type Head中。
在web表单文件上传时使用
状态码206响应报文包含了多个范围的内容时使用
在HTTP报文中使用多部分对象集合时,需要在首部里加上Content-type。
要实现该功能需要指定下载的实体范围,像这样,指定范围发送的请求叫做范围请求。
5001-10000字节:
从5001字节之后全部:
从一开始到3000字节和5000-7000字节的多重范围:
在一个Web网站可能存在多份相同内容的页面,比如英语版本、中文版本的web页面,虽然内容上相同,但是使用的语言不同。
当浏览器的默认语言为英语或者中文,访问相同的URI的WEB页面的时候,则会显示对应的英语版或者中文版本的页面。这样的机制称为内容协商。
内容协商会以语言、字符集、编码方式等为基准判断响应的资源:
类别 | 原因短语 | |
---|---|---|
1XX | 信息性状态码 | 接收的请求正在处理 |
2XX | 成功状态码 | 请求正常处理完毕 |
3XX | 重定向状态码 | 需要进行附加操作以完成请求 |
4XX | 客户端错误状态码 | 服务器无法处理请求 |
5XX | 服务器错误状态码 | 服务器处理请求错误 |
只要遵守状态码类别的定义,即使改变RFC2616中定义的状态码或服务器端自行创建状态码都没问题。
表示从客户端发来的请求在服务器端被正常处理了。
表示服务器接收的请求已成功处理,但是在返回的响应报文中不含实体的主体部分,也不允许返回任何实体的主体。
当浏览器发出请求处理之后,返回204响应,那么浏览器显示的页面不发生更新。
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的get请求。
响应报文中包含有Content-Range指定范围的实体内容。
永久性重定向.
这个状态码表示请求的资源已经被分配了新的URI。以后应该使用资源现在所指的URI。
临时性重定向
该状态码表示请求的资源被分配了新的URI。希望用户(本次)能使用新的URI访问。
和301不同的是,302资源不是被永久移动。
该状态码表示请求报文中存在语法错误。
表示发送的请求需要有HTTP认证(BASIC、DIGEST认证)的认证信息。如果之前以及进行过一次请求,那么表示用户认证失败。
表示对请求资源的访问被服务器拒绝了。
服务器没有必要给出拒绝的理由,但是如果要给出拒绝理由的话,可以在实体的主体部分对原因进行描述。这样用户就能看到。
表示服务器上无法找到请求的资源
表示服务器端在执行请求时发生错误
表示服务器暂时处于超负载或者正在进行停机维护。
在互联网上,域名通过DNS解析映射到IP地址,可见,当请求发送到服务器的时候,已经上以IP地址形式访问了。
所以如果多域名的话,当接收到请求的时候就要弄清楚究竟要访问哪个域名。
在相同的IP地址下,虚拟主机可以寄存多个不同主机名和域名的web网站,因此在发送HTTP请求的时候,必须在Host首部内完整指定主机名或域名的URI
在HTTP通信的时候,还有一些用于转发通信数据的应用程序,如:代理、网关和隧道。
这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。
代理是一种有转发功能的应用程序,位于服务器和客户端之间,接收由客户端发送来的请求再转发给服务器,同时也接收服务器返回的响应并转发给客户端。
代理的好处:利用缓存减少网络带宽的流量。
预先将资源的副本保存在代理服务器
当对相同资源请求的时候,可以不从原服务器取数据,而是将之前缓存的资源作为响应返回。
不对报文做任何加工的代理。
网关是其他服务器通信数据的服务器,接收从客户端发来的请求,它就像自己拥有资源的服务器一样对请求进行处理,有时客户都不会察觉自己的通信目标是一个网关。
网关和代理类似,但是网关能使通信线路上的服务器提供非HTTP协议服务。
隧道可以按照要求建立起一条与其他服务器的通信线路,届时可以使用SSL等加密方式进行通信。隧道目的是为了保证服务端和客户端之间可以安全通信。
缓存服务器好处在于利用缓存可以避免多次从原服务器转发资源,因此客户端就近从服务器上获取资源,而原服务器也不必多次处理相同请求。
HTTP首部是构成HTTP报文的重要要素之一。无论是请求和响应都会使用首部字段,它能起到传递额外重要信息的作用。
首部是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证等内容
首部字段名:字段值
例如:
在请求和响应两方都有的首部。
从客户端向服务端发送请求报文时使用的首部,补充了请求的附加内容、客户端信息、响应内容相关内容优先级等信息
从服务器端向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息。
补充了资源内容更新时间等与实体有关的信息。