《HTTP权威指南》 第4章 连接管理

带着问题学习(通常是面试考点)

  • HTTP是如何使用TCP连接的
  • TCP连接的时延、瓶颈及存在的障碍
  • HTTP的优化,包括并行连接、keep-alive(持久连接)和管道化连接
  • 管理连接时应该和不应该做的事

TCP连接

在这里插入图片描述
在这里插入图片描述
TCP的数据通过IP分组(或IP数据报)的小数据块来发送。

协议顺序HTTP (>> SSL or TLS) >> TCP >> IP
在这里插入图片描述

数据传输过程:

  1. HTTP以的形式将数据报文通过TCP连接进行按序传输
  2. TCP收到数据流后,将数据流砍成小数据块(称作),将封装IP分组中,通过因特网传输

IP分组包括:一个IP分组首部(通常20字节) + 一个TCP段首部(通常20字节) + 一个TCP数据块(0或多个字节)

  • IP分组首部:源和目的IP地址、长度、其他标记
  • TCP段首部:TCP端口号、TCP控制标记、其他数据排序和完整性检查的数值

TCP连接识别<源IP地址、源端口号、目的IP地址、目的端口号>
TCP通过端口号保持多个连接持续运行,这4个值唯一的定义了一条连接,两条不同TCP连接不能拥有4个完全相同的地址组件值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

套接字API允许用户创建TCP的端点数据结构,将这些端点与远程服务器的TCP端点进行连接,并对数据流进行读写。

对TCP接口进行编程所需的常见套接字接口函数伪代码
在这里插入图片描述

TCP客户端与服务器是如何通过TCP套接字接口进行通信的:
在这里插入图片描述

HTTP事务的时延

回顾一下:HTTP事务 = 请求命令(HTTP方法)+ 响应结果

串行HTTP事务的时间线 = DNS查询 + TCP连接&接受应答 + 发送请求 + 处理 + 响应 + 关闭连接
在这里插入图片描述
HTTP事务的时延原因:

  • DNS解析URI中的主机名为IP地址
  • TCP请求连接需要等待接受应答
  • 发送报文及处理请求报文
  • 服务器回送HTTP响应

TCP网络时延的大小取决于硬件速度网络服务器负载报文尺寸客户端与服务器之间的距离TCP协议的技术复杂性也会对时延产生影响。

常见的TCP时延:

  • TCP建立握手
  • TCP慢启动拥塞控制
  • 数据聚集的Nagle算法
  • 用于捎带确认的TCP延迟确认算法
  • TIME_WAIT时延和端口耗尽

TCP连接的握手时延

在发送数据前,TCP要传送两个分组来建立连接。
在这里插入图片描述
TCP三次握手:a SYN请求建立连接 >> b SYN+ACK接受连接 >> c ACK确认成功建立连接

延迟确认

如果是小的HTTP事务,那么TCP连接就占了大量时间,由于确认报文很小,所以TCP允许在发往相同方向的输出数据分组中对其进行“捎带”(有点像夹带私货…),将返回的确认信息与输出的数据分组结合,剩下一次请求报文的时间,此行为称为“延迟确认算法”。

延迟确认算法会在特定窗口时间(200~300ms)内将输出确认存放在缓存区中,等待能够捎带的输出数据分组,没有就单独发送确认。

TCP慢启动

TCP数据传输的性能还取决于TCP连接的使用期
TCP连接会随着时间自我“调谐”,起初会限制连接的最大速度,如果数据传输成功,会随着时间推移提高传输的速度,这种调谐称为“TCP慢启动”,用于防止因特网突然过载和拥塞。

TCP慢启动限制了一个TCP端点在任意时间可以传输的分组数。每成功接收一个分组,发送端就有了发送2个分组的权限。有大量数据要发送也无法一次发送出去。必须发一个等待确认,然后发2个,都确认再发4个,以此类推。这种方式称为“打开拥塞窗口“,所以新连接比已交换过数据的连接慢一些

Nagle算法和TCP NODELAY

Nagle算法鼓励发送全尺寸的段,将已确认的分组数据缓存起来,等待传输中的分组被确认,当缓存积累了足够发送一个全尺寸的段再将缓存数据发出去。

但小的报文可能无法填满一个分组会因为等待永不会到来的额外数据而产生时延。且确认分组自身因“延迟确认算法”而延迟100~200毫秒。

