http1.0与http1.1的不同之处?
-
缓存处理:HTTP1.中缓存处理能力较弱,只能使用header中的If-Modified-Since来判断文件是否被修改过,而HTTP1.1则引入了更多的缓存控制策略,如Cache-Control和ETag等,能更好地支持缓存机制。Cache-Control头域(请求消息和响应消息都可使用),它支持一个可扩展的指令子集:例如max-age指令支持相对时间戳;private和no-store指令禁止对象被缓存;no-transform阻止Proxy进行任何改变响应的行为。而HTTP/1.1中引入了一个ETag头域用于重激活机制,它的值entity tag可以用来唯一的描述一个资源。请求消息中可以使用If-None-Match头域来匹配资源的entitytag是否有变化。
-
长连接:HTTP1.中每次请求都需要建立一次连接,请求结束后立即断开连接,而HTTP1.1则支持长连接,即在一个连接上可以发送多个请求和响应,减少了连接建立和断开的开销,提高了性能。
-
分块传输编码:HTTP1.1支持分块传输编码,可以将一个大文件分成多个块进行传输,提高了传输效率。
HTTP消息中可以包含任意长度的实体,通常它们使用Content-Length来给出消息结束标志。但是,对于很多动态产生的响应,只能通过缓冲完整的消息来判断消息的大小,但这样做会加大延迟。如果不使用长连接,还可以通过连接关闭的信号来判定一个消息的结束。
HTTP/1.1中引入了Chunkedtransfer-coding来解决上面这个问题,发送方将消息分割成若干个任意大小的数据块,每个数据块在发送时都会附上块的长度,最后用一个零长度的块作为消息结束的标志。这种方法允许发送方只缓冲消息的一个片段,避免缓冲整个消息带来的过载。
在HTTP/1.0中,有一个Content-MD5的头域,要计算这个头域需要发送方缓冲完整个消息后才能进行。而HTTP/1.1中,采用chunked分块传递的消息在最后一个块(零长度)结束之后会再传递一个拖尾(trailer),它包含一个或多个头
4.Host头处理:HTTP1.中没有Host头,因此无法在同一IP地址下托管多个域名,而HTTP1.1则支持Host头,可以在同一IP地址下托管多个域名(时代发展,同一台服务器下可以有多台虚拟机共享IP)
5.错误处理:HTTP1.中错误处理能力较弱,只能返回简单的错误码,而HTTP1.1则引入了更多的错误处理机制,如状态码100-continue、206 Partial Content等,能更好地处理错误情况。
Http2.0 做了哪些改进?
具体见P114
1、对常见的http头部通过静态表和huffman编码的方式,将体积压缩,对于后续的请求头部,建立动态表,将体积压缩近90%
2、实现Stream并发,多个Stream只需要复用一个TCP连接,节约TCP和TLS的握手时间,以及减少了TCP慢启动阶段对流量的影响。
3、服务器支持主动推送资源,而http2之前,需要客户端定时拉取资源,主动推送资源大大提高消息的传输性能。
4、将http/1的文本格式改成二进制格式传输数据,极大提高了HTTP传输效率,而且二进制数据可以使用位运算高效解析。
仍旧存在的缺陷:
1、队头堵塞,如果某一Stream中丢失了一个包,会导致重传,影响到连接中的所有流,应用层也无法读取到序列号更高的包的数据,造成队头堵塞
2、TCP三次握手和TLS四次握手共产生3-RTT的时延
3、连接迁移需要重新建立连接 :当网络环境变化而导致IP地址或端口变化,TCP只能断开连接,然后再重新建立连接,切换网络环境的成本很高。
HTTP3.0做了哪些改进?
具体见P124
将传输层的TCP替换成UDP,并在UDP协议上开发了QUIC协议,以保证数据的可靠传输
1、解决了队头堵塞问题,当某个流丢包时,并不会影响到其他流,因为QUIC并不关心数据包的顺序,它只关心这个流中传过来的数据包是不是完整,保证了各流之间的独立性。当某个流丢包的时候,只是这个流会发生重传,并不影响其他流。
2、能够更快的建立连接;QUIC内部包含了TLS,在自己的帧里携带TLS记录,再加上QUIC使用的是TLS1.3,仅需要1RTT便可以建立连接和密钥协商;甚至在第二次连接时(会话恢复),0RTT便可重新建立连接。
3、对于连接迁移,通过连接ID来标记通信的两个端点,这样即便是IP地址变化了,只要仍保存上下文信息(连接ID,密钥等),可以无缝采用原连接,消除重连成本。
TCP三次握手过程,原因
P135】
三次握手的过程
第一次握手,客户端SYN置1,初始化序列号为100,将其置于TCP首部的序号字段中,同时把SYN标志位置1,表示SYN报文,发送给客户端。
第二次握手,服务端接收到SYN信号及客户端序列号,将服务端TCP信号SYN置1,确认应答号ACK_NUM置为客户端序列号+1,并发送服务端序列号200
第三次握手,客户端将TCP信号 ACK置1,发送应答信号为服务端序列号+1 给服务端,服务端收到后建立连接,同时,在第三次握手时,是可以携带数据的。
三次握手的原因?
三次握手可以阻止重复历史连接的初始化。
三次握手才可以同步双方的初始序列号
三次握手才可以避免资源浪费(在网络通道堵塞的情况下,只有两次握手的话,客户端迟迟接收不到服务端的ACK信号,会一直给服务端发送SYN信号,造成连接的重复建立)