http-10-http的连接管理

news/2024/5/18 14:42:05 标签: http, tcp/ip, udp
http://www.w3.org/2000/svg" style="display: none;">

短连接

HTTP 协议最初(0.9/1.0)是个非常简单的协议,通信过程也采用了简单的“请求 - 应答”方式。它底层的数据传输基于 TCP/IP,每次发送请求前需要先与服务器建立连接,收到响应报文后会立即关闭连接。因为客户端与服务器的整个连接过程很短暂,不会与服务器保持长时间的连接状态,所以就被称为“短连接”(short-lived connections)。早期的 HTTP 协议也被称为是“无连接”的协议。

短连接的缺点相当严重,因为在 TCP 协议里,建立连接和关闭连接都是非常“昂贵”的操作。TCP 建立连接要有“三次握手”,发送 3 个数据包,需要 1 个 RTT;关闭连接是“四次挥手”,4 个数据包需要 2 个 RTT。

https://img-blog.csdnimg.cn/555eb9610db5446d86cc4cf529c98f55.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Y-R5aaC6ZuqLXR5,size_15,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" />
长连接

针对短连接暴露出的缺点,HTTP 协议就提出了“长连接”的通信方式,也叫“持久连接”(persistent connections)、“连接保活”(keep alive)、“连接复用”(connection reuse)。其实解决办法也很简单,用的就是“成本均摊”的思路,既然 TCP 的连接和关闭非常耗时间,那么就把这个时间成本由原来的一个“请求 - 应答”均摊到多个“请求 - 应答”上。

https://img-blog.csdnimg.cn/46118766c3cb427e879fd4ecb9f2873e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Y-R5aaC6ZuqLXR5,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" />
如上图,同样是请求-应答三次,使用长连接的方式明显提高了效率。因为只连接、关闭了一次,而短连接连接、关闭了3次。

连接相关的头字段

由于长连接对性能的改善效果非常显著,所以在 HTTP/1.1 中的连接都会默认启用长连接。不需要用什么特殊的头字段指定,只要向服务器发送了第一次请求,后续的请求都会重复利用第一次打开的 TCP 连接,也就是长连接,在这个连接上收发数据。当然,我们也可以在请求头里明确地要求使用长连接机制,使用的字段是 Connection,值是“keep-alive”。不过不管客户端是否显式要求长连接,如果服务器支持长连接,它总会在响应报文里放一个“Connection: keep-alive”字段,告诉客户端:“我是支持长连接的,接下来就用这个 TCP 一直收发数据吧”。

队头阻塞

“队头阻塞”与短连接和长连接无关,而是由 HTTP 基本的“请求 - 应答”模型所导致的。

因为 HTTP 规定报文必须是“一发一收”,这就形成了一个先进先出的“串行”队列。排在最前面的请求被最优先处理。如果队首的请求因为处理的太慢耽误了时间,那么队列里后面的所有请求也不得不跟着一起等待,结果就是其他的请求承担了不应有的时间成本。

队头阻塞的解决办法

“并发连接”(concurrent connections),也就是同时对一个域名发起多个长连接,用数量来解决质量的问题。

但这种方式也存在缺陷。如果每个客户端都想自己快,建立很多个连接,用户数×并发数就会是个天文数字。服务器的资源根本就扛不住,或者被服务器认为是恶意攻击,反而会造成“拒绝服务”。所以,HTTP 协议建议客户端使用并发,但不能“滥用”并发。RFC2616 里明确限制每个客户端最多并发 2 个连接。不过实践证明这个数字实在是太小了,众多浏览器都“无视”标准,把这个上限提高到了 6~8。后来修订的 RFC7230 也就“顺水推舟”,取消了这个“2”的限制。

于是“域名分片”(domain sharding)技术出现,还是用数量来解决质量的思路。HTTP 协议和浏览器不是限制并发连接数量吗?好,那我就多开几个域名,比如 shard1.chrono.com、shard2.chrono.com,而这些域名都指向同一台服务器 www.chrono.com,这样实际长连接的数量就又上去了。


http://www.niftyadmin.cn/n/1426918.html

相关文章

leetcode数组刷题总结与分析

文章目录小结……数组中元素的计算(子序列、任意元素)题目一:两数之和题目15、三数的和17、四数之和16、最接近三数之和167、两数之和---输入有序数组560、和为k的子数组523、连续的子数组的和53、最大子数组和713、乘积小于K的数组11、成最多…

Flutter 引入包import的各种含义,及常用命名规范

一、import含义 import dart:xxx; 引入Dart标准库 import xxx/xxx.dart;引入相对路径的Dart文件 import package:xxx/xxx.dart;引入Pub仓库pub.dev(或者pub.flutter-io.cn)中的第三方库 import package:project/xxx/xxx.dart;引入自定义的dart文件 impo…

http-11-http的重定向和跳转

主动跳转:跳转动作是由浏览器的使用者主动发起的; 被动跳转:跳转动作是由服务器发起的,浏览器使用者无法控制。 1、重定向状态码 其实之前我们就已经见过重定向了,301 是“永久重定向”,302 是“临时重定向”&#xf…

http-12-cookie

cookie就是能够存储格式是“keyvalue”数据的缓存区。 这要用到两个字段:响应头字段 Set-Cookie 和请求头字段 Cookie。当用户通过浏览器第一次访问服务器的时候,服务器肯定是不知道他的身份的。所以,就要创建一个独特的身份标识数据&#x…

leetcode动态规划刷题

文章目录动态规划解决步骤动态规划的关键常用递推式解题思路题目分析类型一:子序列(字符串,数组)的问题类型二: 背包问题:从数组中挑选一些值满足某个条件类型三:股票问题类型四:某个…

GDI Plus 画曲线图

GID Plus画曲线图 #include <windows.h> //1.头文件包含 #include <ObjIdl.h> #include <gdiplus.h> //2.包含gdi的lib using namespace Gdiplus; #pragma comment(lib,"Gdiplus.lib")LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗…

LeetCode83删除链表中重复元素

题目连接 快慢指针双指针:这道题可以定义两个指针&#xff0c;slow&#xff1a;指向参考元素不用删除的末尾,quick&#xff1a;进行比较的元素&#xff08;可能会进行删除&#xff09;&#xff1b;遍历链表&#xff0c;移动两个指针&#xff0c;当slow.dataquick.data时将slow.…

Visual Studio2017 C++新建项目

Visual Studio2017 C新建项目 注意软件安装版本不同&#xff0c;创建方式可能有所不同&#xff0c;安装时选择的“工作负载”类型不同也可能会造成步骤有所不同&#xff0c;但大同小异。 1.如图&#xff0c;点击新建项目图标&#xff0c;在弹出的新建项目界面中可更改项目名称…