高效管理http连接的方法

1.Http连接基础

Http协议承载了互联网上的主要流量,然而说到传输,还要回归到最基本的网络分层模型TCP/IP。TCP/IP是全球计算机及网络设备都在使用的一种常用的分组交互网络分层协议集。客户端可以打开一条TCP/IP连接,与世界上的任何服务器进行数据交换,并且交换的数据永远不会丢失,受损或失序。

下面是常见的TCP/IP分层协议,分为安全与非安全版本。

由图可知,HTTP的整个传输过程可以描述为“HTTP over TCP over IP”。TCP是可靠地传输协议,就好像一条管道,从TCP连接一段填入的字节会从另外一端以原有的顺序,正确的传送出来。

TCP层与IP层都有自己的协议,他们对数据的关注点不同。总的来说,TCP段包含了目的端口与源端口,用来建立程序之间的连接。IP段包含了目的IP与源IP,用来进行网络寻址,最终建立机器之间的连接。而一条TCP连接正是根据这四点唯一对应的:

<源IP地址,源端口号,目的IP地址,目的端口号>

不同的连接不可以拥有完全相同的四个属性。对于一般功能而言,自己发起的连接中源端口号是随机生成的。

2.http连接性能

由于http数据是通过TCP传输的,http连接的性能很大程度上取决于TCP通道的性能。我们先分析一个正常的http事务。

客户端如果拿到的是域名,则需要先从DNS服务器中解析获得服务器IP地址,这个过程称为“DNS查询”,需要花费一定的时间。

客户端与服务器进行三次握手建立连接。

建立连接后,客户端会发送有真正含义的请求报文。

服务器接收到请求后开始处理。

服务器处理完毕后,发送响应给客户端。

客户端收到响应后,与服务器进行四次挥手,断开连接。

从上面的流程可以看出来,真正的有业务意义的阶段是“请求-处理-响应”,其他阶段时间消耗都是与业务无关的。因此可以从这上面思考如何优化TCP性能。

3.TCP连接性能聚焦

TCP连接的性能通常从下面5个方面考虑:

TCP建立握手

捎带确认的TCP延迟确认算法

TCP慢启动的拥塞控制

数据聚集的Nagle算法

TIME_WAIT时延与端口耗尽

3.1 TCP建立握手

从上面的图中可以看出,一次正常的交互需要经过DNS查询、握手、挥手等与数据传输无关的操作。如果每次传输的数据都很少,那么这种操作所占用的比例就会增加,这将大大降低HTTP的性能。由于HTTP是建立在TCP连接的基础上的,所以握手的过程是对HTTP不可见的,HTTP只能看到建立连接发生了时延。三次握手的过程这里不做赘述,感兴趣的请查阅相关资料。

三次握手简单来说是建立连接前的三次交互来确认连接可以建立,有SYN,ACK+SYN,ACK三次报文通信。对于一些小的HTTP事务,比如握手后告知页面304了,这种事务中在TCP建立上可能会法费一半甚至更多的时间。

解决方案:我们可以通过重用TCP连接来减少这种性能上的损失,比如持久连接。

3.2 延迟确认

因特网是无法保证数据可靠传输的,因为在网络路由超负荷的情况下,允许丢弃任意网络分组。所以,TCP实现了一套自己的确认机制来保障数据可靠传输。

每个TCP段都有一个序号和数据校验和,接受者在接受完整之后会向发送者送回确认分组,这样保证了这个分组的可靠传输。如果发送者在一定时间窗口内没有接收到响应的确认分组,则认为这个分组已经丢失,对该分组进行重发。

由于确认报文很小,所以TCP允许在发往相同方向的数据分组中对其进行“捎带”,就是这种捎带出了问题。TCP将返回确认信息与输出信息集合在一起,可以有效的利用网络连接。因此为了找到相同方向的数据分组来进行捎带,很多TCP栈实现了一种“延时确认”的算法。这种算法将确认信息放入缓冲区,在一定的时间窗口内(一般是100-200毫秒)找不到输出分组,则对确认数据进行单独发送。

如果请求响应并没有较多的数据传输过程,则满足捎带确认的可能性就很低。通常,延迟确认算法会引入相当大的时延。

解决方案:根据操作系统的不容,可以调整或禁止延迟确认算法。

3.3 慢启动与拥塞控制

TCP传输过程有慢启动与拥塞控制的概念。

TCP在建立连接开始的时候,会进行慢启动,数据窗口会逐渐指数变大,在达到阈值后会线性增长。当发生某次超时之后,会迅速减小窗口到最小,重新开始慢启动,通知减小之前的阈值。

