细讲一个 TCP 连接能发多少个 HTTP 请求(一)

news2025/5/31 20:11:44

一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DOM 怎么被构建,被绘制出来。但是你有没有想过,收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?

要搞懂这个问题,我们需要先解决下面五个问题:

  1. 现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?

  2. 一个 TCP 连接可以对应几个 HTTP 请求?

  3. 一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?

  4. 为什么有的时候刷新页面不需要重新建立 SSL 连接?

  5. 浏览器对同一 Host 建立 TCP 连接到数量有没有限制?

先来谈谈第一个问题:现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?

在 HTTP/1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。

所以虽然标准中没有设定,某些服务器对 Connection: keep-alive 的 Header 进行了支持。意思是说,完成这个 HTTP 请求之后,不要断开 HTTP 请求使用的 TCP 连接。

这样的好处是连接可以被重新使用,之后发送 HTTP 请求的时候不需要重新建立 TCP 连接,以及如果维持连接,那么 SSL 的开销也可以避免,两张图片是我短时间内两次访问网站的时间统计:

头一次访问,有初始化连接和 SSL 开销

初始化连接和 SSL 开销消失了,说明使用的是同一个 TCP 连接

持久连接:既然维持 TCP 连接好处这么多,HTTP/1.1 就把 Connection 头写进标准,并且默认开启持久连接,除非请求中写明 Connection: close,那么浏览器和服务器之间是会维持一段时间的 TCP 连接,不会一个请求结束就断掉。

所以第一个问题的答案是:默认情况下建立 TCP 连接不会断开,只有在请求报头中声明 Connection: close 才会在请求完成后关闭连接。

第二个问题:一个 TCP 连接可以对应几个 HTTP 请求?

了解了第一个问题之后,其实这个问题已经有了答案,如果维持连接,一个 TCP 连接是可以发送多个 HTTP 请求的。

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

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

相关文章

Android主页面进程卡死黑屏怎么办?多线程机制来解决

问题描述 在做一个页面跳转小案例,在输入页输入要计算第几项斐波那契数列,然后跳转到另一个页面显示计算的结果,当输入的值很大时,跳转到另一个页面时,页面卡死黑屏。 页面卡死黑屏问题原因 计算斐波那契数列的常规方法…

Linux--fork

一、fork入门知识 fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。可以简单地说fork()的作用就是创建一…

如何在Python里使用ChatGPT及ChatGPT是什么?怎么注册?

废话不多说,直接开干! 需要库 pip install openaiimport openai# Set your API keyopenai.api_key "你的chatgpt的密钥key"# Use the GPT-3 modelcompletion openai.Completion.create(engine"text-davinci-002",prompt"Once upon …

纯CSS实现[喵咪小挂件]

效果预览 网页上: 小程序中: 在微信小程序中使用时,将div标签改成view即可。 小程序中封装 如下,在小程序中可封装成组件(方便使用) 1、先在components目录下新建一个目录存放该组件。 2、右键上一步…

Unity-ROS与激光雷达小车搭建(五)

0. 简介 我们在第三章和第四章中详细介绍了如何使用URDF以及Navigation 2,而第五章开始我们将学习如何将前面所学的结合起来,来形成一个Unity与ROS完整且系统的框架 1. 创建并导入URDF 这一部分作为我们第三讲的内容,我们在之前的基础上通…

【STL】综述

