1、http/1.0、http/1.1和http2.0有什么区别。
(1)、http/1.0协议默认使用非持久连接(短连接),既在非持久连接下,服务器处理完客户端一个请求后立即断开TCP连接,下次客户端再次请求需要重新建立连接,服务器不跟踪每个客户,也不记录过去的请求。
(2)、http/1.1协议默认使用持久连接(长连接),即在长连接的情况下,服务器处理完客户端请求后不立即关闭一个TCP连接,而是一个tcp连接允许多个客户端请求,可以传输多个WEB对象。同时也可通过配置支持非持久连接。
(3)、http/1.1增加了Host字段,因为目前一台计算机上有多个虚拟主机共享一个IP地址,请求和相应消息都应该支持Host头域,且请求消息中没有Host头域会报(400 Bad Request)。此外服务器应该接受以绝对路径标记的资源请求。而http/1.0中每台服务器都绑定一个唯一的IP,因此,请求消息中的URL没有传递主机名(hostname)。
(4)、增加了新的状态码100(Continue)。客户端事先发送一个只带头域的请求,如果服务因权限等拒绝请求,就回送相应401(Unauthorized)或403;如果服务器接受此请求就回送相应吗100,客户端就可以继续发送带实体的完成请求。状态码的使用,在request在发送body之前,先发送header试探一下server,如果接受body,再发送body。可以节省带宽。
(5)、http/1.0加入了分块编码(Chunked TransferCoding)。发送方将消息分割成若干个任意大小的数据块,每个数据块在发送时都会附上块的长度,最后一个零长度的块作为消息的结束标志。这种发送允许发送方只缓存一个片段,避免缓存整个片段带来的过载。
(6)、http/1.1在http/1.0的基础上加入了一些cache的新特性,当缓存对象Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)
(7)、http/2.0支持多路复用技术,同一个连接并发处理多个请求(NIO),http/1.1可以通过建立多个TCP解决。
(8)、http/1.1不支持Header数据的压缩,http/2.0使用HPACK算法对数据压缩,降体积提速度。
(9)、http/2.0请求服务器,服务器推送数据时会额外推送客户需要的资源,客户下次调用不用请求直接调用。提升速度。
2、TCP三次握手和四次挥手的流程,为什么断开连接要4次,如果握手只有两次,会出现什么。
1)、TCP三次握手:
第一次握手:建立连接时,客户端发送syn(Synchronize Sequence Numbers:同步序列编号)包(sny=1)到服务器,并进入SYN_SEND(请求连接)状态,等待服务器确认;
第二次握手:服务器接收到syn包,必须确认客户的syn(ack=j+1)(ack:确认字符,表示发来的数据已确认接收无误),同时自己也发送一个syn包(sny=k),既ack+syn包,此时服务器进入SYN_RECV(发送了ACK时的状态)状态。
第三次握手:客户端收到服务端发送的syn+ack包,向服务端发送确认包ack(sny+1既ack=k+1),此包发送完毕,客户端与服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
---------------------
(2)、TCP四次挥手(连接终止协议,性质为终止协议):
第一次挥手:TCP客户端发送一个FIN+ACK+SEQ,用来传输关闭客户端到服务端的数据。进入FIN_WAIT1状态。
第二次挥手:服务端收到FIN,被动发送一个ACK(SEQ+1),进入CLOSE_WAIT状态,客户端收到服务端发送的ACK,进入FIN_WAIT2状态。
第三次挥手:服务器关闭客户端连接,发送一个FIN给+ACK+SEQ客户端。进入LAST_ACK状态。
第四次挥手:客户端发送ACK(ACK=SQE序号+1)报文确认,客户端进入TIME_WAIT状态,服务端收到ACK进入CLOSE状态。
(3)、由于TCP连接时双工的,因此每个方向都需要单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一个方向上没有数据流动,一个TCP连接到一个FIN后仍能发送数据。首次执行FIN的一方主动关闭,另一方则执行被动关闭。当只握手两次时,就只会关闭主动发起的一端,另一个仍能发送数据。
---------------------