【大学帮源码】【按键操作源码】【sourcemap看源码】spdy协议源码

来源:c 排课软件源码

1.SPDY协议的特点
2.HTTP/3 竟然基于 UDP,协议HTTP 协议这些年都经历了啥?
3.HTTP 2.0的协议内容
4.安卓逆向解决淘系App 天猫 陶特等抓包问题
5.http1、http1.1和http2的区别

spdy协议源码

SPDY协议的特点

       SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级,以及HTTP包头压缩。谷歌已经开发一个网络服务器原型机,以及支持SPDY协议的Chrome浏览器版本。  根据谷歌发布的SPDY白皮书,该项目的目标是将页面加载时间减少%,最小化配置复杂度,并避免网站所有者对网站进行的调整影响SPDY。谷歌希望将所有的工作转移至用户端和网络服务器中。通过引入SPDY,谷歌还希望在一个TCP会话中支持多个并发的HTTP请求,并使SLL成为标准的传输协议。  业内人士认为,提升网络速度和安全性符合谷歌的利益。谷歌当初推出Chrome浏览器的目的就在于让所有开发者关注网络速度。相比Chrome,SPDY是一个更雄伟的目标。通过SPDY,谷歌希望对互联网最基础的协议之一进行改变。

HTTP/3 竟然基于 UDP,源码HTTP 协议这些年都经历了啥?

       HTTP 协议从第一代到第三代,协议经历了从 HTTP/1 到 HTTP/2 的源码发展,再到现在的协议 HTTP/3。本文将简要介绍 HTTP 协议的源码大学帮源码技术发展过程,并解释为什么最终 HTTP/3 基于 UDP 而不是协议 TCP。从 HTTP/1 的源码局限性开始,到 SPDY 协议的协议引入,再到 HTTP/2 的源码诞生,以及最后 HTTP/3 如何解决 HTTP/2 的协议问题,本文将逐步深入,源码让读者理解这一过程。协议

       HTTP/1 在 Web 时代迅速崛起,源码但随着采用量的协议增加,其缺陷逐渐显现。主要存在几个方面的问题,如请求挂起等待域名链接数限制,以及高延迟和带宽浪费。按键操作源码为解决这些问题,谷歌于 年公开了 SPDY 协议,它对 HTTP/1 进行了优化,包括延迟降低、header 压缩等改进,最终带来了 HTTP/2 的诞生。

       HTTP/2 是基于 SPDY 协议的改进,专注于性能优化,主要目标是sourcemap看源码通过单个连接传输所有请求数据。它采用二进制传输,减少数据传输的开销,并引入多路复用技术,解决了 HTTP/1 的请求限制问题。在 HTTP/2 中,通过使用二进制分帧,HTTP/2 不再依赖 TCP 连接实现多流并行,从而提高了性能。

       为了进一步解决 TCP 协议带来的java源码treeset丢包问题,Google 开发了 QUIC 协议,并将其应用于 HTTP/3。QUIC 协议基于 UDP,通过实现 0RTT 安全握手、原生多路复用、前向纠错等特性,为 HTTP/3 提供了高性能和高安全性的基础。此外,QUIC 的c 字典源码 ID 识别机制使其在移动端表现更好,具有更强的鲁棒性和适应性。

       总的来说,HTTP 协议从第一代到第三代的发展,是在不断探索和优化的过程中实现的。HTTP/3 基于 UDP 的设计,展示了在特定场景下,即使 UDP 被认为不适合用于承载上层协议,通过引入适当的机制和改进,仍能实现高性能和高安全性的网络通信。这一过程体现了技术演进的灵活性和创新性。

