本系列翻译自:https://developer.mozilla.org/en-US/docs/Web/HTTP
注:翻译水平有限,翻译水平有限,如果有不理解或者纰漏之处,还请参考火狐原文 :https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview;
HTTP 是一种允许用户获取资源(比如HTML文档)的协议,它是任何web端(基于client-server模式)数据交换基础,这意味着请求由接收者发起,通常是Web浏览器;一个完整的文档是由许多子元素构成的,比如文本,layout布局,图片,视频,脚本等。
客户端和服务器通过交换单个消息(而不是数据流)进行通信。客户机发送消息,通常是Web浏览器来发送,这称为请求,服务器发送响应的消息称为响应。
image.png
HTTP诞生于1990s,它具有可拓展性,是应用层协议并且使用 TCP或者 TLS-encrypted建立TCP连接,由于它的可拓展性,它不仅用于获取超文本文档,还可以获取图像和视频,或将内容发布到服务器,比如HTML表单,HTTP还可以按需更新Web页面。
HTTP的基本构成
HTTP是client-server协议:请求由一个代理发送,比如web浏览器,但也可以是其他的,比如一个可以搜索的机器人,类似爬虫。每个单独的请求都会被发送到服务端,然后服务端处理,返回一个结果,这个就是响应。在这个请求和响应之间,有许多实体,统称为代理,它执行不同的操作并充当网关或缓存,比如:
image.png
在现实中,有许许多多的电脑在处理基于浏览器和服务端直接的请求:许多路由器和猫,感谢网络七层协议,HTTP协议处于顶层的应用层,其他协议层被封装在了HTTP协议之下,尽管对于诊断网络故障是有积极作用的,但是我们这里并不会展开介绍。
Client: the user-agent 客户端
user-agent,即客户端时刻代表着用户的利益,这个角色大多数情况下由web浏览器担任;还有一些是工程师的调试工具,用于开发web应用。
浏览器永远是请求的发起方,它不会是服务端(尽管多年来增加了一些机制来模拟服务器发起的消息),为了展现一个网页,浏览器发送一个最原始的请求来获取HTML文档,然后对其进行解析,当然还会继续发送额外的请求来完善网页,如css,脚本等静态资源,最终呈现出一个完整的网页。一个web页面是一个超文本文档,这意味着里面可能会包含其他链接,这些链接可能会导致重定向或者页面跳转。
The Web server 服务端
与客户端对应的一端是服务端,服务端是为客户端而服务的,比如响应一个文档。事实上服务端只有一个,它是一些子服务的集合,利用负载均衡等策略形成一个系统。一个服务不一定只是一个主机,它可能是由若干个服务器组成的,通过HTTP/1.1和请求头交流,甚至共用同一个ip地址。
Proxies 代理
在浏览器和服务端之间有大量的主机中继HTTP消息,由于web协议的结构,这些代理会对性能产生重大影响,它们发挥着许多作用:
- 缓存
- 过滤
- 负载均衡
- 日志
HTTP协议的基本面
1.HTTP 是简单的
尽管HTTP/2中引入了跟多的复杂的内容,但是HTTP协议是易于理解的和可读的;
2.HTTP 是易拓展的
HTTP header头在HTTP/1.0中已经引入,请求头使得这个协议更加容易拓展,客户端和服务端之间如果添加一个新功能甚至可以通过header头引入。
3.HTTP 是无状态的,但不是非会话
对于两个被执行成功的请求来说,它们直接是没有任何联系的;那么问题就来了,假如一个用户正尝试与某个页面交互,比如使用电子商务网站的购物车,由于HTTP本身是无状态的,所以HTTP cookie就登场了,cookie可以作为有状态的会话,配合header头可以达到这一目的,使用session使得每个http请求可以共享同一个上下文或者状态类型的数据。
4.HTTP 和连接
请求连接在传输层进行控制,所以根本超出了HTTP协议的范围。HTTP协议不要求传输层作为连接基础是必须的,它是可靠的即可,或者不会丢失消息也行。作为最常用的两种传输层协议,TCP是可靠的,而UDP则不是。HTTP依赖于TCP标准,这是基于连接的,尽管并不总是需要连接;HTTP/1.0为每个请求/响应都建立了一个连接,但有两个缺陷:打开一个连接需要三次握手所以导致变慢,但是当多个消息被发送时效率将会更高,并且热连接比冷连接更高效。
为了解决这些缺陷,HTTP/1.1引入了流水线并且实现了持久连接:底层的TCP连接可以使用Connection
header头来控制,HTTP/2则更进一步,可以在单个连接上重复发送消息,使得传输效率变得更高。让传输层协议更加适用于HTTP协议的实验仍然在推进中,比如谷歌的QUIC计划,它将使得UPD在传输层变得更加可靠。
HTTP可以控制什么
随着时间的推移,HTTP的这种可扩展性允许Web的更多控制。缓存或者鉴权被纳入到了HTTP中;
下面是HTTP可控制的范围:
Cache
如何缓存是可以被HTTP协议所控制的。服务端可以指定代理或者客户端缓存什么,以及缓存多久,客户端则可以指定代理忽略哪些缓存。
Relaxing the origin constraint
为了防止隐私泄露,web浏览器有很严格的隔离机制,尽管这样的约束对于服务端来说是一种负担,但是HTTP请求头则可以在服务端放开这种严格的约束,使得文档资源可以从不同的域名下拼凑起来。
Authentication
一些网页只能让指定的用户查看,所以HTTP提供了基础认证,或者使用WWW-Authenticate
,或者是类似的请求头,或者使用特殊的HTTP cookies;
Proxy and tunneling
服务端或客户端经常被保护在内部网络中并且隐藏真实的ip地址;HTTP请求往往是通过代理越过这层障碍从而得到访问。不是所有的代理都是HTTP代理,如,SOCKS协议往往在较低的级别工作,或者如FTP协议,可以直接处理这些代理。
Sessions
使用HTTP cookies可以让你你将请求和服务端联系起来,这需要创建session,即会话,尽管HTTP是一个无状态的请求;
HTTP flow(工作流程)
当客户端想访问服务端时,无论是终极服务端还是中间代理,都必须经过以下几步:
- 打开TCP连接:TCP连接用于发送一个或几个请求并且收取响应。客户端可能会打开一个新连接,则会重复使用已存在的连接或者重新打开新连接。
-
- 发送HTTP消息请求:HTTP 消息是可阅读的;在HTTP/2中,这些易读的消息被封装起来了,使得它们不可以被直接阅读,但是可读性(
human-readable
)原则是没有改变的。如下:
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr - 发送HTTP消息请求:HTTP 消息是可阅读的;在HTTP/2中,这些易读的消息被封装起来了,使得它们不可以被直接阅读,但是可读性(
-
3.读取服务端的响应消息
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/2将会舍弃这种管道机制,使得请求更加稳健;
HTTP 消息
HTTP/1.1 和更早的HTTP 消息是可阅读的,而在HTTP/2中,这些消息已经纳入到了二进制结构中,使得消息头被压缩或者复用。对于请求和响应都有其自己的消息格式:
Requests
image.png请求头包含这些元素:
-
Method: 请求方法(HTTP method),通常有这么几种类型:
GET
,POST
,OPTIONS
,HEAD
,定义了客户端想进行哪种操作,假如用户想要获取信息则使用GET请求,假如用户想要提交表单信息,则使用POST请求; -
Path:请求路径,反映了资源,请求端口,域名信息;
-
version of the HTTP protocol:请求版本;
-
Headers:可选的请求头传达了一些发送给服务端的信息;
-
或一个消息体,对于像POST这样的方法,类似于响应中包含资源的方法。
Responses
image.png请求头包含一下元素:
- version of the HTTP protocol:协议版本
- Status Code:响应码,表示请求是否成功处理等。
- Status Message:响应码说明
- HTTP headers,类似于请求头
Conclusion
HTTP是一个可拓展的协议,使用客户端-服务端模式,结合了请求头。虽然HTTP / 2增加了一些复杂性,通过在帧中嵌入HTTP消息来提高性能,但是HTTP / 1的基本结构保持不变。会话流仍然很简单,允许它进行调查,并通过一个简单的HTTP消息监视器( HTTP message monitor)进行调试。
网友评论