简介
HTTP协议与TCP/IP协议的关系
HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。
如何理解HTTP协议是无状态的
无状态是指协议对于事务处理没有记忆能力,两次http请求之间没有任何联系
长连接和短连接
HTTP/1.0中默认使用短链接,即客户端和服务端每进行一次http操作就建立一次连接,任务结束就中断连接。
从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的http协议会在响应头加入这行代码
Connection:keep-alive
apache优化
关闭KeepAlive ,可以节省内存,但连接增多,消耗更多的cpu,是否开启要视情况而定
详情参考:apache的keepalive和keepalivetimeout(apache优化)https://www.cnblogs.com/wanshutao/p/5084648.html
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
TCP连接
当网络通信时采用TCP协议时,在真正的读写操作之前,客户端与服务器端之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时可以释放这个连接。连接的建立依靠“三次握手”,而释放则需要“四次握手”,所以每个连接的建立都是需要资源消耗和时间消耗的。
http2与http1.1
1.多路复用
Http2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发的请求数量比HTTP1.1大了好几个数量级。Http1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
I/O多路复用是一种操作系统提供的机制,可以同时监视多个文件描述符的状态,当其中任何一个文件描述符就绪时,就能够通知应用程序进行相应的I/O操作。在Linux系统中,epoll是一种高效的I/O多路复用机制。
HTTP/2的多路复用利用了I/O多路复用的机制来实现。在HTTP/2中,多个HTTP请求被分割为多个帧,这些帧可以同时通过同一个TCP连接发送和接收。而epoll机制可以同时监听多个TCP连接的状态,当其中任何一个TCP连接就绪时,就会触发相应的事件,应用程序可以进行相应的处理。
通过将HTTP/2的多路复用与I/O多路复用的epoll结合使用,可以实现高效的并发处理,提高网络性能和吞吐量。同时,由于HTTP/2的多路复用可以减少TCP连接的数量,也能够减轻服务器的负载
2.头部数据压缩
在HTTP1.1中,HTTP请求和响应都是由状态行,请求/响应头部,消息体三部分组成。一般而言,消息主题都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件,但状态行和头部却没有任何压缩,直接以纯文本传输。随着Web功能越来越复杂,每个页面产生的请求数也越来越多,导致消耗在头部的流量越来越多。尤其每次都要传输UserAgent,Cookie这类不会频繁变动的内容,完全是一种浪费。
HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
3.服务器推送
服务端推送是一种在客户端请求之前发送数据的机制。网页使用了许多资源:HTML,样式表,脚本,图片等。在HTTP1.1中这些资源每一个都必须明确地请求,这是一个很慢的过程。浏览器从获取HTML开始,然后在它解析和评估页面的时候,增量地获取更多的资源。
为了改善延迟,HTTP2.0引入了server push,它允许服务端推送资源给浏览器,在浏览器明确地请求之前,免得客户端再次创建连接发送请求到服务器端获取。这样客户端可以直接从本地加载这些资源,不用再通过网络。
4.新的二进制格式(Binary Format)
HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮
http1.1与http1.0
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头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
3.错误通知的管理
在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
4.Host头处理
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
5.长连接
HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
HTTP2
HTTP/2相对于HTTP/1.1在多个方面进行了显著的改进和优化,这些改进使得网络通信更加快速、高效和可靠。以下是HTTP/2相对于HTTP/1.1的主要变化:
1. 传输格式的变化
- 二进制传输:HTTP/2使用二进制格式而非HTTP/1.1的文本格式进行传输。二进制格式使得解析更加高效,同时减少了传输过程中的开销。
2. 多路复用
- 流和帧:HTTP/2通过引入流(Stream)和帧(Frame)的概念,实现了多路复用(Multiplexing)。这意味着可以在同一个TCP连接上并行处理多个请求和响应,而不需要像HTTP/1.1那样每个请求都需要一个新的连接或持久连接中的顺序处理。这种多路复用的方式极大地提高了连接利用率和吞吐量。
3. 头部压缩
- HPACK压缩:HTTP/2使用HPACK算法对头部信息进行压缩,以减少头部数据的传输大小。HPACK算法通过静态霍夫曼编码和动态表压缩相结合的方式,对头部字段进行高效编码,从而减少了头部数据的传输开销。
4. 服务器推送
- 主动推送资源:HTTP/2支持服务器推送(Server Push)功能,即服务器可以在客户端请求之前,主动向客户端推送资源。这种机制可以优化页面加载时间,减少往返延迟,并提高缓存效率。
5. 流优先级和依赖
- 优先级和依赖关系:HTTP/2允许为每个流设置优先级和依赖关系。这使得客户端可以构建出优先级二叉树的形式,来表达出更想依次得到哪些响应。服务端可以根据这些优先级和依赖关系来分配硬件资源,从而优化资源的利用和响应速度。
6. 连接管理
- 更高效的连接管理:HTTP/2通过多路复用和头部压缩等机制,使得连接管理更加高效。同时,HTTP/2还支持TLS加密的HTTP/2连接(即h2),提供了更好的安全性。
7. 性能提升
- 减少延迟和开销:由于HTTP/2的多路复用、头部压缩和服务器推送等特性,使得网络传输过程中的延迟和开销大大降低。这有助于提升用户体验和网站性能。
8. 安全性增强
- 支持TLS加密:HTTP/2推荐使用TLS加密来保护传输过程中的数据安全性和完整性。这有助于防止中间人攻击和其他安全威胁。
HTTPS与HTTP的一些区别
1.HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
2.HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
3.HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4.HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
WebSocket协议
WebSocket 是一种用于在单个 TCP 连接上进行全双工通信的应用层网络协议。
WebSocket不是基于HTTP的新协议,因为WebSocket只有在建立连接时才用到了HTTP,升级完成之后就跟HTTP不再有任何关系