HTTP 2.0的协议内容

        异步连接多路复用;

       å¤´éƒ¨åŽ‹ç¼©ï¼›

       è¯·æ±‚/响应管线化;

       ä¿æŒä¸ŽHTTP 1.1语义的向后兼容性也是该版本的一个关键目标。SPDY是一种HTTP兼容协议,由Google发起,Chrome、Opera、Firefox以及Amazon Silk等浏览器均已提供支持。HTTP实现的瓶颈之一是其并发要依赖于多重连接。HTTP管线化技术可以缓解这个问题,但也只能做到部分多路复用。此外,已经证实,由于存在中间干扰,浏览器无法采用管线化技术。SPDY在单个连接之上增加了一个帧层,用以多路复用多个并发流。帧层针对HTTP类的请求响应流进行了优化,因此运行在HTTP之上的应用,对应用开发者而言只要很小的修改甚至无需修改就可以运行在SPDY之上。SPDY对当前的HTTP协议有4个改进:

       å¤šè·¯å¤ç”¨è¯·æ±‚ï¼›

       å¯¹è¯·æ±‚划分优先级;

       åŽ‹ç¼©HTTP头;

       æœåŠ¡å™¨æŽ¨é€æµï¼ˆå³Server Push技术);

       SPDY试图保留HTTP的现有语义,所以cookies、ETags等特性都是可用的。 节选:

       1。超文本传输协议(HTTP)是一个非常成功的协议。 然而,HTTP/1.1消息格式是实施简单性和可访问性的优化,而不是应用程序的性能。 因此它具有对应用程序的性能产生负面影响总体几个特点。

       ç‰¹åˆ«æ˜¯ï¼ŒHTTP/1.0只允许一个请求显眼每次一个给定的连接上。 HTTP/1.1流水线只能部分地解决了并发的请求,并从线头的阻塞受到影响。 因此,需要进行多次请求客户端通常使用多个连接到服务器,以减少等待时间。

       æ­¤å¤–,HTTP/1.1的报头字段经常重复和冗长,其中,除了产生更多或更大的网络数据包,可能会导致小的初始TCP拥塞窗口来快速填充。 这可能会导致过度的延迟,当多个请求在一个新的TCP连接进行。

       è¯¥æ–‡é€šè¿‡å®šä¹‰ä¸€ä¸ªåŸºç¡€è¿žæŽ¥çš„HTTP的语义优化的映射来解决这些问题。 具体地,它允许对请求和响应消息交织在同一连接上,并使用高效率的编码的HTTP报头字段。 它还允许请求的优先级,让更多的重要的要求更快速的完成,进一步提高了性能。

       æ‰€å¾—到的协议被设计为更友好的网络,因为较少的TCP连接都可以使用,在比较HTTP/1.x。 这意味着与其他流和长寿命的连接,而这又导致了更有效地利用可用的网络容量竞争少。

       æœ€åŽï¼Œè¿™ç§å°è£…也可以通过使用二进制消息取景使信息更具扩展性的处理。

       1.1文件组织:

       åœ¨HTTP/2.0规范被分成三个部分:开始HTTP/2.0( 第3节 ),它涵盖了如何一个HTTP/2.0连接启动;成帧层( 第4节 ),其中复用单一的TCP连接成各个独立的帧类别,以及一个HTTP层( 第8节 ),它指定了表达机制使用成帧层的HTTP交互。 虽然一些成帧层概念是从HTTP的隔离,建立一个通用成帧层一直没有一个目标。 成帧层是针对HTTP协议和服务器推送的需求。

       1.2约定和术语:

       ä¸­çš„关键字“必须”,“必须不”,“要求”,“应”,“不应”,“应该”,“不应该”,“建议”,“或许”,该文件中“可选”如中解释RFC [RFC]。

       æ‰€æœ‰æ•°å€¼éƒ½æ˜¯ä»¥ç½‘络字节顺序。 值是无符号,除非另有说明。 提供在十进制或十六进制文该值(如适用)。 十六进制文字的前缀为0X从十进制文本区分开来。

       æœ¯è¯­ï¼š

       å®¢æˆ·ç«¯ï¼šç«¯ç‚¹å‘èµ·HTTP连接。

       è¿žæŽ¥ï¼šä¸¤ä¸ªç«¯ç‚¹ä¹‹é—´ä¼ è¾“级连接。

       è¿žæŽ¥é”™è¯¯ï¼šå¯¹HTTP/2.0的连接错误。

       ç«¯ç‚¹ï¼šè¿žæŽ¥çš„客户端或服务器。

       æ¡†æž¶ï¼šé€šä¿¡çš„HTTP/2.0连接中的最小单元,包括根据帧类型结构的字节的报头和可变长度的序列。

       åŒè¡Œï¼šä¸€ä¸ªç«¯ç‚¹ã€‚ 当讨论一个特定的端点,“对等”指的是遥控器来讨论的首要议题端点。

       æŽ¥æ”¶å™¨ï¼šæ­£åœ¨æŽ¥æ”¶å¸§çš„端点。

       å‘件人:被发送的帧的端点。

       æœåŠ¡å™¨ï¼šç«¯ç‚¹è€Œæ²¡æœ‰ä¸»åŠ¨çš„HTTP连接。

       æµï¼šå¸§åœ¨è·¨è¶Šä¸€ä¸ªè™šæ‹Ÿé€šé“的双向流动的HTTP/2.0连接内。

       æµé”™è¯¯ï¼šä¸ªåˆ«HTTP/2.0流中的一个错误。

       2, HTTP/2.0协议介绍:

       HTTP/2.0提供的HTTP语义优化的运输。

       ä¸€ä¸ªHTTP/2.0连接通过一个TCP连接(上面运行的应用程序级协议[TCP] )。 客户端是TCP连接发起者。

       è¯¥æ–‡æ¡£æè¿°äº†ä½¿ç”¨ç”±ä¸‰ä¸ªéƒ¨åˆ†ç»„成的逻辑结构的HTTP/2.0协议:成帧,溪流,和应用程序映射。 这种结构提供了主要作为一种辅助手段,规范,实现可以自由从该结构发散是必要的。

       2.1的HTTP框架:HTTP/2.0提供HTTP语义的有效序列化。 HTTP请求和响应编码为长度前缀的帧(见第4.1节 )。

       HTTP标头字段被压缩成一系列包含头块碎片帧(参见4.3节 )。

       2.2 HTTP复用:HTTP/2.0提供了在单个连接上复用HTTP请求和响应的能力。 多个请求或响应可以同时在一个连接上使用流(发送第5节 )。 为了保持独立的流,流控制和优先级是必要的。

       2.3的HTTP语义:HTTP/2.0定义HTTP请求和响应如何映射到流(参见8.1节 ),并引入了新的互动模式,服务器推送(第8.2节 )。

       3, 启动HTTP/2.0:HTTP/2.0使用相同的“ment.1 :编者注:请移除本节之前,这份文件的最终版该发布的其余部分]

       æœ€åŽï¼Œå…¬å¸ƒçš„RFC只有实现可以认同自己是“HTTP/2.0”。

       å®žæ–½ä¾‹å’Œæ–‡æœ¬è´¯ç©¿è¯¥æ–‡æ¡£çš„其余部分使用“HTTP/2.0”作为唯一的编辑便利的问题。 草稿版本的实现必须不识别使用这个字符串。 唯一的例外规则是包含在连接头中的字符串建立HTTP/2.0连接后,立即通过客户端发送的(参见3.5节 );的八位这个固定长度的序列不发生变化。

       ç‰ˆæœ¬çš„协议草案的实现必须字符串“ - 草稿”和相应的草案号码添加到标识符分隔符之前('/')。 例如,草案,IETF-httpbis-http2-使用的是字符串“HTTP-draft-/2.0”标识。

       è¿™æ˜¯åŸºäºŽè¿™äº›ç‰ˆæœ¬çš„草案不兼容的实验,而不是必须用不同的标识符替换字符串“草案”。 例如,一个实验实施分组基于心情的编码基于草案-IETF-httpbis-http2-可能将自身标识为“HTTP-emo-/2.0”。请注意,任何标签必须符合所定义的“令牌”语法第3.2.6节的[HTTP-P1] 。

       3.2 启动HTTP/2.0为“http”的URI:如果客户端发出请求到一个“http”的URI,没有关于对HTTP/2.0的支持先验知识使用HTTP升级机制(第6.7节的[HTTP-P1] )。 客户端发出,其中包括一个Upgrade头域识别HTTP/2.0 HTTP/1.1请求。 在HTTP/1.1请求必须包含正好一个HTTP2 -设置( 第3.2.1节 )头字段。

       ä¾‹å¦‚:GET / default.htm的HTTP/1.1

       è¿žæŽ¥æ–¹å¼ï¼šå‡çº§ï¼ŒHTTP2 - 设置

       å‡çº§ï¼šHTTP/2.0

       HTTP2-设置:HTTP/2.0设置的<baseurl编码payload>

       åŒ…含一个实体正文的请求必须在其全部被发送之前,客户端可以发送HTTP/2.0帧。 这意味着大量请求实体可以阻止使用的连接,直到它被完全发送。

       å¦‚果有后续请求的初始请求的并发性是很重要的,一个小小的请求可以被用来执行升级到HTTP/2.0,需支付额外的往返费用。

       ä¸æ”¯æŒHTTP/2.0的服务器可以响应请求,就好像Upgrade头域缺席:

       HTTP/1.1 OK

       å†…容长度:

       Content-Type:text / html类型

       æ”¯æŒHTTP/2.0的服务器可以接受一个(切换协议)响应升级。 因此终止了响应的空行后,服务器就可以开始发送HTTP/2.0帧。 这些框架必须包括发起升级请求的响应。

       HTTP/1.1 交换协议

       è¿žæŽ¥æ–¹å¼ï¼šå‡çº§

       å‡çº§ï¼šHTTP/2.0

       [HTTP/2.0连接...

       ç”±æœåŠ¡å™¨å‘送的第一个HTTP/2.0帧是一个设置框( 6.5节 )。 在收到响应,客户端发送一个连接头( 3.5节 ),其中包括一个设置框。

       åœ¨å‡çº§ä¹‹å‰ï¼Œå‘送的HTTP/1.1请求分配流标识符1并分配尽可能高的优先级。 流1半隐式从封闭向服务器的客户端,因为该请求被完成HTTP/1.1请求。 起的HTTP/2.0连接后,流1被用于反应。

       3.2.1 HTTP2 -设置头字段:即从升级到HTTP/1.1 HTTP/2.0请求必须完全包括一个HTTP2,设置头字段。 该HTTP2 -设置标头栏位是包括设置支配的HTTP/2.0连接,由于预期该服务器接收到升级的要求提供逐跳头字段。 服务器必须拒绝尝试升级,如果这个头域不存在。

       HTTP2 -设置= token

       è¯¥HTTP2-设置标头字段的内容是一个有效载荷设置帧( 第6.5节 ),编码为baseurl字符串(即,在所描述的URL和文件名安全Base编码第5节的[RFC] ,与任何尾随'='字符省略)。 该ABNF[RFC]生产token是定义在2.1节的[HTTP-P7] 。

       å®¢æˆ·ç«¯å¿…须包含值以下设置( 第6.5.1节 ):

       SETTINGS_MAX_CONCURRENT_STREAMS

       SETTINGS_INITIAL_WINDOW_SIZE作为一个逐跳头域, 连接头域必须包括HTTP2 -设置的值除了升级到HTTP/2.0何时升级 。

       æœåŠ¡å™¨è§£ç å’Œè§£é‡Šè¿™äº›å€¼ï¼Œå› ä¸ºå®ƒä¼šä»»ä½•å…¶ä»–设置框。 在升级要求提供这些值确保协议不需要进行上述设置的默认值,并给出了一个客户端一个机会,之前接受任何帧从服务器提供的其他设置。

       3.3 启动HTTP/2.0为“https”开头的URI:

       å¦‚果客户端发出请求到一个“https”开头的URI没有关于对HTTP/2.0的支持先验知识采用TLS [TLS]与应用层协议协商的扩展 [TLSALPN]。

       ä¸€æ—¦TLS协商完成后,客户端和服务器发送一个连接头( 3.5节 )。

       3.4 开始HTTP/2.0与前置知识:

       å®¢æˆ·ç«¯å¯ä»¥çŸ¥é“某个特定的服务器通过其他方式支持HTTP/2.0。 客户端可以立即发送HTTP/2.0帧至已知支持HTTP/2.0服务器,连接头(后第3.5节 )。 这既影响了“http”的URI的分辨率;支持HTTP/2.0的服务器都必须支持的协议谈判中的TLS [TLSALPN]为“https”开头的URI。

       å¯¹äºŽHTTP/2.0的支持之前是不是一个强烈的信号,一个给定的服务器将支持HTTP/2.0为将来的连接。这是可能的服务器的配置来改变或配置,以在群集的服务器实例之间的差异。 拦截代理(又名“透明”的代理)是变化的另一个来源。

       3.5 HTTP/2.0连接接头:当建立一个TCP连接和决心HTTP/2.0将使用两个对等的,每个端点必须发送一个连接头为最终确认,并建立了HTTP/2.0连接的初始设置。

       å®¢æˆ·ç«¯è¿žæŽ¥å¤´å¼€å§‹çš„个字节,这在十六进制表示法是一个序列:

       afed0a0d0ad0d0a0d0a

       ï¼ˆå­—符串PRI * HTTP/2.0 \ r \n \ r \ NSM \ r \ n \ r \ n)的 。 该序列后跟一个设置框(6.5节 )。 客户端立即收到的切换响应协议(表示成功升级),或作为一个TLS连接的第一个应用程序数据八位位组发送客户端的连接头。 如果开始对协议的服务器支持先验知识的HTTP/2.0连接,客户端连接头在连接建立发送。

       Â·å®¢æˆ·ç«¯è¿žæŽ¥å¤´æ˜¯è¿™æ ·é€‰æ‹©çš„HTTP/1.1或HTTP/1.0服务器和中介机构的很大比例并不试图进一步处理框架。 请注意,这并不解决所关注的问题 。

       æœåŠ¡å™¨è¿žæŽ¥å¤´åªåŒ…含一个的设置框( 6.5节 ),必须在服务器发来的HTTP/2.0连接的第一帧。

       ä¸ºäº†é¿å…ä¸å¿…要的等待时间,允许客户端发送客户端的连接头,无需等待接收服务器的连接头之后立即发送额外的帧到服务器。 但是要注意,该服务器连接头是很重要的设置框架可能包括参数必然改变了客户端如何有望与服务器进行通信。 在收到设置框,在客户端有望兑现建立的任何参数。

       å®¢æˆ·ç«¯å’ŒæœåŠ¡å™¨å¿…须终止TCP连接,如果不是同行不以一个有效的连接头。 一个GOAWAY框架( 第6.8节 ,如果它是明确表示,对不使用HTTP/2.0)可以省略。

       4, HTTP框架:

       ä¸€æ—¦HTTP/2.0建立连接,端点就可以开始交换帧。

       4.1 帧格式:所有的框架开始一个8字节的头,紧跟着的0和.个八位位组之间的有效载荷。

       å¯¹äºŽä¿ç•™çš„2位字段。 这些位的语义是不确定的和发送时该位必须保持未设置(0)和接收时必须被忽略。

       é•¿åº¦ï¼šå¸§æœ‰æ•ˆè½½è·çš„长度表示为一个无符号位整数。 的8个字节的帧头中不包含这个值。

       ç±»åž‹ï¼š8位类型的框架。 帧类型决定了帧头和有效载荷的其余部分被解释。 实现必须忽略不受支持或无法识别类型的帧。

       æ ‡å¿—:一个8位字段保留帧类型特定的布尔标志。

       æ——被分配到特定的表示帧类型语义。 那些没有定义的语义为特定帧类型标志必须被忽略,并且发送时必须保持未设置(0)。

       è®°ï¼šå¯¹äºŽä¿ç•™çš„1位字段。 该位的语义是不确定的,发送和接收时必须被忽略时,该位必须保持未设置状态(0)。

       æµæ ‡è¯†ç¬¦ï¼šA -bit流标识符(见第5.1.1节 )。 值0被用于与该连接作为一个整体相联,而不是一个单独的流的帧保留。

       å¸§æœ‰æ•ˆè½½è·çš„结构和内容是完全依赖帧类型。

       4.2 帧大小:一帧的有效载荷的最大尺寸由帧类型不同而不同。 一帧的绝对最大大小为2 -1(.)字节。 所有的实现应能接收和处理的最小帧截至最大尺寸。

       æŸäº›å¸§ç±»åž‹ï¼Œå¦‚中国平安 (参见6.7节 ),施加允许的有效载荷数据量的额外限制。 同样,另外的大小限制可以通过特定的应用程序的用途进行设置(见第9节 )。

       å¦‚果帧大小超过任何已定义的限制,或者是太小,无法包含强制性的帧数据,端点必须发送一个FRAME_SIZE_ERROR错误。 在影响连接级状态帧帧大小错误必须被视为一个连接错误( 第5.4.1节)。

       4.3 报头压缩和解压:在HTTP/2.0标头字段是一个名称 - 值对与一个或多个相关联的值。 他们是在HTTP请求和响应消息,以及服务器推送操作中使用(参见8.2节 )。

       å¤´åˆ—表是有序的排列,在应用层的零个或多个头部字段的集合。 当在一个连接上传输,一个头列表序列化为使用标题块的HTTP报头压缩 [压缩]。 序列化的头块被分成一个或多个字节的序列,称为头块碎片,和标头(有效载荷内传输6.2节 ),PUSH_PROMISE( 6.6节 )或延续( 第6.节 )帧。

       è¯¥Cookie首部字段 [COOKIE]是由HTTP映射特殊处理,请参阅第8.1.3.3 。

       ä¸€ç§æŽ¥æ”¶ç»ˆç«¯é€šè¿‡è¿žæŽ¥å„个片段重新组合的头块,然后解压缩块来重构报头组。

       ä¸€ä¸ªå®Œæ•´çš„头块组成之一:

       Â·å•æŽ’针或PUSH_PROMISE每个分别与END_HEADERS或END_PUSH_PROMISE标志设置框,或

       Â·ä¸€æŽ’针或PUSH_PROMISE帧与END_HEADERS或END_PUSH_PROMISE标志清零和一个或多个点连续的帧,其中最后延帧具有END_HEADER标志集。

       å¤´å—必须被发送作为帧的连续序列,以及任何其他类型,或者通过任何其他流的无交插帧。 在序列的最后一帧接针或延帧必须有END_HEADERS标志设置。 在序列的最后一帧PUSH_PROMISE或延帧必须有END_PUSH_PROMISE或END_HEADERS标志设置(分别)。

       å¤´å—碎片只能作为传送的有效载荷HEADERS , PUSH_PROMISE或存续的帧。 排针 , PUSH_PROMISE和延帧传输数据,可以通过修改一个接收器保持压缩上下文。 一个端点接收接针 , PUSH_PROMISE或延帧必须重新装配头块和执行解压缩,即使帧将被丢弃。 接收器必须终止与连接错误(连接第5.4.1节类型) COMPRESSION_ERROR ,如果它没有解压缩一个头块。

