HTTP协议 I 定义
HTTP
HTTP(超文本传输协议)是 Web 应用最基础的应用层通信协议,用于客户端与服务器之间传输文本、图像、视频等信息。
HTTP协议内容与字段定义
- 资源 : Web服务器是Web资源(Web resource)的宿主。Web资源是Web内容的源头。最简单的Web资源就是Web服务器文件系统中的静态文件。
- 媒体类型 :当Web浏览器从服务器中取回一个对象时,会去查看相关的MIME类型,看看它是否知道应该如何处理这个对象
- URI : 服务器资源名被称为统一资源标识符(Uniform Resource Identifier, URI)。URI就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。
- URL : URL描述了一台特定服务器上某资源的特定位置,一般包含三部分 : 1.协议类型 2.网络地址 3.资源地址
- 事务 : 一个HTTP事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成
- 方法 :HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)。
- 状态码 :每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作。
报文结构
- 起始行 : 起始行报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。
- 首部字段 :起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。
- 主题 : 空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。
连接
HTTP是定义在TCP/IP 协议栈之上的。
在TCP层 ,TCP协议提供了
- 无差错的数据传输
- 按序传输(数据总是会按照发送的顺序到达)
- 未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)
再从网络协议栈层面考虑
IP (网络层) : 提供了服务端和客户端的路由寻址(如何对服务器进行访问)
TCP (传输层) : 提供了服务端和客户端之间的可靠通信
HTTP (应用层) : 提供了内容传递的路径和方法
HTTP 寻址访问传输的过程
- 客户端输入待访问的URL地址
- 浏览器发出DNS请求,解释URL地址为IP地址
- 得到IP地址后与服务器建立TCP连接
- 客户端浏览器发送HTTP请求报文
- 服务端响应HTTP响应报文
- 关闭链接,浏览器渲染HTTP响应报文
协议版本
0.9 协议只支持get方法
1.0 添加了额外的请求方法
1.1
结构组件
- 代理
代理位于客户端和服务器之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。
- 缓存
Web缓存(Web cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来
- 网关
网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP流量转换成其他的协议
- 隧道
隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP应用程序。HTTP隧道通常用来在一条或多条HTTP连接上转发非HTTP数据,转发时不会窥探数据。
- Agent代理
用户Agent代理(或者简称为Agent代理)是代表用户发起HTTP请求的客户端程序。所有发布Web请求的应用程序都是HTTP Agent代理。到目前为止,我们只提到过一种HTTP Agent代理:Web浏览器,但用户Agent代理还有很多其他类型。
格式
所有的URL 访问方式均符合
1 |
|
请求报文:
1 |
|
响应报文:
1 |
|
- 方法(method)客户端希望服务器对资源执行的动作。是一个单独的词,比如GET、HEAD或POST。本章稍后将详细介绍方法。·
- 请求URL(request-URL)命名了所请求资源,或者URL路径组件的完整URL。如果直接与服务器进行对话,只要URL的路径组件是资源的绝对路径,通常就不会有什么问题——服务器可以假定自己是URL的主机/端口。第2章详细地介绍了URL的语法。·
- 版本(version)报文所使用的HTTP版本,其格式看起来是这样的:
HTTP/<major>
.<minor>
- 状态码(status-code)这三位数字描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(“成功”、“出错”等)。
- 首部(header)可以有零个或多个首部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF。首部是由一个空行(CRLF)结束的,表示了首部列表的结束和实体主体部分的开始。有些HTTP版本,比如HTTP/1.1,要求有效的请求或响应报文中必须包含特定的首部。
- 实体的主体部分(entity-body)实体的主体部分包含一个由任意数据组成的数据块
方法
GET
GET是最常用的方法。通常用于请求服务器发送某个资源。
HEAD
HEAD方法与GET方法的行为很类似,但服务器在响应中只返回首部。不会返回实体的主体部分。
PUT
与GET从服务器读取文档相反,PUT方法会向服务器写入文档。有些发布系统允许用户创建Web页面,并用PUT直接将其安装到Web服务器上去
POST
表单中填好的数据通常会被送给服务器,然后由服务器将其发送到它要去的地方
TRACE
TRACE方法允许客户端在最终将请求发送给服务器时,看看它变成了什么样子。
OPTIONS
OPTIONS方法请求Web服务器告知其支持的各种功能。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法
DELETE
请服务器删除请求URL所指定的资源
状态码
状态码用来标记 响应报文对请求结果的处理方式
100 - 199 继续传输,表示客户端需要分段发送一段较长的消息数据。
200 - 299 成功,表示服务器成功接收到客户端的请求。
300 - 399 重定向,通常是资源变更后通知客户端访问另一个URL地址。
400 - 499 客户端异常,通常是由来自客户端的请求消息不符合服务端的要求所导致。
500 - 599 服务端异常。
头部字段
头部字段用于描述 请求端的资源请求信息和服务端所能提供的应用服务信息,分为5种类型
通用首部 :服务端和客户端都可以携带,描述一些通用的功能信息
请求首部 :请求端特有的,一般是一些基于自身请求的描述信息
响应首部 :相应端特有的,一般是描述服务端的状态信息和功能信息
实体首部 :用于描述消息体的一些字段,用于描述消息体的文件类型,读取编码格式等
扩展首部 :作用于HTTP协议之上的一些协议自定义字段,用于为功能开发者提供更上层的应用构建
通用首部
1 |
|
请求首部
1 |
|
响应首部
1 |
|
实体首部
1 |
|