HTTP(TCP)的长连接和短连接

HTTP的长连接和短连接本质上就是TCP的长连接和短连接。

一.HTTP协议和TCP协议

HTTP的长连接和短连接本质上就是TCP的长连接和短连接。HTTP协议属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址的问题,TCP协议主要解决如何在IP层之上进行可靠的端对端传递数据包的过程。

二.HTTP协议的长连接和短连接

在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就断开连接。

但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议中,会在响应头中加入这行代码:

Connection: keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务器上的其它网页,会继续使用这一条已经建立的连接。Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

三.长连接和短连接的区别

(1)短连接

  • 连接->传输数据->关闭连接
  • 比如 HTTP 是无状态的的短链接,浏览器和服务器每进行一次 HTTP 操作,就建立一个连接,任务结束就中断连接。
  • 因为连接建立后接收了数据就断开了,所以每次数据接受处理不会有任何联系。 这也是HTTP协议无状态的原因之一。

(2)长连接

  • 连接->传输数据->保持连接 -> 传输数据-> …->直到一方关闭连接
  • 多是客户端关闭连接
  • 长连接指建立 SOCKET 连接后不管是否使用都保持连接,但安全性较差。

四.TCP的长连接和短连接

(1)短连接

client 向 server 发起连接请求,server 接到连接请求,然后双方建立连接。client 向 server 发送请求,server 回应 client,然后一次读写就完成了,这时候双方任何一个都可以发起 close 操作,不过一般都是 client 先发起 close 操作。为什么呢?一般的 server 不会回复完 client 后立即关闭连接的,当然不排除有这种特殊的情况。从上面的描述看, 短连接一般只会在 client/server 间传递一次读写操作。

短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段。


(2)长连接

client 向 server 发起连接请求,server 接受 client 的请求,双方建立连接。client 与 server 完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接,这就是长连接。

五.长连接和短连接的生命周期

短连接在建立连接后,完成一次读写操作就会自动关闭了。

正常情况下,一条 TCP 长连接建立好之后,只要双方不提出关闭请求,并且不出现异常的情况下,这条连接是一直存在这的,操作系统不会自动去关闭这个连接,甚至经过物理网络拓扑的改变之后仍然可以使用这条连接。所以一条连接保持几天、几个月、几年或者更长时间都有可能,只要不出现异常情况或由用户(应用层)主动关闭,就可以达到长期有效的效果。

在编程中,往往需要建立一条TCP连接,并且长时间处于连接状态。所谓的TCP 长连接并没有确切的时间限制,而是说这条连接需要的时间比较长。

总结:长连接并不是永久连接的。如果一段时间内(具体的时间长短,是可以在 header 当中进行设置的,也就是所谓的超时时间),在这段时间内如果这个连接没有 HTTP 请求发出的话,那么这个长连接就会被断掉。

六.长短连接的使用场景

(1)长连接

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多的情况下。。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成 socket 错误,而且频繁的 socket 创建也是对资源的一种浪费。

(2)短连接

像 WEB 网站的 http 服务一般都用短链接,因为长连接对于服务器端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户并发执行,如果每个用户都占用一个连接的话,那。。。。
所以在并发量大,而且每个用户无需频繁操作情况下需用短连接好。

七.相关问题

1.是不是只要设置 Connection 为 keep-alive 就算是长连接了?

是,但要服务器和客户端都设置。

2.我们平时用的是不是长连接?

是(现在用的基本上都是 HTTP1.1 协议,基本上 Connection 都是 keep-alive。而且 HTTP 协议文档上也提到了,HTTP1.1 默认是长连接,也就是默认 Connection 的值就是 keep-alive )

发布了62 篇原创文章 · 获赞 6 · 访问量 4431

猜你喜欢

转载自blog.csdn.net/HU1656/article/details/105072399
今日推荐