网络协议和
Web
接口(一)
HTTP
协议的演化
HTTP
协议是互联网基础中的基础。
HTTP/0.9
1991 年,HTTP
在最开始的 0.9 版就定义了协议最核心的内容。比如:
- 确定了客户端、服务端这种基本结构;
- 使用域名/IP加端口号来确定目标地址的方式;
- 换行符作为基本的分隔符。
它非常简单,如:
GET /target.html
- 不支持请求正文;
- 不支持除了
GET
以外的其他方法; - 不支持头部;
- 没有版本号的显式指定(请求中不带有版本号);
- 整个请求只有一行(
The One-line Protocol
)。
实践工具 telnet
。
# 步骤一:快捷键唤起Windows命令窗口(一)
win + r
# 步骤二:快捷键唤起Windows命令窗口(二)
cmd
# 步骤三:使用telnet建立连接
telnet www.google.com 80
# 步骤四:连接成功后发送请求
GET /
HTTP/1.0
1996 年,HTTP
1.0 版本稳定而成熟,是如今浏览器广泛支持的最低版本 HTTP
协议。
- 引入了返回码;
- 引入了
header
; - 引入了多字符集;
- 支持多行请求。
- 方法支持
GET
、HEAD
、POST
。
# 一份HTTP/1.0的多行请求:request.txt
GET / HTTP/1.0
User-Agent: Mozilla/1.22 (compatible; MSIE 2.0; Windows 3.1)
Accept: text/html
上述代码最后这个空行是必须的:协议规定,无论请求还是响应,在
HTTP
的头部结束后,必须增加一个额外的换行回车。
改变 UA
(User-Agent
)头,可以模拟不同的浏览器。
实践工具 netcat。
# 使用netcat发送请求
netcat www.google.com 80 < ~/path to request.txt
HTTP/1.1
现在最广泛使用的
HTTP
协议。
1999 年,大量提升传输效率的特性被加入(RFC2616):
HTTP
长连接(Connection: Keep-Alive
),打开一次TCP
连接,可以被连续几次报文传输重用;- 分块传输编码(
Transfer-Encoding: chunked
),响应的消息将由若干个块分次传输。以一个长度为 0 的块和一个空行表示传输结束。或 0 之后附加一些额外信息 Trailer;、 - 更全面的方法;
- 更全面的返回码;
- 对指定客户端缓存策略的支持;
- 对
content negotiation
(通过客户端请求的以Accept
开头的头部来告知服务端它能接受的内容类型)的支持。
# 一份HTTP/1.1的长连接请求:request.txt
GET / HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/1.22 (compatible; MSIE 2.0; Windows 3.1)
Connection: keep-alive
Accept: text/html
HTTP/2
在保持兼容性的基础上,包含了如下重要改进:
- 设计了一种机制,允许客户端来选择使用的
HTTP
版本; HTTP
头的压缩;- 多路复用,允许客户端同时在一个连接中同时传输多组请求响应的方法;
- 服务端的
push
机制。
HTTP/3
围绕传输效率这个协议核心来做进一步改进。
查漏补缺
-
手动开启
win10
下telnet
tips
百度 win10 telnet不是内部或外部命令
学习资料
- 一篇系统性介绍HTTP的教程
- 网络的OSI 7层模型[en]
- 网络协议在OSI 7层模型中的对应位置[en]
- RFC文档:HTTP 1.0[en]
- RFC文档:HTTP 1.1[en]
- RFC文档:HTTP 2.0[en]
- HTTP 1.0 到 1.1的9大改进[en]
- HTTP/2系统介绍[en]
参考资料
- [全栈工程师修炼指南]@网络互联的昨天、今天和明天:HTTP协议的演化