协议的方式

协议的方式,第1张

HTTP协议入门

HTTP是互联网的基础协议,也是网页开发的必备知识。HTTP/2的最新版本使其成为技术热点。

本文介绍了HTTP协议的历史沿革和设计思想。

一、HTTP/0.9

HTTP是基于TCP/IP协议应用层协议。不涉及包传输,主要是规定客户端和服务器端的通信格式。默认情况下,使用端口80。

最早的版本是1991年发布的0.9版本。这个版本非常简单,只有一个GET命令。

GET /index.html

上面的命令表示TCP连接建立后,客户端向服务器请求网页的index.html。

根据协议,服务器只能响应HTML格式的字符串,不能响应其他格式。

<html> <body>Hello World</body> </html>

当服务器完成发送后,关闭TCP连接。

二、HTTP/1.0 2.1简介

1996年5月,HTTP/1.0版本发布,内容大幅增加。

首先,任何格式的内容都可以发送。这使得互联网不仅可以传输文字,还可以传输图像、视频和二进制文件。这为互联网的大发展奠定了基础。

其次,除GET命令外,还引入了POST命令和HEAD命令,丰富了浏览器与服务器的交互手段。

第三,HTTP请求和响应的格式也发生了变化。除了数据部分之外,每个通信必须包括头部信息(HTTP头部)来描述一些元数据。

的其他新功能包括状态代码、多字符集支持、多部分类型、授权、缓存、内容编码等。

2.2请求格式

下面是1.0版HTTP请求的一个例子。

