HTTP学习(一) HTTP基本知识

本文深入剖析HTTP协议的基础知识,包括客户端与服务器的工作原理、资源标识、请求与响应过程、方法及状态码等内容。同时介绍了不同HTTP版本的特点及网络通信流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTTP作为现在非常重要的协议,需要仔细梳理一下。本次学习知识点来自于《HTTP权威指南》,只是文中知识点罗列,算是读书笔记,请有兴趣的读者购买《HTTP权威指南》完整阅读。

一、HTTP 基本知识

1、HTTP——因特网的多媒体信使

每天, 都有数以亿万计的 JPEG 图片、 HTML 页面、 文本文件、 MPEG 电影、 WAV音频文件、 Java 小程序和其他资源在因特网上游弋。 HTTP 可以从遍布全世界的Web 服务器上将这些信息块迅速、 便捷、 可靠地搬移到人们桌面上的 Web 浏览器上去。 

2、Web客户端和服务器

Web 内容都是存储在 Web 服务器上的。 Web 服务器所使用的是 HTTP 协议, 因此经常会被称为 HTTP 服务器。 这些 HTTP 服务器存储了因特网中的数据, 如果HTTP 客户端发出请求的话, 它们会提供数据。 客户端向服务器发送 HTTP 请求,服务器会在 HTTP 响应中回送所请求的数据


3、web资源

所有能web服务提供的内容,都可以认为是web资源。Web 传输的对象都打上了名为 MIME 类型(MIME type) 的数据格式标签。 最初设计 MIME(Multipurpose Internet Mail Extension, 多用途因特网邮件扩展) 是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。 MIME 在电子邮件系统中工作得非常好, 因此 HTTP 也采纳了它, 用它来描述并标记多媒体内容。

MIME 类型是一种文本标记, 表示一种主要的对象类型和一个特定的子类型, 中间
由一条斜杠来分隔。
• HTML 格式的文本文档由 text/html 类型来标记。
普通的 ASCII 文本文档由 text/plain 类型来标记。
• JPEG 版本的图片为 image/jpeg 类型。
• GIF 格式的图片为 image/gif 类型。
• Apple QuickTime 电影为 video/quicktime 类型。
微软的 PowerPoint 演示文件为 application/vnd.ms-powerpoint 类型。

4、URI、URL、URN

服务器资源名被称为统一资源标识符Uniform Resource IdentifierURI 

统一资源定位符URL) 是资源标识符最常见的形式。 URL 描述了一台特定服务器上某资源的特定位置。 


URI 的第二种形式就是统一资源名URN)。 URN 是作为特定内容的唯一名称使用的, 与目前的资源所在地无关 。 举例:urn:ietf:rfc:2141

5、事务

一个 HTTP 事务由一条(从客户端发往服务器的) 请求命令和一个(从服务器发回客户端的) 响应结果组成 

6、方法

HTTP 支持几种不同的请求命令, 这些命令被称为 HTTP 方法HTTP method)。
     HTTP方法           |         描  述
          GET               |     从服务器向客户端发送命名资源
          PUT               |     将来自客户端的数据存储到一个命名的服务器资源中去
       DELETE           |     从服务器中删除命名资源
         POST             |     将客户端数据发送到一个服务器网关应用程序
           HEAD           |     仅发送命名资源响应中的 HTTP 首部 

7、状态码

每条 HTTP 响应报文返回时都会携带一个状态码。 状态码是一个三位数字的代码。如:200,403,404,503

8、报文

HTTP 报文是由一行一行的简单字符串组成的。 HTTP 报文都是纯文本 。HTTP 报文包括以下三个部分。
起始行
报文的第一行就是起始行, 在请求报文中用来说明要做些什么, 在响应报文中说明出现了什么情况。
首部字段
起始行后面有零个或多个首部字段。 每个首部字段都包含一个名字和一个值, 为了便于解析, 两者之间用冒号(:) 来分隔。 首部以一个空行结束。 添加一个首部字段和添加新行一样简单。
主体
空行之后就是可选的报文主体了, 其中包含了所有类型的数据。 请求主体中包括了要发送给 Web 服务器的数据; 响应主体中装载了要返回给客户端的数据。 起始行和首部都是文本形式且都是结构化的, 而主体则不同, 主体中可以包含任意的二进制数据(比如图片、 视频、 音轨、 软件程序)。 当然, 主体中也可以包含文本。
报文举例:


9、连接