安卓逆向解决淘系App 天猫 陶特等抓包问题

       对于安卓平台上的淘系应用,如天猫和陶特,当我们试图使用像Fiddler或Charles这样的抓包工具进行网络数据监控时,可能会遇到难题。问题的根源在于这些应用并非采用常规的HTTP协议进行通信,而是采用了自定义的Spdy私有协议。

       要解决这个问题,首先需要对应用进行逆向工程,找到判断是否使用Spdy协议的代码段。可供选择的手段有frida或xp hook技术,这里我选择了Xposed框架来进行操作。

       针对天猫应用,逆向后的处理步骤是针对性的,通过Xposed模块对特定函数进行hook,以实现对Spdy协议的拦截和分析。

       对于陶特应用,同样需要类似的逆向和修改过程,以适应其独特的Spdy通信机制。

       在成功逆向并实现hook后,抓包工具就能捕捉到这些淘系App的私有协议数据,从而揭示其内部网络通信的细节。通过这种方式,我们可以深入理解并可能模拟或解析这些应用的通信内容。

       如果你对这个过程或抓包模块有进一步的兴趣,可以通过关注爬虫逆向小林哥的微信公众号,获取更多相关教程和资源。

http1、http1.1和http2的区别

        影响一个HTTP网络请求的因素主要有2个:带宽和延迟

        主要区别体现在缓存处理:

        1⃣️缓存处理。

        在http1.0中主要使用header的if-modified-since/expires来做缓存的判断依据。

        http1.1引入了更多的缓存策略控制策略。比如Entity tag,If-Unmodified-Since,If-match,If-None-Match等更多可供选择的缓存头来控制缓存。

        2⃣️带宽优化及网络连接的使用。

        HTTP1.0中存在一些浪费带宽的现象。例如客户端只需要某个对象中的一部分,服务器端却把整个对象送过来了,并且不能支持断点续传的功能。

        HTTP1.1在请求头中引入了range头域,它允许只请求资源中的某一部分,即返回码是(partial content)。方便开发者的自由选择、节省带宽。

        3⃣️错误通知的管理。

        在HTTP1.1中新增了个错误状态响应码。如(conflict)表示请求的资源与资源当前的状态发生冲突,(gone)表示服务器上的资源被永久的删除。

        4⃣️host头处理。

        在HTTP1.0中认为每一个服务器都绑定一个ip地址,因此请求消息头中并没有传递主机名(hostname)。

        但是随着虚拟主机技术的发展,在一台物理服务器上可以存在多台虚拟主机,并且他们共享一个ip地址。

        HTTP1.1中请求和响应都支持host头域,且请求消息中如果没有host头域会报错(bad request)

        5⃣️长链接

        HTTP1.1支持长链接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立多个连接的消耗和延迟。在HTTP1.1中默认打开onnection:keep-alive,在一定程度上弥补了http1.0每次请求都要重新连接的缺陷。

        SPDY优化了HTTP1.x的请求延迟,解决了HTTP1.x的安全性

        SPDY的构成图

        SPDY位于HTTP之下,TCP和SSL之上,这样就可以轻松兼容老版本的HTTP协议,同时可以使用已有的SSL功能

        HTTP2的性能比HTTP1.1好很多,这里是Akamai公司的一个 官方演示

        HTTP2.0可以说是SPDY的升级版(原本也是基于SPDY设计的),但是两者还是有一些区别:

        服务器推送能把客户端所需要的资源伴随index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务器推送的方式可以极大地提升速度。

        假定一个页面有个资源需要加载,每一次请求都有1kb的消息头,则至少需要消耗kb来获取这些请求头。HTTP2.0维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。

        HTTP优化的性能并不在于高带宽,而是低延迟。TCP连接会随着时间进行自我调谐,起初会限制连接的最大速度,如果数据传输成功,会随着时间的推移提高传输的速度。这种调谐叫做TCP的慢启动。由于这种原因,让原本就具有突发性和短时性的HTTP连接变得十分低效。

HTTP/2让所有的数据流共用同一个连接,可以更有效地使用TCP连接,让高带宽也能真正的服务于HTTP的性能提升。

文章所属分类:焦点频道,点击进入>>