手机版

HTTP协议简介_电源节点Java学院整理

时间:2021-09-04 来源:互联网 编辑:宝哥软件园 浏览:

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

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

一、HTTP/0.9

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

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

GET /index.html

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

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

当htmlbodyHello 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.0 user-agent : Mozilla/5.0(Macintosh;英特尔Mac OSX10_10_5)Accept: */*

如您所见,这种格式与0.9版有很大不同。第一行是请求命令,最后必须加上协议版本(HTTP/1.0)。以下是多行标题信息,描述了客户端的情况。

2.3响应格式

来自服务器的响应如下。

HTTP/

你好世界/身体/html

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

2.4内容类型字段

关于字符编码,1.0版规定头信息必须是ASCII码,其背后的数据可以是任何格式。因此,当服务器响应时,它必须告诉客户端数据是什么格式,这是内容类型字段的功能。以下是一些常见内容类型字段的值。

文本/明文/html text/CSS image/jpegimage/pngimage/SVG xmlaudio/MP4 video/MP4 application/javaapplication/pdfaapplication/zip application/atom XML

这些数据类型称为MIME类型,每个值包括主类型和次类型,用斜杠分隔。除了预定义的类型,制造商还可以自定义类型。application/vnd . debian . binary-package

以上类型表示发送Debian系统的二进制数据包。MIME类型也可以在末尾使用分号来添加参数。内容-Type:文本/html;字符集=utf-8

上述类型表示发送了一个网页,编码为UTF-8。当客户端请求时,它可以使用“接受”字段来声明它可以接受哪些数据格式。Accept: */*

在上面的代码中,客户端声明它可以接受任何格式的数据。MIME类型不仅用于HTTP协议,也用于其他地方,比如HTML网页。

元http-equiv=' Content-Type ' Content=' text/html;charset=UTF-8'/!-等效于-metacarset=' utf-8'/2.5内容编码字段

因为传输的数据可以是任何格式,所以数据可以被压缩然后传输。内容编码字段描述了数据压缩方法。内容-编码: gzipContent-编码:压缩内容-编码:放气

请求时,客户端使用“接受-编码”字段来解释它可以接受哪些压缩方法。接受-编码: gzip,放气

2.6缺点

http/1.0版本的主要缺点是每个TCP连接只能发送一个请求。发送数据后,连接被关闭。如果您想请求其他资源,您必须创建一个新的连接。新的TCP连接成本很高,因为它需要客户端和服务器的三次握手,并且启动速度很慢。因此,http版本的性能相对较差。随着越来越多的外部资源加载到网页上,这个问题变得越来越突出。为了解决这个问题,一些浏览器在发出请求时使用了非标准的连接字段。连接:保持活动状态此字段要求服务器不要关闭TCP连接,以便可以重用其他请求。服务器也响应这个字段。连接:保持活动状态在客户端或服务器主动关闭连接之前,会建立一个可重用的TCP连接。但是,这不是一个标准字段,不同实现的行为可能不一致,所以不是一个根本的解决方案。

三.HTTP/1.1

1997年1月,HTTP/1.1发布,仅比1.0版本晚半年。它进一步完善了已经使用了20年的HTTP协议,至今仍是最流行的版本。

3.1持久连接

1.1版本最大的变化是引入了持久连接,即默认情况下TCP连接不关闭,可以被多个请求重用,无需声明Connection: keep-alive。当客户端和服务器发现彼此在一段时间内处于非活动状态时,它们可以主动关闭连接。但是,标准做法是客户端在最后一次请求时发送Connection: close,明确要求服务器关闭TCP连接。

连接:关闭

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

3.2管道机制

在1.1版本中,还引入了流水线机制,即在同一个TCP连接中,客户端可以同时发送多个请求。这进一步提高了HTTP协议的效率。例如,一个客户端需要请求两个资源。过去在同一个TCP连接中,先发送A请求,然后等待服务器响应,收到后再发送B请求。流水线机制允许浏览器同时发送请求A和请求B,但服务器先响应请求A,再依次响应请求B。

3.3内容-长度字段

一个TCP连接现在可以传输多个响应,所以有必要有一个机制来区分数据包属于哪个响应。这就是内容长度字段的用途,它声明了这个响应的数据长度。Content-Length: 3495上面的代码告诉浏览器这个响应的长度是3495字节,下面的字节属于下一个响应。在1.0版本中,Content-Length字段不是必需的,因为当浏览器发现服务器已经关闭TCP连接时,这意味着接收到的数据包是完整的。

3.4在块传输编码中使用Content-Length字段的前提是服务器在发送响应之前必须知道响应的数据长度。对于一些耗时的动态操作,这意味着服务器在所有操作完成之前无法发送数据,这显然是低效的。更好的处理方法是在数据生成时发送一条数据,用流模式代替缓冲模式。因此,1.1版规定可以使用“分块传输编码”来代替“内容长度”字段。只要请求或响应的报头信息有一个传输编码字段,它就表示响应将由未确定数量的数据块组成。

转移-编码:分块

在每个非空数据块之前,将有一个十六进制值指示该块的长度。最后,大小为0的块表示该响应的数据已经发送。以下是一个例子。HTTP/1.1200 ok content-type : text/plain transfer-encoding : chunked 25第一个chunk1中的数据和第二个chunk1中的数据

3.5其他功能

1.1版本还增加了许多动词方法:PUT、PATCH、HEAD、OPTIONS和DELETE。此外,主机字段会添加到客户端请求的标头信息中,以指定服务器的域名。Host : www.example.com有Host字段,因此可以在同一台服务器上向不同的网站发送请求,这为虚拟主机的兴起奠定了基础。

3.6缺点

虽然1.1版允许多路传输TCP连接,但同一TCP连接中的所有数据通信都是按顺序进行的。在处理完一个响应之前,服务器不会做出下一个响应。如果之前的响应特别慢,就会有很多请求排队等待。这叫做“线头阻断”。为了避免这个问题,只有两种方法:一种是减少请求的数量,另一种是同时打开更多的持久连接。这导致了许多网页优化技术,例如合并脚本和样式表、在CSS代码中嵌入图片、域分割等等。如果HTTP协议设计得更好,就可以避免这种额外的工作。

四.社会民主党协议

2009年,谷歌发布了自己的SPDY协议,主要解决HTTP/1.1的低效问题。该协议在Chrome浏览器上被证明可行后,被视为HTTP/2的基础,其主要特性继承自HTTP/2。

动词(verb的缩写)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_STREAM帧)来取消数据流。在1.1版本中取消数据流的唯一方法是关闭TCP连接。也就是说,HTTP/2可以取消某个请求,并确保TCP连接仍然打开,可以被其他请求使用。客户端还可以指定数据流的优先级。优先级越高,服务器响应越快。

5.4报头信息压缩

HTTP协议没有状态,每个请求都必须附带所有信息。因此,请求的许多字段都是重复的,例如Cookie和User Agent,它们具有相同的内容,并且必须附加到每个请求中,这浪费了大量带宽并影响了速度。

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

5.5服务器推送

HTTP/2允许服务器主动向客户端发送资源而无需请求,这称为服务器推送。

一个常见的场景是客户端请求一个包含许多静态资源的网页。正常情况下,客户端收到网页后,必须解析HTML源代码,找到静态资源,然后发出静态资源请求。事实上,服务器可以预期在客户端请求网页后,它很可能会再次请求静态资源,因此它会主动将这些静态资源与网页一起发送给客户端。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:HTTP协议简介_电源节点Java学院整理是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。