这是我参与「第五届青训营 」笔记创作活动的第10天。
前些天把html,css,js前端三件套进行了系统学习,今天主要就HTTP一网络协议进行学习。
HTTP概述
Web的应用层协议是超文本传输协议(Hypertext Transfer Protocol,HTTP),是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。
它是 Web 的核心。HTTP 由两个程序实现:一个客户端程序和一个服务端程序。两个程序运行在不同的端系统中,通过 HTTP 报文进行会话。
它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的 Web 文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。
它定义了 Web 客户向 Web 服务器请求 Web 页面的方式,以及服务器向客户传送 Web 页面的方式。
由像浏览器这样的客户端发出的消息叫做请求(request),被服务端响应的消息叫做响应(response)。
HTTP 使用 TCP 作为它的支撑运输协议(而不是在UDP上运行),或者是 TLS——加密的 TCP 连接来发送,理论上任何可靠的传输协议都可以使用。因为其良好的扩展性,时至今日,它不仅被用来传输超文本文档,还用来传输图片、视频或者向服务器发送如 HTML 表单这样的信息。HTTP 还可以根据网页需求,仅获取部分 Web 文档内容更新网页。
HTTP的组件系统
HTTP协议是一个client-server 协议:请求通过一个实体发出,实体被称为用户代理,其中用户代理可以是浏览器,爬虫等。
每一个发送到服务器的请求,都会被服务器处理并返回一个消息,也就是response。其中,在请求和响应之间还可以有许许多多的代理实体,它们可以是网关,cache等。
客户端 user-agent
user-agent是指能够为用户发起行为的工具(一般由浏览器扮演),浏览器来负责发送 HTTP 请求,并进一步解析 HTTP 返回的消息,以向用户提供明确的响应。
Web服务端
Web Server 来服务并提供客户端所请求的文档。Server只是一个虚拟的概念,它可以是一组服务器组成的计算机集群,可以是一个复杂的软件,也可以是其他的计算机。
Server 不一定是一台机器,但一个机器上可以装载的众多 Servers。
代理 Proxy
在浏览器和服务器之间,有许多计算机和其他设备转发了 HTTP 消息。由于 Web 栈层次结构的原因,它们大多都出现在传输层、网络层和物理层上,对于 HTTP 应用层而言就是透明的,虽然它们可能会对应用层性能有重要影响。还有一部分是表现在应用层上的,被称为代理(Proxy)。
代理的作用:
- 缓存
- 过滤
- 负载均衡
- 认证
- 日志记录
HTTP的基本性质
- HTTP是简单的。HTTP 报文能够被人读懂,还允许简单测试,降低了门槛,对新人很友好。
- HTTP是可扩展的。对于 HTTP 标头(header) 而言,只要服务端和客户端就新标头达成语义一致,新功能就可以被轻松加入进来。
- HTTP是无状态的。HTTP服务器并不保存关于用户的任何信息,在同一个连接中,两个执行成功的请求之间是没有关系的。注意,HTTP 本质是无状态的,使用 Cookie 可以创建有状态的会话。
- 引入了流水线和持续连接的概念。在相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送。HTTP默认使用带流水线的持续连接。
当 HTTP 流水线启动时,后续请求都可以不用等待第一个请求的成功响应就被发送。然而 HTTP 流水线已被证明很难在现有的网络中实现,因为现有网络中有很多老旧的软件与现代版本的软件共存。
非持续连接:每个请求/响应对是经过一个单独的TCP连接发送;
持续连接:所有的请求及其相应经过相同的TCP连接发送。
HTTP流
当客户想要和服务端进行信息交互时(服务端可以是最终服务器,也可以是一个中间代理),具体有以下几步:
- 打开一个 TCP 连接:TCP 连接被用来发送一条或多条请求,以及接受响应消息。客户端可能打开一条新的连接,或重用一个已经存在的连接,或者也可能开几个新的 TCP 连接连向服务端。
- 发送一个 HTTP 报文:HTTP 报文(在 HTTP/2 之前)是语义可读的。在 HTTP/2 中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
- 读取服务端返回的报文信息。
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
- 关闭连接或者为后续请求重用连接。
HTTP报文
有两种 HTTP 报文的类型,请求与响应,每种都有其特定的格式。
请求
HTTP请求报文的第一行叫作请求行,其后继的行叫作首部行。
请求行有三个字段:方法字段,URL字段和HTTP版本字段。
- 一个 HTTP 的请求方法,经常是由一个动词像 GET、POST 或者一个名词像 OPTIONS、HEAD 来定义客户端的动作行为。通常客户端的操作都是获取资源(GET 方法)或者发送 HTML 表单(POST 方法),虽然在一些情况下也会有其他操作。
- 要获取的资源的路径,通常是上下文中就很明显的元素资源的 URL,它没有 protocol(http://),domain(developer.mozilla.org),或是 TCP 的 port (en-US)(HTTP 一般在 80 端口)。
- HTTP 协议版本号。
- 首部行Host:一般用来指明对象所在的主机。
- User-agent:用来指明用户代理,即向服务器发送请求的浏览器类型。
- Accept-language:表示用户想要得到该对象的语言版本。
响应
响应报文有三部分组成:1个初始状态行,6个首部行,实体体。
状态行有3个字段:协议版本字段,状态码和相应状态信息。
- HTTP 协议版本号。
- 一个状态码(状态码(status code)),来告知对应请求执行成功或失败,以及失败的原因。
- 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
- Date:首部行指示服务器产生并发送该响应报文的日期和时间。
- Serve:首部行指示该报文是由一台Apache Web服务器产生的,类似于请求报文中的 User-agent。
- Last-Modified:首部行指示对象创建或者最后修改的时间和日期。
- Content-Length:首部行指示被发送对象中的字节数。
- Content-Type:首部行指示实体体中的对象文本类型。
常见状态码
| 状态码 | 说明 |
|---|---|
| 200 OK | 请求成功,信息在返回的响应报文中 |
| 301 Moved Permanently | 请求的对象已被永久移除,新的URL定义在响应报文中的Location:首部行中。客户软件将自动获取新的URL |
| 400 Bad Request | 一个通用差错码,指示该请求不能被服务器理解 |
| 404 Not Found | 被请求的文档不在服务器上 |
| 505 HTTP Version Not Support | 服务器不支持请求报文使用的HTTP协议版本 |
总结
HTTP 是一种简单可扩展的协议,其 Client-Server 的结构以及轻松扩展标头信息的能力使得 HTTP 可以和 Web 共同发展。