所以HTTP应用程序通常会设置参数TCP NODELAY禁用Nagle算法。

TIME_WAIT累计和端口耗尽

当TCP端点关闭连接时,会在内存中维护一个小的控制快,用来记录最近关闭的IP地址和端口号,保证在一段时间内不会创建相同地址和端口的新连接。这段时间通常是最大分段使用期的两倍(2MSL,通常2分钟)。

TCP连接的4个值中:源IP、源端口、目标IP、目标端口,只有源端口可以随意改变的。

由于源端口的数量有限(比如6万),2MSL(比如120秒)内连接不能重用,那么连接率上限就为6万➗120秒=500次/秒。不超过500就不会遇到端口耗尽的问题。
要修正这个问题,可以增加客户端会负载生成机器的数量,或者确保循环使用几个虚拟IP来增加更多的连接组合。

HTTP连接的处理

串型事务处理时延

连接时延和慢启动时延叠加
在这里插入图片描述

HTTP优化1:并行连接

HTTP允许客户端打开多条连接,并行地执行多个HTTP事务。
在这里插入图片描述
⚠️注意:如果客户端网络带宽不足,那么大部分时间可能都在传送数据,多个事务的连接很快会耗尽所有可用的带宽。同时请求也会造成服务器性能严重下降,为了均衡,浏览器会限制并行连接的总数为一个较小的值(通常是4个)。

HTTP优化2:持久连接

初始化了对某服务器HTTP请求的应用程序很可能在不久后对该服务器发起更多的请求,这种性质被称为“站点局部性”。

因此HTTP/1.1允许HTTP设备在事务处理结束后将TCP连接保持打开状态,以便后续请求重用连接。在事务处理结束后保持打开状态的TCP连接被称为“持久连接”。

持久连接降低了时延和连接建立的开销(已调谐),但是容易产生大量空闲连接,需要特别注意。

持久连接类型1:HTTP/1.0的keep-alive连接

通过Connection: Keep-Alive保持连接

支持max设置希望保持连接的上限数,timeout设置希望保持连接的时间,如:Keep-Alive: max=5, timeout=120,但对方不一定会同意。
在这里插入图片描述
如果服务器支持keep-alive参数,需要回送一个Connection: Keep-Alive,否则不回送。

很多老的代理都是“盲中继”,只转发不对Connection首部作处理。当通过作为盲中继使用的哑代理连接时,会出现图示情形:
在这里插入图片描述
服务器返回响应后,哑代理返回数据后由于等待连接关闭,会忽略连接上的新请求,导致了下一条请求被挂起。这种错误的通信会使浏览器一直处于挂起状态,直到连接超时关闭。

为避免出现上述通信问题,现代的代理都绝不能转发Connection首部和出现在该首部值中的首部。

一个变通做法是,发送非标准的Proxy-Connection扩展首部,哑代理转发后服务器会忽略此首部,聪明的代理会转换为Connection首部发送,以收到预期效果。但是如果代理中有哑代理又有聪明的代理就会再次出现问题…😂

持久连接类型2:HTTP/1.1的persistent连接

HTTP/1.1默认所有连接都是持久连接,如果关闭连接就显式添加一个Connection: Close

HTTP优化3:管道化连接

HTTP/1.1允许在持久连接上可选地使用请求管道,在响应到达之前,将多条请求放入队列

管道化连接的限制:

  • 若HTTP客户端无法确认连接是持久的,就不应该使用管道
  • 必须按照与请求相同的顺序回送HTTP响应
  • HTTP客户端必须做好连接会在任意时刻关闭的准备,还要准备好重发未完成的请求
  • HTTP客户端不应该用管道化的方式发送可能会产生副作用的请求(比如POST),因为出错时无法安全的重试POST这样的非幂等请求

    幂等(Idempotent): 一个操作如果执行一次多次对系统状态产生的改变完全相同(或者说效果等同于只执行一次),那么这个操作就是幂等的。
    非幂等(Non-idempotent): 一个操作如果执行多次与执行一次对系统状态产生的改变不同(通常会产生额外的副作用),那么这个操作就是非幂等的。

在这里插入图片描述
要发送一条非幂等的请求,需要等待来自前一条请求的响应状态。
一定不能自动重试非幂等的方法。比如,大多数浏览器会在重载一个缓存的POST响应时提供一个对话框,询问用户是否再次发起事务处理。