在这种机制的保障下,一个TCP连接是会进行自我调整的,因此一个新的连接的传输效率是不如老连接的。

解决方案:我们通过重用连接,可以使得传输效率提升,比如持久连接。

3.4 Nagle算法与TCP_NODELAY

Nagle算法与延时确认算法有些类似。不过Nagle算法关注的是发送方,为了保证不大量发送小的数据报文造成3.1的问题。该算法鼓励每次发送大的数据组,如果数据分组不够大,则放在缓存区等待与其他数据分组结合起来达到上限后一起发送,或者其他分组被确认后发送。

而对于一些小的数据分组而言,可能很多个也无法攒够一次发送的数量。当这时接收端也采用延时确认算法之后,事情就变得恐怖了。对于发送端而言,很多小的数据分组没有成功发送,因为第一个分组发送之后,服务端进行了延时确认200ms,在这段时间过去之后发送端的第二个分组才会被发送,这样的排队阻塞简直是噩梦。

解决方案:可以在协议栈中设置TCP_NODELAY来禁用Nagle算法。

3.5 TIME_WAIT时延与端口耗尽

当一个TCP连接完成四次挥手关闭之后,会进入TIME_WAIT状态,在等待2MSL之后会释放该TCP连接。因为TCP的分组可能不是按照顺序到达的,我们假设一个分组在网络中最多存货1MSL,则2MSL之后基本上就可以认为确实结束了。如果在2MSL之间服务端没有接收到LAST_ACK发送的FIN对应的响应,则TIME_WAIT会再次发送ACK。

之前有说过,一个TCP可以通过下面四个属性来确认。

<源IP地址,源端口号,目的IP地址,目的端口号>

而对于一个服务来说,之后源端口是不确定的,因为每次源端口都是随机生成的。但是源端口是有数量限制的,比如60000个端口,MSL是60秒。则连接速率就被限制在60000/120=500次/秒。如果不进行相关的优化,操作系统就无法发起更多的连接。

解决方案:可以增加请求端机器,通过负载均衡的方法降低端口耗尽的可能性,或者在服务端使用几个虚拟IP增加连接的组合。 

4 总结

HTTP建立在TCP的基础上,如果我们在工作中发现HTTP建立连接的效率很低,可以考虑从上面的五个角度分析是否达到了相关的瓶颈,并通过推荐方案解决问题。

