你一定听说过关于 http 所谓的 长连接和短连接之说.
但是, 什么是长连接? 什么是短连接, 我想很多人都是懵懵懂懂的, 不能完全说出他们的区别. 今天就带你们完全了解他们, 从此再也不会忘记了.
什么是长连接
HTTP 长短连接的区别在于使用的 TCP 的长连接还是短连接.
在 HTTP 1.0 中默认使用的是短连接, 而从 HTTP 1.1 之后默认的连接都变为长连接. 长短连接的区别? 本质上是有 TCP 连接来决定的, 为什么这么说呢? 因为 TCP 是一个向双通道, 他可以保持一段时间不关闭, 这样就有了长连接和短连接的区别了. 比方说: 在数据的传输完成后, 保持 TCP 连接不中断, 等待相同域名再次请求时, 继续使用这个 TCP 连接通道进行数据传输. 这个就是长连接.
举个例子吧, 比如你需要邮件一个东西给你的朋友, HTTP 协议指的就是你需要填写的那个快递单, 你寄件的时候填写的那个快递单的动作就相当于进行了一次 HTTP 请求. 而你的快递需要通过交通运输工具来运送吧, 可以是货车, 货车, 高铁, 飞机等等. 而 TCP 协议指的就是那个运送快递的运输工具. 因为需要运输啊, 就需要有道路啊, 地上是公路或者铁路, 天上是航线. 那么这个运输道路就是 TCP 连接, 因为这个道路是双向的, 可以运过来也可以运过去. 所以, TCP 连接也叫作双向的数据通道.
如果这个道路长时间都有车来运送货物, 那就叫作长连接. 如果运送一段时间后, 需要休整没有车经过了, 那么就叫做短连接.
因此我们可以看出来, 所谓的 HTTP 连接指的就是 TCP 的连接. TCP 连接是可以保持一段时间不中断的就是长连接, 发起一次请求后就主动断开的就是短连接, 所以就有了长连接和短连接一说.
那么问题来了, 怎么样的连接才能被称之为 ---- 长连接呢?
长连接的条件:
第一, 需要将 HTTP 的头部, Connection 设置为 keep-alive, 但是这里有一个问题出现了, 是不是只需要设置 Connection 为 keep-alive 就算是长连接了呢? 这个问题很明显, 当然不是的, 你需要在服务器和客户端都要进行设置.
第二, 我们日常生活中所用的 HTTP 请求是不是长连接呢? 答案很明显, 当然是的了. 因为现在的 HTTP 使用的都是 1.1 协议了, 你细心观察一下就会发现, 它的 Connection 都是设置为 keep-alive.
那么现在你是不是对 keep-alive, 很好奇啊. 什么是 Connection 设置为 keep-alive 呢? 接下来, 我就带你们来揭开它神秘的面纱.
Keep-alive 又为何方神圣?
我们知道啊, HTTP 协议采用的都是 "请求 - 应答" 模式, 当 Connection 为非 keep-alive 模式, 则每一次的 请求 - 应答任务, 服务器和客户端都需要重新建立一次连接. 任务完成后, 断开连接. 而当 Connection 为 keep-alive 模式, 会使服务器与客户端一直保持连接的状态. 当再有新的请求任务发生时, 就不需要重新建立. 节约时间, 也不用耗费资源.
非 keep-alive:
有上面的图可以看出来:
短连接的步骤:
长连接的步骤:
接下来我们就聊一聊 长连接和短连接分别在什么场景下使用?
长连接使用场景: 长连接多用于频繁操作, 多次请求的网络应答响应, 而且是一对一, 点对点的通信. 例如: 数据库的连接用长连接, 如果使用短连接频繁的应答响应会造成 socket 报错, 同时也会浪费资源.
短连接的使用场景: 短连接怎不会那么耗费资源, 因为不需要长时间占用 TCP 连接. 因此, 像 web 网站中的 http 服务一般都是用的短连接. 因为长连接会占用一定的资源, 而像淘宝, 京东等网站这样频繁的被用户访问, 赶上双十一都是上亿规模的访问量, 如果使用长连接, 每个用户都占用一个 TCP 连接通道, 那么服务器的压力可想而知. 所以, 这种情况下 使用短连接效果比较好.
因为上面我们说到 HTTP 的连接实际上就是 TCP 的连接, 那么在这里我们就不得不来详细说一下, TCP 的连接有什么特色呢?
TCP 连接
在网络应答请求时, 客户端与服务器端之间必须建立一个连接, 当网络请求完成之后, 双方就不再需要这个连接时就可以将连接释放. 而这里采用的是 TCP 连接, TCP 的协议里面的连接, 依靠是 "三次握手", 释放时依靠 "四次分手".
因此每一次的连接都是需要耗费资源和时间的.
1. TCP 的 "三次握手":
TCP 的三次握手的示意图
详细解释:
第一次握手: 客户端想服务器发送一个 SYN 标志位为 1 的包, 以及初始序号 X, 包装在包的头的序列号字段里.
第二次握手: 服务器发回 ACK(确认包), 即将 SYN 和 ACK 标志位都命名为 1, 同时将序列号修改为 X+1.
第三次握手: 客户端向服务器再次发送确认包 (ACK),SYN 标志位为 0.ACK 标志位为 1. 同时把服务器发过来的 ACK 包序列号字段 + 1. 放在包中, 发给服务器即 ACK=Y+1
2. TCP 的 "四次分手":
因为 TCP 的断开需要发送四个包, 因此被称之为 四次挥手. 客户端或服务器端均可主动断开. 在 socket 编程中, 任何一方执行 close() 操作即可产生分手操作.
HTTP 协议的长连接和短连接, 实质上就是 TCP 协议的长连接和短连接.
短连接和长连接的工作原理是啥, 有啥优势呢?
短连接: client 向 server 发送请求, server 收到请求, 双方建立连接. Client 向 server 发送消息, server 响应 client. 然后一次连接就完成了. 此时, 双方都可以发起 close 操作.
短连接的优点: 管理简单, 发起的连接都是有效的连接. 不需要额外的控制手段.
长连接: client 向 server 发送请求, server 响应 client 的连接, 双方建立连接. 然后完成一次成功的响应请求, 之后他们的连接不会主动关闭, 后面的读写响应请求还会继续使用这个连接通道.
来源: http://network.51cto.com/art/201904/595021.htm