HTTP 是个应用层协议。 HTTP 无需操心网络通信的具体细节; 它把联网的细节都交给了通用、 可靠的因特网传输协议 TCP/IP 。 HTTP协议栈如下

 一个HTTP事物的例子:


步骤如下:
(a) 浏览器从 URL 中解析出服务器的主机名;
(b) 浏览器将服务器的主机名转换成服务器的 IP 地址;
(c) 浏览器将端口号(如果有的话) 从 URL 中解析出来;
(d) 浏览器建立一条与 Web 服务器的 TCP 连接;
(e) 浏览器向服务器发送一条 HTTP 请求报文;
(f) 服务器向浏览器回送一条 HTTP 响应报文;
(g) 关闭连接, 浏览器显示文档

10. HTTP 版本

HTTP/1.0
1.0
是第一个得到广泛使用的 HTTP 版本。 HTTP/1.0 添加了版本号、 各种 HTTP首部、 一些额外的方法, 以及对多媒体对象的处理。 HTTP/1.0 使得包含生动图
片的
Web 页面和交互式表格成为可能, 而这些页面和表格促使万维网为人们广泛地接受。 这个规范从未得到良好地说明。 在这个 HTTP 协议的商业演进和学术
研究都在快速进行的时代, 它集合了一系列的最佳实践。
 
HTTP/1.1
HTTP/1.1
重点关注的是校正 HTTP 设计中的结构性缺陷, 明确语义, 引入重要的性能优化措施, 并删除一些不好的特性。 HTTP/1.1 还包含了对 20 世纪 90
代末正在发展中的更复杂的
Web 应用程序和部署方式的支持。 HTTP/1.1 是当前使用的 HTTP 版本。
• HTTP-NG(又名 HTTP/2.0
HTTP-NG HTTP/1.1 后继结构的原型建议, 它重点关注的是性能的大幅优化,以及更强大的服务逻辑远程执行框架。 HTTP-NG 的研究工作终止于 1998 年, 编
写本书时, 还没有任何要用此建议取代
HTTP/1.1 的推广计划。 

11、web服务上的几个重要组件

代理
位于客户端和服务器之间的 HTTP 中间实体。
缓存
HTTP 的仓库, 使常用页面的副本可以保存在离客户端更近的地方。
网关
连接其他应用程序的特殊 Web 服务器。
隧道
HTTP 通信报文进行盲转发的特殊代理。
• Agent 代理
发起自动 HTTP 请求的半智能 Web 客户端


HTTP 隧道的一种常见用途是通过 HTTP 连接承载加密的安全套接字层(SSLSecure Sockets Layer) 流量, 这样 SSL 流量就可以穿过只允许 Web 流量通过的防
火墙了。 如图
1-14 所示, HTTP/SSL 隧道收到一条 HTTP 请求, 要求建立一条到目的地址和端口的输出连接, 然后在 HTTP 信道上通过隧道传输加密的 SSL 流量, 这
样就可以将其盲转发到目的服务器上去了。
 

二、URL

web服务的内容,都是被认为是资源,URL可以唯一标识资源
URL 的第一部分(http) 是 URL 方案scheme)。 方案可以告知 Web 客户端怎样访问资源。 在这个例子中, URL 说明要使用 HTTP 协议。• URL 的第二部分(www.joes-hardware.com) 指的是服务器的位置。 这部分告知Web 客户端资源位于何处• URL 的第三部分(/seasonal/index-fall.html) 是资源路径。 路径说明了请求的是服务器上哪个特定的本地资源。
比如:
ftp://prep.ai.mit.edu/pub/gnu;type=d
在这个例子中, 有一个参数 type=d, 参数名为 type, 值为 d
比如:
http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true 

查询字符串

http://www.joes-hardware.com/inventory-check.cgi?item=12731
很多网关都希望查询字符串以一系列“名 / 值” 对的形式出现, 名值对之间用字符“&” 分隔:
http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue
在这个例子中, 查询组件有两个名 / 值对: item=12731 color=blue

其他比较重要的知识点: URL字符集、URL编码、URL字符限制请自行看原文

三、报文

1、报文组成

HTTP报文是简单的格式化普通文本,由三部分组成
它们由三个部分组成: 对报文
进行描述的
起始行start line)、 包含属性的首部header) 块, 以及可选的、 包含
数据的
主体body) 部分 

2、报文语法

