HTTP协议概要

HTTP协议概要
一、 HTTP是什么?
HTTP是HyperText Transfer Protocol,翻译为中文是超文本传输协议。它在计算机网络中属于应用层的协议,它必须建立在可靠的传输层协议之上,一般情况下使用的是TCP协议。因而,HTTP协议是以客户端(请求)/服务器(响应)的形式进行信息传输的。
在Web早期的HTTP1.0中,客户端(通常为浏览器)与服务器建立连接(一般为TCP连接)后,客户端只发生一个请求,在服务器回送响应消息后,连接会立刻被释放。Web早期的web页面通常指包含HTML文本,因此这种方法足够使用。但web页面发展越来越庞大,包含的内容越来越多;若一个页面包含很多图片(或视频等),使用这种方法就会导致获取每一张图片(或视频等)都需要建立一次连接,这样的代价太大,效率太低。
这种现象导致了HTTP1.1的诞生,它与HTTP1.0最大的不同就在于她支持持续连接,这样就可以建立一次连接,然后持续发送(获取)数据,效率大大提高。目前主要使用HTTP1.1,而HTTP1.0将渐被淘汰。
二、 HTTP请求和响应报文的格式
HTTP请求由三部分组成:请求行,请求头(request header),请求正文。请求正文是可选的,它取决于请求行中指定的方法(后述)。
请求报文的格式
HTTP响应也由三部分组成:状态行,响应头(response header),响应正文。

三、 请求行
请求行的格式为:Method Request-URI HTTP-Version[换行]。这里的[换行]表示后面的数据需要另起一行写,即请求行独占一行。
Request-URI是指请求页面的URI。而Method即为方法,它指定了请求使用的方法,方法有多种,如图:
这里写图片描述
方法是大小写敏感的,如:GET是方法当Get不是。
GET方法就是请求服务器发送页面的意思。使用这个方法的请求没有请求正文。
HEAD方法则只请求服务器回送消息头(响应头)而不需要真正的页面,因而使用这个方法的请求的响应是没有响应正文的。
POST方法想服务器发送表单数据并请求回送页面。表单数据写在请求正文中。
PUT方法在服务器中写入一个页面,页面内容通常在请求正文中。执行这个方法必须有在服务器上的写权限,因而必须在请求头中指定Authorization的值(后述)。
DELETE方法与PUT方法相反,它是在服务器上删除页面。显然,也是需要权限的。
TRENCE方法指示服务器回送它接收到的请求,它主要用于调试。
CONNECT方法表示通过一个中间设备来与服务器建立连接来发送请求(获取页面)。使用代理服务器通常就需要使用这个方法。
OPETIONS方法用于向服务器查询一个页面的信息,获取可用于该页面的方法和头。
一个典型的例子为:GET /index.html HTTP/1.1[换行]。

四、 状态行
响应行的格式为:HTTP-Version Status-Code Reason-Phrase[换行]。
Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态码是一个3位的数字,根据第一个数字分为5大组,如图:
这里写图片描述
一个典型的例子:HTTP/1.1 200 OK[换行]。
五、 请求头与响应头
请求头与响应头的内容为一组键值对,以[key]:[value][换行]的形式保存,用于指定请求报文或响应报文的详细参数。HTTP规定的参数有很多,如图:
这里写图片描述
User-Agent头用于告诉服务器客户端的信息,通常为浏览器的信息,如Mozilla/5.0、Windows NT 5.0等。
Accept:指定客户端可以接收的信息类型,如text/html、image/gif等。
Accept-Charset:指定客户端可接收的字符集。
Accept-Encoding:指定客户端可接收的编码方式,这里的编码是指gzip等用于压缩或加密等的方式,并非指字符的编码,字符的编码由Accept-Charset指定。
Accept-Language:指定客户端可接收的自然语言,如zh-cn等。
If-Modified-Since,If-None-Match用于检测本地缓存是否fresh(后述)。
Host头是必须的,每一个请求头都必须包含这个参数,它指定了服务器的域名,用于访问服务器。
Authorization:用于指定客户的权限信息,证明客户有权限查看被保护的页面或执行特权操作(如写入页面、删除页面)。
Refer:用于给服务器发送发出当前请求的页面的URL。
Cookie:给服务器发送的cookie数据。
Set-Cookie:给用户发送的cookie数据。
Server头与User-Agent对应,给客户端发送的服务器的信息。
Content-Type、Content-Encoding、Content-Language头分别指定回送页面的内容类型、编码与自然语言。而Content-Length则为页面的字节长度。
Content-Range:指定回送的页面的范围,一般用于页面内容过大需要分次显示的情况下。Accept-Range与其不同,它用于指定服务器可接受的请求字节范围。
Last-Modified头说明页面最后被修改的时间,而Expires则说明页面能保持多长的有效时间。
Location头用于通知客户端应去尝试的另一个URL,通常用于域名重定向。
Date:用于指定请求或响应的日期。
ETag:用于给客户端或服务器发送一个页面的标签,通常用于缓存。这里说的标签是用于唯一标识一个页面的加密的哈希值。
六、 请求正文与响应正文
响应正文一般为请求页面的HTML。
这里写图片描述
请求正文在请求中并非强制的,它依赖于请求方法。为GET方法时,一般没有,为POST方法时,正文则存储发送给服务器的表单数据。如下示例所示:
这里写图片描述
这里写图片描述
七、 缓存机制
人们往往会返回之前浏览过的web页面,而这样页面也往往会有许多嵌入式资源,如网站背景图片等。若每次浏览都要到服务器去获取将大大地浪费资源。浏览器往往会积攒已经获取的页面义工日后使用,这被称为缓存机制。
HTTP缓存的困难问题在于如何确定以前缓存的页面和将要重新获取的页面是一样的,因为一个页面的内容可能时常更新,使用缓存的旧版本就不再合适。HTTP协议使用两种策略来解决这个问题。
1. 访问缓存页面,查看其是否有效。缓存页面最初获取时若指定了该页面的Expires头,那么可以根据Expires头指定的日期和时间跟当前日期和时间对比,来做出页面是否有效的决定。这个策略的问题在于,并非每个页面都会指定一个Expires,比如新闻网站,就无法指定这个值,它可能随时更新。因而,仅使用这个策略还不够。
2. 在第一种策略无效的情况下,将使用第二种策略。这种策略要求连接服务器进行信息查询,以决定缓存的副本是否有效。缓存页面在最初获取时得到Last-Modified头的时间日期信息,则可以使用If-Modified-Since头发送该时间到服务器,询问页面是否已经发生改变,若未发生改变则使用缓存版本不需要重新获取,否则重新获取。当然,缓存页面在最初获取时也可能得到ETag头,那么也可以使用If-None-Match头发送接收到的ETag到服务器,查看是否匹配。ETag值是一个加密的哈希值,页面被修改后,该页面对应的哈希值也会改变,因而查看该值是否匹配可以决定页面是否有效。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值