老青菜

HTTP/1.0

2019-06-04

HyperText Transfer Protocol 超文本传输协议,基于TCP协议,是最常用的应用层协议之一,
由W3C和IETF共同制定,期间一共经历了4个大版本。

HTTP/0.9

1991年,第一个版本HTTP/0.9发布,设计的最初目的是为了获取html页面,所以这个版本的协议很简单,如下:

GET /http.html

只有一个GET命令,后面跟上请求的资源路径,服务端响应html字符串。响应完成后,TCP连接自动关闭。
由于早期的需求局限性,协议缺点也很明显:

  1. 不支持协议版本号。
  2. 不能设置Header。
  3. 只支持GET。
  4. 响应完成,TCP自动断开,无法复用。

HTTP/1.0

1965年,HTTP/1.0发布,做了很大改动,大致如下:

  1. 修改传输格式,可以传输文件、图片等等数据。
  2. 支持指定版本号。
  3. 支持Header,描述一些基础数据,每次请求和响应都必须携带。
  4. 增加POST、HEAD(HEAD和GET类似,只是响应的时候不会带上资源,用于测试超链接可访问性)。
  5. 新增状态码等等。

格式

HTTP/1.0报文格式如下:

GET /api/user?delay=1 HTTP/1.0\r\n
User-Agent: curl/7.54.0\r\n
Accept: */*\r\n
\r\n

第一行是请求行(Request Line),请求类型+资源路径+协议版本号+回车换行符
第二行开始是头部信息,以空行结束。

缺点

HTTP/1.0的缺点主要有两个:

  1. 不支持Host域,随着虚拟化的技术发展,一台物理机可以虚拟化多个主机,共享一个IP地址。
  2. TCP连接无法复用,每次响应完成都会断开TCP,每次请求都会打开一个TCP连接。

短连接

和HTTP/0.9一样,每次请求都会打开一个TCP连接,每次响应完成都会断开TCP,也就是每次请求都要经历三次握手+慢启动+四次断开。而我们知道一个以太网帧最小是64B=14B(header)+46B(data)+4B(控制位),那么至少需要浪费7*64B。很显然这里还需要优化。

我们可以通过wireshark抓包验证一下,首先连续请求两个接口:

curl --http1.0 www.laoqingcai.com/api/user www.laoqingcai.com/api/user

wireshark增加ip地址过滤条件,查看两次请求的过程。如下图:

不难发现,两次请求都新打开了TCP连接,响应完成后断开了TCP连接。

非标准持久连接

为了解决短连接的问题,很多浏览器都增加了Connection: keep-alive,支持了持久连接。这个字段告诉服务器不要关闭TCP连接,可能被其他请求复用。

我们可以通过wireshark抓包验证效果,首先连续请求两个接口,并设置持久连接:

curl --http1.0 -H "Connection: keep-alive" www.laoqingcai.com/api/user www.laoqingcai.com/api/user

wireshark增加ip地址过滤条件,查看两次请求的过程。如下图:

很清楚的看到,第一次请求没有断开TCP连接,第二次请求复用了TCP连接。

参考链接

HTTP/0.9
HTTP/1.0

Tags: HTTP
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章