STL,一文即可知 文章目录一、STL基本知识概述容器二、序列式容器详述数组容器array向量容器vector双端队列容器deque链式容器list正向链容器forward_list参考博客😊点此到文末惊喜↩︎ 一、STL基本知识 概述 STL六大组件(前三个是主要的&am…

在线支付系列【21】微信支付服务商接入前准备

有道无术,术尚可求,有术无道,止于术。 文章目录项目概述接入准备1. 注册服务商号(获取服务商mchid)2. 注册公众号(获取服务商APPID)3. 绑定应用ID和服务商ID4. 入驻子商户(特约商户进…

MyBatis基础知识

1 JDBC基础知识1.1 JDBC简介JDBC是使用Java语言操作关系型数据库的一套API,全称Java DataBase Connectivity,Java数据库连接。JDBC定义了操作所有关系型数据库的规则,同一套Java代码可以操作不同的关系型数据库。也就是JDBC是Java语言操作数据…

分布式高级篇3 —— RabbitMQ

一、RabbitMQ1、RabbitMQ 介绍2、RabbitMQ 的相关概念3、安装 RabbitMQ4、交换机类型(1)direct - 直连交换机(2)fanout - 扇出交换机(3)topic - 主题交换机5、RabbitMQ 管理界面6、SpringBoot 整合RabbitMQ…

Autowired注解源码解析

一、Autowired注解的原理的概览 我们都知道一个Bean的大致生命周期有这几个阶段,实例化--> 属性填充 --> 初始化 --> 销毁回调 其中Autowired作用的时间就是在属性填充阶段,而且是通过AutowiredAnnotation BeanPostProcessor类进行处理的。注…

android14预览版介绍及解读

​ 前言: android14快要来了,最近2月8日,android14的第一个开发者预览版发布了,正式版大约会和往常一样,大概率在六月份左右推出,八九月份时会有国内会有第一批手机支持安卓14。所以,本文就带…

为什么要用频谱分析仪测量频谱?

频谱分析仪是研究电信号频谱结构的仪器,用于信号失真度、调制度、谱纯度、频率稳定度和交调失真等信号参数的测量,可用以测量放大器和滤波器等电路系统的某些参数,是一种多用途的电子测量仪器。从事通信工程的技术人员,在很多时候…

免费下载学术文献的网站,好用!

推荐几款好用的免费下载学术文献网站,让你的查找文献环节更加事半功倍! 1、Open Access Library(OALib)图书馆让学者可以免费下载学术文献和论文,并在这个平台上发表自己的论文。提供Open Access数据库资源。 2、文献…

Spring Security实现RBAC权限模型练习

1.Spring Security介绍 Spring Security的核心功能就是认证、授权、攻击防护,Spring Boot项目启动之后会自动进行配置,其核心就是一组链式过滤器。 如下图所示,对于一个用户请求,Username Password Authentication Filter验证用…

2022年API安全研究报告

导读 API应用的增速与其安全发展的不平衡,使其成为恶意攻击的首选目标,围绕API安全的攻防较量愈演愈烈。 2022年API安全风险概况 2022年平均每月遭受攻击的API数量超21万 2022年全年平均每月遭受攻击的API数量超过21万,第二季度(4-6月)遭受攻击的API数量达到高峰,月均…

经典文献阅读之--IGP2(可解释性目标的自动驾驶预测与规划)

0. 简介 对于自动驾驶的预测和规划而言,能够有效的对目标产生可解释性是非常有必要的,而《Interpretable Goal-based Prediction and Planning for Autonomous Driving》文中就提出了一种综合的自动驾驶预测和规划系统,它利用合理的逆规划来…

php mysql娱乐场所运营管理系统

目 录 1 背景与意义 3 1.1 研究背景 3 1.2 国内外发展状况研究 3 2 系统开发环境与技术 4 2.1 PHP介绍 4 2.2 MYSQL介绍 5 2.3 APACHE介绍 6 2.4 dreameaver介绍 7 2.5 wamp介绍 7 3 系统分析 8 3.1 系统可行性分析 8 3.1.1 技术可行性 …

【编程基础之Python】1、初始Python

【编程基础之Python】1、初始Python初始Python什么是PythonPython的运行过程Python的应用领域如何学好Python初始Python Python是一种跨平台的、开源免费的、解释型的、面向对象的高级编程语言。 Python的应用领域非常广泛,包括客户端程序、服务器程序、移动端程序…

Redis未授权漏洞蜜罐模拟与捕获分析

1.概述 文章主要分析Redis未授权漏洞的原理及形成原因,使用vulhub靶场进行漏洞复现,在了解漏洞原理并复现的基础上使用golang编写蜜罐代码进行模拟,开放端口在网上捕获真实存在的恶意攻击行为,对恶意样本进行分析,总结…

C++与Lua交互实例 -- 矩阵的加减乘除(版本二)

C与Lua交互实例 – 矩阵的加减乘除(版本二) TIPS:关于使用矩阵的加减乘除测试C与Lua的交互以及下面没讲述到的知识点可以阅读第一版: https://blog.csdn.net/qq135595696/article/details/128960951 同时下面两个方式矩阵的数据都…