02 网络面经:一个TCP连接可以发送多少个HTTP请求?

简介: 02 网络面经:一个TCP连接可以发送多少个HTTP请求?

一个TCP连接可以发送多少个HTTP请求?就这这个问题,我们聊聊TCP、HTTP以及浏览器之间的关系和对请求处理的优化。

TCP与HTTP的渊源

我们知道TCP协议对应于传输层,HTTP协议对应于应用层。WEB项目中,HTTP协议是建立在TCP的基础上的。

最初浏览器从服务器加载一个网页,会发起一个HTTP请求,这时需要先建立一个TCP连接。当本次数据请求完毕之后,会立刻断开TCP连接。

但随着时间的推理,HTML网页内容越来越复杂,不仅有内容,还有JS、CSS和图片资源,每个资源的请求都建立一次TCP连接,效率就会很低。

这时,Keep-Alive就被提出用来了,专门用于解决效率低的问题。

本文关于TCP连接能够发送多少个HTTP请求,本质上就是围绕着解决通信的低效问题的。

下面我们通过几个常见的面试问题,来逐步揭开这其中包含的知识点。

问题一:浏览器建立TCP连接之后,完成一次HTTP请求,是否会断开?

HTTP协议Header中的Connection属性决定了连接是否持久,不同HTTP协议版本有所不同。

HTTP/1.0中Connection默认为close,即每次请求都会重新建立和断开TCP连接。缺点:建立和断开TCP连接,代价过大。

HTTP/1.1中Connection默认为keep-alive,即连接可以复用,不用每次都重新建立和断开TCP连接。超时之后没有连接则主动断开。可以通过声明Connection为close进行关闭。

优点:TCP连接可被重复利用,减少建立连接的损耗,SSL的开销也可以避免。刷新页面时也可以复用,从而不再建立SSL连接等。

结论:默认情况下(HTTP/1.1)建立TCP连接不会断开,只有在请求报头中声明Connection: close才会请求完成之后关闭连接。不断开的最终目的是减少建立连接所导致的性能损耗。

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

如果Connection为close,则一个TCP连接只对应一个HTTP请求。

如果Connection为Keep-alive,则一个TCP连接可对应一个到多个HTTP请求。

问题三:一个TCP连接中,可以同时发送多个HTTP请求吗?

HTTP/1.1中单个TCP连接在同一时刻只能处理一个请求。HTTP/1.1在RFC 2616中规定了Pipelining来解决这个问题,但浏览器默认是关闭的。

RFC 2616中规定:一个支持持久连接的客户端可以在一个连接中发送多个请求(不需要等待任意请求的响应)。收到请求的服务器必须按照请求收到的顺序发送响应。

Pipelining本身存在一些问题,比如代理服务器不能正确处理HTTP Pipelining、Head-of-line Blocking连接头阻塞(首个请求耗时过长,阻塞其他请求)。所以,浏览器默认关闭该功能。

HTTP/2.0提供了多路复用技术Multiplexing,一个TCP可以并发多个HTTP请求(理论无上限,但是一般浏览器会有TCP并发数的限制)。

HTTP/1.1中为了提升性能,通常会采用连接复用和同时建立多个TCP连接的方式提升性能。

结论:HTTP/1.1中存在Pipelining技术支持一个连接发送多个请求,但存在弊端,浏览器默认关闭。HTTP/2.0中通过多路复用技术支持一个TCP连接中并发请求HTTP。

问题四:浏览器对同一Host建立TCP连接的数量有没限制?

不同浏览器限制不同,比如Chrome最多允许同一个Host可建立6个TCP连接。

如果服务器只支持HTTP/1.1,浏览器会采用在同一个Host下建立多个TCP连接来进行效率提升。如果是基于HTTPS传输,在SSL握手之后,还会尝试协商是否可以采用HTTP/2.0的Multiplexing功能。

问题五:keep-alive使用场景及优缺点

开启keep-alive对内存要求高,关闭keep-alive对CPU要求高;如果内存和CPU都足够,开启和关闭keep-alive对性能影响不大;如果考虑服务器压力,如果是静态页面,大量的调用js或者图片的话,建议开启keep-alive;如果是动态网页,建议关闭keep-alive。

注意事项:如果需要使用keep-alive功能,服务器端如果使用nginx中keepalive_timeout值要大于0。

小结

通过上面的整体分析,我们不仅了解了TCP与HTTP之间的关系,还明确了现代浏览器基于不同的HTTP协议所作出的网络层面优化。而HTTP2/0的多路复用机制还是一些高性能框架的基础,比如gRPC的实现。

目录
相关文章
|
19天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
46 4
|
19天前
|
JSON API 开发者
Python网络编程新纪元:urllib与requests库,让你的HTTP请求无所不能
【7月更文挑战第31天】互联网的发展使网络编程成为软件开发的关键部分. Python以简洁、功能强大著称, 在此领域尤显突出. `urllib`作为标准库, 自Python初期便支持URL处理, 如读取URL (`urllib.request`) 和解析 (`urllib.parse`). 尽管API底层, 但奠定了网络编程基础.
34 4
|
3天前
|
JSON API 数据格式
Python网络编程:HTTP请求(requests模块)
在现代编程中,HTTP请求几乎无处不在。无论是数据抓取、API调用还是与远程服务器进行交互,HTTP请求都是不可或缺的一部分。在Python中,requests模块被广泛认为是发送HTTP请求的最简便和强大的工具之一。本文将详细介绍requests模块的功能,并通过一个综合示例展示其应用。
|
1天前
|
网络协议 前端开发 JavaScript
解析HTTP/2如何提升网络速度
【8月更文挑战第18天】HTTP/1.1通过持久连接、多连接及CDN分片优化了资源加载,但仍受TCP慢启动、带宽竞争及队头阻塞等问题影响。HTTP/2采用单长连接传输所有数据,解决上述问题。
|
11天前
|
网络协议 Java 关系型数据库
16 Java网络编程(计算机网络+网络模型OSI/TCP/IP+通信协议等)
16 Java网络编程(计算机网络+网络模型OSI/TCP/IP+通信协议等)
40 2
|
19天前
|
缓存 网络协议 算法
(二)Java网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称加密原理!
作为一名程序员,尤其是Java程序员,那必须得了解并掌握HTTP/HTTPS相关知识。因为在如今计算机网络通信中,HTTP协议的作用功不可没,无论是日常上网追剧、冲���、亦或是接口开发、调用等,必然存在HTTP的“影子”在内。尤其对于WEB开发者而言,HTTP几乎是每天会打交道的东西。
45 10
|
11天前
|
机器学习/深度学习 数据可视化 Python
如何可视化神经网络的神经元节点之间的连接?附有Python预处理代码
该博客展示了如何通过Python预处理神经网络权重矩阵并将其导出为表格,然后使用Chiplot网站来可视化神经网络的神经元节点之间的连接。
18 0
如何可视化神经网络的神经元节点之间的连接?附有Python预处理代码
|
20天前
|
数据采集 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
【7月更文挑战第30天】在网络数据抓取中,Python的`requests`库凭借其简洁的API和强大功能脱颖而出。首先确保已通过`pip install requests`安装库。实战演练包括:发送GET请求获取数据(如`requests.get(url)`),处理JSON响应(利用`.json()`方法解析),添加请求头以绕过反爬虫机制(如设置`User-Agent`),以及发送POST请求提交数据。掌握这些技能的同时,务必遵守法律法规和网站政策。
41 6
|
20天前
|
数据采集 网络协议 API