一、简介

超文本传输协议HTTP(HyperText Transfer Protocol)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端发送给服务器什么样的消息以及得到什么样的响应。

二、方法

1、请求

HTTP不仅支持请求一个Web页面,而且支持操作(方法)。HTTP内置的方法(方法名区分大小写)如下:

方法 描述
GET 读取一个Web页面
HEAD 读取一个Web页面的头
POST 附加一个Web页面
PUT 存储一个Web页面
DELETE 删除一个Web页面
TRACE 回应入境请求
CONNECT 通过代理连接
OPTIONS 一个页面的查询选项

每个HTTP请求由一行或多行ASCII文本组成,其中第一行的第一个词是被请求的方法名。例如,GET方法的通用形式是:

GET filename HTTP/1.1

  • GET

请求服务器发送页面。

  • HEAD

只请求消息头,不需要真正的页面。此方法可以收集建索引需要的信息,或者只是测试一下URL的有效性。

  • POST

一般用来提交表单,上传数据到服务器。

  • PUT

与GET方法相反,往服务器写入页面。

  • DELETE

删除页面。

  • TRACE

此方法用于调试,它指示服务器发回收到的消息。当请求没有被正确的处理而客户端希望知道服务器实际得到的是什么样的请求时,这个方法很有用。

  • CONNECT

使得用户通过一个中间设备与Web服务器建立一个连接。

  • OPTIONS

提供了一种让客户端向服务器查询一个页面并获得可用于该页面的方法和消息头的办法。

2、响应

每个请求都会得到一个响应,每个响应消息由一个状态行和可能的附加信息组成。状态行包括一个3位数字的状态码,表明请求的状态。例如:

HTTP/1.1 200 OK

根据状态码的第一个数字,可以把响应分为5种:

状态码 涵义 (举例)说明
1xx 信息 100:服务器同意处理客户请求
2xx 成功 200:请求成功;204:没有内容
3xx 重定向 301:页面被移动到另一个地址;304:缓存的页面仍然有效
4xx 客户端错误 403:没有访问权限;404:找不到页面
5xx 服务器端错误 500:服务器内部错误;503:稍后再试
  • 1xx状态码

很少被使用

  • 2xx状态码

请求被成功处理,并返回了相应的内容(如果有的话)

  • 3xx状态码

告诉客户端应该检查其他地方,使用另一个不同的URL或者是在缓存中查找

  • 4xx状态码

表示由于客户端错误而导致请求失败

  • 5xx状态码

表示服务器内部出现了问题,有可能是服务器中代码有错误或临时负载过重

三、消息头

请求行后面可能还有额外的行,其中包含了更多的信息,它们统称为请求头(request header)。响应消息也有响应头(response header)。有些消息头可以用在两个方向上。常用的HTTP消息头如下:

消息头 使用类型 说明
User-Agent 请求 有关浏览器及其平台的信息
Accept 请求 客户端能处理的页面类型
Accept-Charset 请求 客户端接受的字符集
Accept-Encoding 请求 客户端能解码的数据编码方式,例如gzip
Accept-Language 请求 客户端支持的语言
If-Modified-Since 请求 检查新鲜度的时间
If-None-Match 请求 之前为检查新鲜度而发送的标签
Host 请求 服务器的DNS名字
Authorization 请求 客户端的信任凭据
Referer 请求 发出请求的之前的URL
Range 请求 指定第一个和最后一个字节的位置(获取文件的部分内容,例如断点续传)
Cookie 请求 发给服务器的cookie
Set-Cookie 响应 要客户端存储的cookie
Server 响应 有关服务器的信息
Content-Encoding 响应 响应内容的编码
Content-Language 响应 内容使用的语言
Content-Length 响应 内容的长度,按字节计算
Content-Type 响应 内容的MIME类型
Content-Range 响应 响应带Range的请求,服务器会返回当前接受的文件范围和文件的总大小
Last-Modified 响应 页面的最后修改时间
Expires 响应 页面过期时间
Location 响应 告诉客户端向谁发送请求
Accept-Ranges 响应 指出服务器能接受的请求的字节范围
Connection 请求/响应 是否需要持久连接
Date 请求/响应 发送消息的时间
Cache-Control 请求/响应 指示如何处理缓存
ETag 请求/响应 页面内容的标签(文件的标记)
Upgrade 请求/响应 发送方希望切换的协议
  • User-Agent

将客户端浏览器的相关信息告知服务器。

  • Accept头

如果客户端对可接受的信息有一定的限制,可以通过4个Accept头告诉服务器。

  • If-Modified-Since和If-None-Match

用于处理缓存,用于客户端在网页的缓存副本不再有效时请求该网页。

  • Host

服务器的名字,取自URL。有些IP地址对应了多个DNS名字,所以服务器需要某种方法来决定应该把请求传递给哪个主机处理。

  • Authorization

对于被保护的页面,客户端需要证明自己有权查看被请求的页面。

  • Referer

大多数情况下是前一页面(跳转到当前页的页面)的URL,它能告诉服务器客户端是如何到达该页面的。

  • Set-Cookie

服务器向客户端发送Cookie,期待客户端保存Cookie,并且在后续的请求中通过Cookie请求头返回给服务器。

  • Content头

允许服务器描述它发送的页面的属性。

  • Last-Modified

页面的最后修改时间

  • Expires

页面的有效期

  • Location

通知客户端应该尝试请求另外一个URL。

  • ETag

ETag头给出了一个简短的标签,作为页面内容的标记,主要用于缓存。

  • Cache-Control

给出了如何缓存或如何不缓存网页的明确指示。

  • Upgrade

用来切换到一个新的通信协议。

四、缓存

积攒已获取的网页供日后使用的方式称为缓存。使用缓存可以减少不必要的重复传输,提高性能。

对于如何确定以前缓存的页面和将要重新获取的页面是相同的,有两种策略:

1、页面验证

通过比较缓存页面最初获取时返回的Expires头和当前时间来判断该页面是否有效,如果有效则直接返回缓存的页面,否则从服务器重新获取。

但实际上,服务器并不能准确的确定某个页面的过期时间,因此服务器必须谨慎的使用Expires头。

2、条件GET(conditional GET)

此种策略可弥补前一种策略的不足。该策略会询问服务器缓存的副本是否有效,服务器可以通过请求头字段来检查缓存是否有效。

  • 第一种方式

客户端可以从Last-Modified头获取缓存页面的最后更新时间,然后将此时间通过If-Modified-Since头发送给服务器,询问服务器所请求的页面在此期间是否发生过变化。

  • 第二种方式

服务器在返回页面的消息头中添加ETag头,这个头是页面内容的标记,有点像校验和但比它更好(可以是一个加密的哈希值)。

客户端向服务器发送If-None-Match头,该头列出了缓存副本的标签(ETag),如果任何一个标签与内容相匹配,服务器将会予以响应,相应的缓存副本就可以使用。

3、说明

这两种缓存策略都会被Cache-Control头携带的指令所覆盖。

五、HTTP实验

  • 修改hosts文件

路径:C:\Windows\System32\drivers\etc\hosts

增加配置:

192.168.148.129 www.albert.com
  • 启动服务器

  • 建立telnet连接(即TCP连接)

telnet www.albert.com 80
  • 发送GET请求
GET /WebTest/index.html HTTP/1.1
Host: www.albert.com

最后一个头后面必须跟一个空行,它告诉服务器没有更多的请求头了。

  • 服务器响应

参考资料:
  • 《计算机网络》