以上这篇高效管理http连接的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • IIS中保持HTTP连接的设置方法

    大多数 Web 浏览器要求服务器在多个请求中保持连接打开.这被称为保持 HTTP 连接.保持连接是一个 HTTP 规范,它能够显著增强服务器性能.如果没有它,浏览器将必须为包含多个元素(如图形)的页进行大量的连接请求.可能需要为每个元素进行单独连接.这些额外的请求和连接要求额外的服务器活动和资源,这将会降低服务器的效率.它们还会大大降低浏览器的速度和响应能力,尤其是在网络连接速度较慢的地方. 在安装进程中,将默认启用保持 HTTP 连接.启用后,保持连接的持续时间是连接超时设置允许的时间. 集成

  • 高效管理http连接的方法

    1.Http连接基础 Http协议承载了互联网上的主要流量,然而说到传输,还要回归到最基本的网络分层模型TCP/IP.TCP/IP是全球计算机及网络设备都在使用的一种常用的分组交互网络分层协议集.客户端可以打开一条TCP/IP连接,与世界上的任何服务器进行数据交换,并且交换的数据永远不会丢失,受损或失序. 下面是常见的TCP/IP分层协议,分为安全与非安全版本. 由图可知,HTTP的整个传输过程可以描述为"HTTP over TCP over IP".TCP是可靠地传输协议,就好像一条

  • SQL Server 2005 企业版没有 Management Studio管理工具的解决方法

    在网上找找了半天有以下几种情况: 1.可以直接装上,装上就有. 2.装上后没有,然后把sql 2005全部卸载后再装就有了. 3.装上后没有,从微软官方网站上下载一下:Microsoft SQL Server Management Studio Express, 装上就可以用了. 4.重装系统,先装SQL Server 2005,再装vs2008 看到上面的方法,对我来说可能只有第三种是最好的了,但他是Express,我这人好像有个这个缺 点,如果他不是最好的,而别人可以做到最好的,我就一定要让

  • android编程实现设置、打开wifi热点共享供他人连接的方法

    本文实例讲述了android编程实现设置.打开wifi热点共享供他人连接的方法.分享给大家供大家参考,具体如下: 用过快牙的朋友应该知道它们在两天设备之间传输文件的时候使用的是wifi热点,然后另一台便连接这个热点再进行传输.快牙传输速度惊人应该跟它的这种机制有关系吧.不知道它的搜索机制是怎样的,但我想应该可以通过热点的名字来进行判断吧.下面我们就来探讨一下如何自动创建一个wifi热点吧 创建wifi热点首先需要手机支持,建议开发的哥们整个好点的手机,我们公司那些个山寨设备,几近有一半是不支持热

  • django 数据库连接模块解析及简单长连接改造方法

    工作中纯服务端的项目用到了线程池和django的ORM部分.django 的数据库连接在每一个线程中开启一份,并在查询完毕后自动关闭连接. 线程池处理任务时,正常使用的连接中不会被关闭,但由于数据库端有最长连接时间的限制(默认为8小时),在超时后会发生InterfaceError: (0, '')(连接关闭后使用连接/游标)或Error(2006, 'MySQL server has gone away')(mysql 服务器主动关闭连接)这类错误,所以一般会在每个任务线程中调用django.d

  • C#中通过LRU实现通用高效的超时连接探测

    编写网络通讯都要面对一个问题,就是要把很久不存活的死连接清除,如果不这样做那死连接最终会占用大量内存影响服务运作!在实现过程中一般都会使用ping,pong原理,通过ping,pong来更新连接的时效性,最后通过扫描连接列表来清除掉.虽然这种做法比较简单,但很难抽取出通用性的封装,扫描整个列表复杂度也比较高.以下讲解如何通过LRU算法实现一个通用高效的探测超时连接功能类. 什么是LRU 在这里还是要大概介绍一下LRU,LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被

  • python实现socket+threading处理多连接的方法

    一.运行效果 先说两句,之前我在网上找的相关文章标题上写的是处理多连接,尼玛,全是假的.网上那些,根本不能异步处理多连接,不能主动给客户端发消息. 在服务端控制台输入1,查看在线人数. 给指定客户端发送消息. 二.开发思路 以下说的是服务端开发思路,客户端比较简单就不说了. 首先,需要明白的是socket的accept和recv这两个方法是阻塞线程的.这就意味着我们需要新开线程来处理这两个方法. 具体的程序流程大概是这样的: 1.新开一个线程用于接收新的连接(socket.accept()) 2

  • Mysql账户管理原理与实现方法详解

    本文实例讲述了Mysql账户管理原理与实现方法.分享给大家供大家参考,具体如下: 账户管理 在生产环境下操作数据库时,绝对不可以使用root账户连接,而是创建特定的账户,授予这个账户特定的操作权限,然后连接进行操作,主要的操作就是数据的crud MySQL账户体系:根据账户所具有的权限的不同,MySQL的账户可以分为以下几种 服务实例级账号:,启动了一个mysqld,即为一个数据库实例:如果某用户如root,拥有服务实例级分配的权限,那么该账号就可以删除所有的数据库.连同这些库中的表 数据库级别

  • 10分钟教你本地配置多个git ssh连接的方法

    前言 你最近换电脑了吗?还记得如何在本地配置多个 git ssh 连接吗?一般公司用的是自己内网部署的 gitlab 服务器进行代码管理,开发者使用的是公司的用户名和公司的邮箱,而在个人的开源项目中,我们的代码托管于 github,这个时候就需要两个或多个以上的 SSH-Key 去进行登录,方便代码的拉取与推送. 文章大纲 查看所有 ssh key 分别配置 gitlab 内网 和 github 外网 ssh 进行测试 第一步:查看所有 SSH-Key 打开 bash/zsh 终端:执行以下命令

  • 开启MySQL远程连接的方法

    MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1)来连接访问,这对于 Web-Server 与 MySql-Server 都在同一台服务器上的网站架构来说是没有问题的. 但随着网站流量的增加,后期服务器架构可能会将 Web-Server 与 MySql-Server 分别放在独立的服务器上,以便得到更大性能的提升,此时 MySql-Server 就要修改成允许 Web-Server 进行远程连接. 开启了远程连接,数据库的后期管理运维也不用每次都登到

  • Go实现Redis连接池方法

    目录 一.什么是连接池,连接池有什么用 二.代码展示 一.什么是连接池,连接池有什么用 先看看别人是怎么介绍连接池的吧: 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象.使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用.而连接的建立.断开都由连接池自身来管理.同时,还可以通过设置连接池的参数来控制连接池中的初始连接数.连接的上下限数以及每个连接的最大使

随机推荐