正常关闭连接

完全关闭:TCP输入和输出都关闭
半关闭:单独关闭TCP输入或输出

在这里插入图片描述
关闭连接的输出信道总是安全的,关闭连接的输入信道比较危险
如果另一端向你已关闭的输入信道发送数据,操作系统就会向另一端回送一条TCP“连接被对端重置”的报文,将删除对端还未读取的所有缓存数据
在这里插入图片描述
正常关闭的应用程序应该首先关闭输出信道两端都告诉对方不再发送任何数据之后,再完全关闭连接,就不会有重置的危险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85688.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

StartUML入门级使用教程——画Class类图

一、破解安装StartUML StarUML建模工具最新版破解安装详细教程https://blog.csdn.net/m0_74146638/article/details/148709643?spm1001.2014.3001.5502 二、类图实战 1.主界面 ​ 默认打开starUML后&#xff0c;会默认进入类图模式&#xff0c;各模块区域功能如下&#x…

中科亿海微SoM模组——FPGA+DSP核心板

FPGADSP核心板是基于中科亿海微EQ6HL130型FPGA芯片搭配国产DSP开发的高性能核心板卡。对外接口采取邮票孔连接方式&#xff0c;可以极大提高信号传输质量和焊接后的机械强度。核心板卡的系统框图如下图所示。 图 FPGADSP核心板系统框图 FPGA采用中科亿海微136K LUT资源EQ6HL130…

CentOS 7 虚拟机网络配置异常 典型问题:启动了NetworkManager但是network无法启动

问题背景 在 VMware 虚拟机中使用 CentOS 7 时&#xff0c;出现以下网络问题&#xff1a; 命令行重启网络服务失败&#xff0c;提示 RTNETLINK answers: File exists 等冲突错误图形界面网络设置无法打开&#xff0c;提示需要启动 NetworkManager网卡 ens33 无法获取 IPv4 地…

细节/数学/滑动窗口

题目意思&#xff1a; 判断字符串是否可以按照题目条件缩短。 思路&#xff1a; 用栈的思想写&#xff0c;对每一次的大小写都进行滚动判断。 tips&#xff1a; 这里面要注意的东西就有一点多了&#xff0c;首先是字符串的遍历问题auto更方便&#xff0c;其次是对小写和大…

WebeServer实现:学到了哪些东西

前言 这里话就是总结一下之前没讲过的一些东西 系统调用 accept与accept4   当我们调用accept接收一个新的fd的时候&#xff0c;往往需要在调用fcntl将这个fd变成非阻塞IO,那么有没有一个系统调用可以一次性做完这两件事呢&#xff0c;有的有的就是accept4. // accept 函数…

React 虚拟dom

JSX创建出ReactElement对象 最终形成一个JS树 将React.createElement对象转为真实DOM的方法使用render函数 为什么要虚拟 dom 状态难以跟踪 ## 操作真实dom开销大 &#xff0c;并且操作会引起频繁的回流和重绘&#xff0c;并且不涉及批处理 声明式编程 从虚拟dom向真实dom去…

Spring MVC异常处理机制