GET / HTTP/1.0User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)Accept: */*

可以看到,这种格式与0.9版有很大不同。

第一行是请求命令,最后必须加上协议版本(HTTP/1.0)。下面是多行头信息,描述了客户端的情况。

2.3回应格式

服务器的响应如下。

HTTP/1.0 200 OK  Content-Type: text/plainContent-Length: 137582Expires: Thu, 05 Dec 1997 16:00:00 GMTLast-Modified: Wed, 5 August 1996 15:55:28 GMTServer: Apache 0.84 <html> <body>Hello World</body> </html>

响应的格式是“头信息+一空行(\r\n)+数据”。第一行是“协议版本+状态码)+状态描述”。

2.4Content-Type字段

关于字符的编码,1.0版本规定头信息必须是ASCII码,后面的数据可以是任意格式。因此,当服务器响应时,它必须告诉客户端数据是什么格式,这是Content-Type字段的功能。

以下是一些常见内容类型字段的值。

  • 文本/纯文本

  • 文本/html

    text/css

    图像/jpeg

    图像/png

    image/svg+xml

    音频/mp4

    视频/mp4

    应用程序/javascript

    应用程序/pdf

    应用程序/zip

    应用程序/atom+xml

    这些数据类型统称为mimetypes,每个值包括一个一级类型和一个二级类型,用斜杠分隔。

    除了预定义的类型,制造商还可以自定义类型。

    application/vnd.debian.binary-package

    以上类型表示发送Debian系统的二进制数据包。

    MIME类型也可以在末尾使用分号来添加参数。

    Content-Type: text/html; charset=utf-8

    以上类型表示发送网页,编码为UTF-8。

    当请求时,客户端可以使用Accept字段来声明它可以接受哪些数据格式。

    Accept: */*

    在上面的代码中,客户端声明它可以接受任何格式的数据。

    MIME类型不仅在HTTP协议中使用,在其他地方也会用到,比如HTML网页。

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- 等同于 --> <meta charset="utf-8" /> 2.5Content-Encoding字段

    由于要发送的数据可以是任何格式,因此可以压缩然后发送。内容编码字段描述了数据压缩方法。

    Content-Encoding: gzipContent-Encoding: compressContent-Encoding: deflate

    当客户端请求时,使用Accept-Encoding字段来指示它可以接受的压缩方法。

    Accept-Encoding: gzip, deflate 2.6缺点

    HTTP/1.0的主要缺点是每个TCP连接只能发送一个请求。数据发送后,连接将被关闭。如果您想请求其他资源,您必须创建一个新的连接。

    新的TCP连接是昂贵的,因为它需要客户端和服务器的三次握手,并且发送速率是先慢后快。所以HTTP版的性能很差。随着网页上加载的外部资源越来越多,这个问题变得越来越突出。

    为了解决这个问题,一些浏览器在请求时使用非标准的连接字段。

    Connection: keep-alive

    该字段要求服务器不要关闭TCP连接,以便其他请求可以被多路复用。服务器也会对该字段做出响应。

    Connection: keep-alive

    在客户端或服务器主动关闭连接之前,会建立一个可重用的TCP连接。但是,这不是一个标准字段,不同实现的行为可能不一致,所以它不是根本的解决方案。

    三、HTTP/1.1

    1997年1月,HTTP/1.1版本发布,仅比1.0版本晚了半年。它进一步完善了HTTP协议,一直沿用到20年后的今天。直到现在,它仍然是最受欢迎的版本。

    3.1持久连接

    1.1版本最大的变化是引入了持久连接,即TCP连接默认不关闭,无需声明连接即可被多个请求重用:keep-alive。

    当客户端和服务器发现对方在一段时间内不活动时,它们可以主动关闭连接。然而,标准的做法是客户机在最后一次请求时发送Connection:close,明确地要求服务器关闭TCP连接。

    Connection: close

    目前,对于同一个域名,大多数浏览器都允许同时建立六个持久连接。

    3.2管道机制

    1.1版本还引入了流水线机制,即在同一个TCP连接中,客户端可以同时发送多个请求。这进一步提高了HTTP协议的效率。

    例如,客户端需要请求两个资源。以前在同一个TCP连接中,先发送A请求,然后服务器响应,B请求收到后再发送。管道机制允许浏览器同时发出A请求和B请求,但服务器仍然先响应A请求,完成后再响应B请求。

    3.3Content-Length字段

    一个TCP连接现在可以传输多个响应,因此有必要建立一种机制来区分数据包属于哪个响应。这就是Content-length字段的用途,它声明了这个响应的数据长度。

    Content-Length: 3495

    上面的代码告诉浏览器,这个响应的长度是3495字节,后面的字节属于下一个响应。

    在1.0版本中,Content-Length字段不是必需的,因为浏览器发现服务器已经关闭了TCP连接,这意味着所有接收到的数据包都已经收到。

    3.4分块传输编码

    使用Content-Length字段的前提是服务器在发送响应之前必须知道它的数据长度。

    对于一些耗时的动态 *** 作,这意味着服务器要等到所有 *** 作完成后才能发送数据,显然效率很低。比较好的方法是生成一条数据就发送一条,用“流”代替“缓冲”。

    所以1.1版规定可以用“分块传输编码”来代替Content-Length字段。只要请求或响应的头信息有Transfer-Encoding字段,就意味着响应将由数量不确定的数据块组成。

    Transfer-Encoding: chunked

    在每个非空的数据块之前,将有一个十六进制值来指示该数据块的长度。最后一个大小为0的块表示该响应的数据已经发送。下面是一个例子。

    HTTP/1.1 200 OKContent-Type: text/plainTransfer-Encoding: chunked 25 This is the data in the first chunk 1C and this is the second one 3 con 8 sequence 0 3.5其他功能

    1.1版本还增加了很多动词方法:PUT、PATCH、HEAD、OPTIONS、DELETE。

    此外,主机字段被添加到客户端请求的报头信息中,以指定服务器的域名。

    Host: www.example.com

    有了主机字段,可以将请求发送到同一台服务器上的不同网站,为虚拟主机的兴起奠定了基础。

    3.6缺点

    尽管1.1版允许多路传输TCP连接,但同一TCP连接中的所有数据通信都是有序的。只有在服务器处理完一个响应后,它才会做出下一个响应。如果前面响应特别慢,后面会有很多请求在排队。这被称为“行首阻塞”。

    要避免这个问题,只有两个办法:一是减少请求的数量,二是同时打开更多的持久连接。这导致了许多网页优化技术,如合并脚本和样式表、在CSS代码中嵌入图像、域分片等等。如果HTTP协议设计得更好,就可以避免这些额外的工作。

    四、SPDY协议

    2009年Google发布了自己的SPDY协议,主要解决HTTP/1.1效率低的问题。

    该协议在Chrome浏览器中被证明可行后,被视为HTTP/2的基础,其主要特性在HTTP/2中得到继承。

    五、HTTP/2

    2015年,HTTP/2发布。它不叫HTTP/2.0是因为标准委员会不打算发布更多的子版本,下一个新版本将是HTTP/3。

    5.1二进制协议

    HTTP/1.1版本的头信息必须是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2是一个彻底的二进制协议。头信息和数据体都是二进制的,统称为“帧”:头信息帧和数据帧。

    二进制协议的一个优点是可以定义额外的帧。HTTP/2定义了近十种帧,为以后的高级应用打下了良好的基础。如果用文本来实现这个功能,解析数据会很麻烦,而二进制解析就方便多了。

    5.2多工

    HTTP/2复用TCP连接,在一个连接中,客户端和浏览器都可以同时发送多个请求或响应,不需要一一对应的顺序,避免了“队列拥塞”。

    例如,在TCP连接中,服务器接收A请求和B请求,因此它首先响应A请求。结果它发现处理过程非常耗时,就把A请求处理过的部分发送出去,然后响应B请求,处理完之后再把A请求的剩余部分发送出去。

    这种双向实时通信称为多路传输。

    5.3数据流

    因为HTTP/2数据包是无序发送的,所以同一连接中的连续数据包可能属于不同的响应。因此,必须对数据包进行标记,以表明它属于哪个响应。

    HTTP/2将每个请求或响应的所有数据包称为一个流。每个数据流都有一个唯一的编号。发送数据包时,必须标记数据流ID,以区分它属于哪个数据流。另外规定客户端发送的数据流总是奇数id,服务器发送的数据流是偶数id。

    当数据流发送到一半时,客户端和服务器都可以发送一个信号(RST流帧)来取消数据流。在1.1版中取消数据流的唯一方法是关闭TCP连接。也就是说,HTTP/2可以取消某个请求,同时保证TCP连接仍然打开,可以被其他请求使用。

    客户端还可以指定数据流的优先级。优先级越高,服务器响应越早。

    5.4头信息压缩

    HTTP协议没有状态,每个请求都必须附带所有信息。因此,请求的许多字段是重复的,例如Cookie和用户代理。每个请求都必须附加相同的内容,这样会浪费很多带宽,影响速度。

    HTTP/2通过引入头压缩机制优化了这一点。一方面,头信息在发送前经过gzip或compress压缩;另一方面,客户端和服务器同时维护一个头信息表,所有字段都将存储在这个表中,并生成一个索引号。以后不再发送同一个字段,只发送索引号,提高了速度。

    5.5服务器推送

    HTTP/2允许服务器主动向客户端发送资源而不需要请求,这就是所谓的服务器推送。

    常见的场景是客户端请求一个包含许多静态资源的web页面。一般情况下,客户端收到网页后,必须解析HTML源代码,发现有静态资源,然后发出静态 资源请求。实际上,服务器可以预料到客户端在请求网页后很可能会请求静态资源,所以它主动将这些静态资源与网页一起发送给客户端。

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/764273.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-01
    下一篇 2022-05-01

    发表评论

    登录后才能评论

    评论列表(0条)

    保存