这是请求报文的格式:
<method> <request-URL> <version>
<headers>
<entity-body>
这是响应报文的格式(注意, 只有起始行的语法有所不同) :
<version> <status> <reason-phrase>
<headers>
<entity-body>
下面是对各部分的简要描述。
方法(method
客户端希望服务器对资源执行的动作。 是一个单独的词, 比如 GETHEAD POST。 本章稍后将详细介绍方法。
请求URLrequest-URL
命名了所请求资源, 或者 URL 路径组件的完整 URL。 如果直接与服务器进行对话, 只要 URL 的路径组件是资源的绝对路径, 通常就不会有什么问题——服务器可以假定自己是 URL 的主机 / 端口。 第 2 章详细地介绍了 URL 的语法。
版本(version
报文所使用的 HTTP 版本, 其格式看起来是这样的:
HTTP/<major>.<minor>
其中主要版本号major) 和次要版本号minor) 都是整数。 
状态码(status-code
这三位数字描述了请求过程中所发生的情况。 每个状态码的第一位数字都用于描述状态的一般类别(“成功”、“出错” 等)。 本章稍后提供了 HTTP 规范定义的状态码及其含义的完整列表。
原因短语(reason-phrase
数字状态码的可读版本, 包含行终止序列之前的所有文本。 本章稍后提供了HTTP 规范定义的所有状态码的原因短语示例。 原因短语只对人类有意义, 因此, 比如说, 尽管响应行 HTTP/1.0 200 NOT OK HTTP/1.0 200 OK 中原因短语的含义不同, 但同样都会被当作成功指示处理
•首部(header
可以有零个或多个首部, 每个首部都包含一个名字, 后面跟着一个冒号(:), 然后是一个可选的空格, 接着是一个值, 最后是一个 CRLF。 首部是由一个空行(CRLF) 结束的, 表示了首部列表的结束和实体主体部分的开始。 有些 HTTP 版本, 比如 HTTP/1.1, 要求有效的请求或响应报文中必须包含特定的首部。
实体的主体部分(entity-body
实体的主体部分包含一个由任意数据组成的数据块。 并不是所有的报文都包含实体的主体部分, 有时, 报文只是以一个 CRLF 结束。 

3、方法


4、状态码



5、首部

首部可以分为以下几类。
通用首部
既可以出现在请求报文中, 也可以出现在响应报文中。
请求首部
提供更多有关请求的信息。
响应首部
提供更多有关响应的信息。
实体首部
描述主体的长度和内容, 或者资源自身。
扩展首部
规范中没有定义的新首部。 

6、首部延续行

举例:
例如:
HTTP/1.0 200 OK
Content-Type: image/gif
Content-Length: 8572
Server: Test Server
Version 1.0
在这个例子中, 响应报文里包含了一个 Server 首部, 其值被划分成了多个延续行。该首部的完整值为 Test Server Version 1.0

7、安全方法

HTTP 定义了一组被称为安全方法的方法。 GET 方法和 HEAD 方法都被认为是安全的, 这就意味着使用 GET HEAD 方法的 HTTP 请求都不会产生什么动作。不产生动作, 在这里意味着 HTTP 请求不会在服务器上产生什么结果。


8、get方法



9、put


10、post



11、首部

通用首部
这些是客户端和服务器都可以使用的通用首部。 可以在客户端、 服务器和其他应用程序之间提供一些非常有用的通用功能。 比如, Date 首部就是一个通用首部,
每一端都可以用它来说明构建报文的时间和日期:
Date: Tue, 3 Oct 1974 02:16:00 GMT
请求首部
从名字中就可以看出, 请求首部是请求报文特有的。 它们为服务器提供了一些额外信息, 比如客户端希望接收什么类型的数据。 例如, 下面的 Accept 首部就用来告知服务器客户端会接受与其请求相符的任意媒体类型:
Accept: */*
响应首部
响应报文有自己的首部集, 以便为客户端提供信息(比如, 客户端在与哪种类型的服务器进行交互)。 例如, 下列 Server 首部就用来告知客户端它在与一个版1.0 Tiki-Hut 服务器进行交互:
Server: Tiki-Hut/1.0
实体首部
实体首部指的是用于应对实体主体部分的首部。 比如, 可以用实体首部来说明实体主体部分的数据类型。 例如, 可以通过下列 Content-Type 首部告知应用程序, 数据是以 iso-latin-1 字符集表示的 HTML 文档:
Content-Type: text/html; charset=iso-latin-1
扩展首部
扩展首部是非标准的首部, 由应用程序开发者创建, 但还未添加到已批准的HTTP 规范中去。 即使不知道这些扩展首部的含义, HTTP 程序也要接受它们并对其进行转发。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值