Spring MVC提供了多种异常处理机制,以下是核心处理方式及实现方法: 一、局部异常处理(Controller级别) @ExceptionHandler注解 在Controller内部定义异常处理方法,捕获当前控制器抛出的指定异常。@Controller public class UserController {@GetMapping("/test"…

MySQL 8.x配置MGR高可用+ProxySQL读写分离(一):MGR构建MySQL高可用

#作者&#xff1a;stackofumbrella 文章目录 简介MGR优点MGR缺点MGR适用场景单主模式和多主模式组复制介绍组复制插件架构图单主模式多主模式配置主机名解析安装MGR插件 MGR故障转移恢复MGR集群 简介 MGR&#xff08;MySQL Group Replication&#xff09;是MySQL 5.7.17版本诞…

保安员证考试的理论知识部分,重点考查的法律法规具体有哪些?

保安员证考试理论知识部分&#xff0c;重点考查的法律法规主要有以下几种&#xff1a; 《保安服务管理条例》&#xff1a;作为保安行业的专门法规&#xff0c;是考试核心。重点考查保安服务活动规范&#xff0c;如保安服务的范围、资质要求等&#xff1b;保安员的权利与义务&am…

【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记(附 异常处理)

&#x1f680; 将所有 WSL 发行版从 C 盘迁移到 I 盘的完整教程&#xff08;含 Podman / NVIDIA Workbench / Ubuntu 等&#xff09; 【无标题】使用 Chocolatey 安装 WSL 管理工具 LxRunOffline-CSDN博客 免责声明 重要提示 在执行 WSL 迁移操作前&#xff0c;请务必仔细阅读…

Oracle APEX 通过rtf模板下载PDF文件(BIP)

1. 上传模板文件 共享组件 > 报表布局 2. 编写SQL文 共享组件 > 报表查询 报表布局中选择1中设置完的报表布局&#xff0c;然后编写SQL文提供数据 3. 添加下载按钮 在页中添加一个下载按钮&#xff0c;添加动态操作&#xff0c;选择打印报告 4. 下载PDF文件 点击Pri…

Web Seach 搜索 MCP 启动!

&#x1f680; 开启你的 AI 助手搜索能力&#xff01;开源 Web 搜索 MCP 服务器上线&#xff01; 在 ChatGPT、Claude 等 AI 工具成为生产力新核心的今天&#xff0c;我们往往面临一个尴尬的问题&#xff1a;模型不知道最新的网络信息。虽然 GPT-4o 和 Claude 支持联网功能&am…

005微信小程序npm包_全局数据共享和分包

npm包_全局数据共享和分包 1. 使用npm包1.1 Vant Weapp1.2 API Promise化 2. 全局数据共享3. 分包3.1 分包的加载规则3.2 分包的体积限制3.3 使用分包3.3 独立分包3.4 分包预下载 1. 使用npm包 小程序对npm进行了支持与限制&#xff0c;限制如下&#xff1a; 不支持依赖于 No…

DPO直接偏好函数的学习解读

DPO, Direct Preference Optimization&#xff0c;采用直接优化策略满足人类偏好&#xff0c;使得LLM对于给定输入&#xff0c;生成能用输出的概率高于生成不能用输出的概率。 1&#xff09;DPO优化目标 在DPO训练过程中&#xff0c;模型通过最大化可用回答相对于不可用回答的…

【开源初探】基于 Qwen2.5VL的文档解析工具:docext

源码地址&#xff1a; https://github.com/NanoNets/docext 概述 docext 是一个由视觉语言模型&#xff08;vlm&#xff09;提供支持的全面的本地文档智能工具包。vlm 使用的是基于 Qwen2.5VL-3B 的模型&#xff0c;应该是在此模型基础上进行的微调。 它提供了三个核心功能&…

Python 正确重载运算符(增量赋值运算符)

增量赋值运算符 Vector 类已经支持增量赋值运算符 和 * 了&#xff0c;如示例 13-15 所示。 示例 13-15 增量赋值不会修改不可变目标&#xff0c;而是新建实例&#xff0c;然后 重新绑定 >>> v1 Vector([1, 2, 3]) >>> v1_alias v1 # ➊ >>> …

XCUITest + Objective-C 详细示例

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】

redis分布式锁 Redisson在电商平台开发中的实际应用

目录 概述 Redis分布式锁的实现方式 1. 基于SETNX命令&#xff08;String类型&#xff09; 2. 使用SET命令的NX和EX参数&#xff08;推荐方式&#xff09; 3. 基于Lua脚本实现复杂逻辑 4. RedLock算法&#xff08;多节点Redis实现&#xff09; Redisson的分布式锁 Redis…

joomla 使用nginx服务器只能打开首页,其他页面404的解决方案

最近一个客户将Joomla4网站从原先的Apache服务器改为Nginx服务器&#xff0c;整个过程一切顺利&#xff0c;但还原网站后发现只能打开首页&#xff0c;其他页面都是404。这个问题需要修改nginx的配置文件来解决。 伪静态 在Apache中使用.htaccess来完成伪静态路由的转发&…

湖北理元理律师事务所企业债务纾困路径:司法重整中的再生之道

中小企业债务危机常呈现“担保链扩散”特征&#xff0c;单一债务可能引发企业崩盘。湖北理元理律师事务所通过预重整制度与企业债务重组技术&#xff0c;探索出“司法保护商业谈判”的纾困模式。 一、企业债务风险处置四步法 紧急止血 申请司法保护&#xff1a;通过诉前调解…