HTTP协议简介
一、简介
超文本传输协议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
最后一个头后面必须跟一个空行,它告诉服务器没有更多的请求头了。
- 服务器响应
参考资料:
- 《计算机网络》