【转】关于HTTP服务器每个客户端2个连接的限制

简介: http://www.cnblogs.com/lishenglyx/archive/2010/01/07/1641190.html       这两天猫在家里搞一个多线程的断点续传得C#程序,发现同时只能开2个线程下载,其他的线程一律要等待,这样就导致下载大文件时其他线程经常超时,郁闷好久。

http://www.cnblogs.com/lishenglyx/archive/2010/01/07/1641190.html

 

    这两天猫在家里搞一个多线程的断点续传得C#程序,发现同时只能开2个线程下载,其他的线程一律要等待,这样就导致下载大文件时其他线程经常超时,郁闷好久。今天回公司无意中发现了一个帖子,终于真相大白了, 

 

      现摘录如下:

      这几天在做IIS 6上Web Service (WSE 2.0)的性能测试。在这个过程中陆续发现和解决了一些问题。
其中有一个问题比较有意思。我和项目组的同事发现,不论我们用C#写的模拟客户端用多少并发量来连接Web Service,服务器端监测到的并发连接数(性能记数器中的Web Service/Current Connections)总是每客户端最高2个。这使得我们无法查看服务器在大并发量下的真切反应。
      那么为什么服务器会对每客户端做出最高2个并发量的限制呢?
      通过查找资料,我找到了问题的根源。原来,在HTTP 1.1 Spec中针对Persistent Connections提出了这样的Practical considerations:
      Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion.
      以上内容表明,为了提高HTTP响应时间以及避免产生网络堵塞,HTTP连接中的客户端不应该与服务器端建立超过2个的HTTP连接。如果有更多的请求需 要,那么这些请求将被pipeline到这两个HTTP连接之中,并以异步的方式传送给服务器端。举个例子:有上百辆汽车(requests)想从天津开 往北京,但是天津与北京之间最多只允许修建两条公路(HTTP connection),因此这些汽车要想从天津驶往北京的话,就只能走这两条公路。
      但是,有时的确需要突破这样的限制。比如我一开始提到的性能测试,我需要用尽可能少的客户端程序来模拟尽可能多的用户访问,而不能为了模拟1000个并发量同时使用500台机器来测。那么应该怎样通过一个测试应用程序来产生指定的并发数量呢?
      不难看出,为了提高单一测试应用程序所产生的并发量,就应该增加两个指标:网络客户端数量和单一客户端的HTTP连接数量。就我所知,可以通过以下两种方法来分别提高这两个指标。

方法一:使用AppDomain
      在. NET中,一个AppDomain就被视为网络连接中的一个客户端,因此如果希望用一个测试应用程序模拟多个客户端,那么只须创建多个AppDomain 即可。需要注意的是,对于每一个AppDomain,最高2个的连接限额仍然存在,不同之处只是我们可以使用一个测试应用程序发送超过2个的并发请求了 (现在为了模拟1000个并发量就不需要找500台测试机器了)。请看下面的代码:

AppDomain appDomain = AppDomain.CreateDomain("");
appDomain.ExecuteAssembly(@"TestClient.exe");
AppDomain.Unload(appDomain);

      在这里,我通过调用AppDomain的静态方法CreateDomain创建了一个新的应用程序域,并要求该应用程序域执行一个应用程序 TestClient.exe。该应用程序将负责向服务器发送请求(最多只能建立两个连接)。你可以通过多线程的方式来驱动上述代码,使得大量应用程序域 在近乎相同的时间里被创建,从而就可以模拟指定数量的客户端,并产生所希望的并发访问量。

方法二:使用配置文件
      除了增加客户端数量以外,我们还可以增加单一客户端所能建立的HTTP连接数量。在.NET中实现这一目标非常容易,只需要在客户端(没错,是客户端!)的配置文件中增加以下几行即可:

<system.net>
 <connectionManagement>
  <add address="*" maxconnection="100"/>
 </connectionManagement>
</system.net>

      其中,connectionManagement节点负责指定客户端与某一网络主机之间所能建立的最高连接数量。它在Machine.config文件中 的默认取值就是2。我们完全可以在应用程序级的配置文件中对这一限额做出更改。address属性表明该连接限额针对的是哪一个网络地址,*表明所有的网 络主机;如果写成address="www.google.com"就表明后面的maxconnection只适用于对google的访问。
好了,现在就可以根据自己的需要来更改配置了。如果你把maxconnection的取值改成了1000,那么你的测试应用程序与服务器之间所能建立的最高连接数量就是测试用应用程序域的数量 * 1000,测吧!

方法三:

ServicePointManager.DefaultConnectionLimit = 1000;

方法四:

protected override WebRequest GetWebRequest(Uri uri) { 
    HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(uri); 
    ServicePoint currentServicePoint = req.ServicePoint; 
    currentServicePoint.ConnectionLimit = 1000; 
   return req; 
}

 

目录
相关文章
|
12月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
717 18
|
11月前
|
安全
基于Reactor模式的高性能服务器之Acceptor组件(处理连接)
本节介绍了对底层 Socket 进行封装的设计与实现,通过 `Socket` 类隐藏系统调用细节,提供简洁、安全、可读性强的接口。重点包括 `Socket` 类的核心作用(管理 `sockfd_`)、成员函数的功能(如绑定地址、监听、接受连接等),以及 `Acceptor` 组件的职责:监听连接、接收新客户端连接并分发给上层处理。同时说明了 `Acceptor` 与 `EventLoop` 和 `TcpServer` 的协作关系,并展示了其成员变量和关键函数的工作机制。
242 2
|
10月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle客户端与服务器端连接建立的过程
Oracle数据库采用客户端-服务器架构,客户端通过其网络环境与服务器通信,实现数据库访问。监听程序负责建立连接,通过命令lsnrctl可启动、停止及查看监听状态。本文介绍了监听器的作用及相关基础管理操作。
396 0
|
10月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
11月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
11月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
717 0
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
397 19
|
网络安全 开发者
如何解决HTTPS协议在WordPress升级后对网站不兼容的问题
以上就是解决WordPress升级后HTTPS协议对网站的不兼容问题的方法。希望能把这个棘手的问题看成是学校的管理问题一样来应对,将复杂的技术问题变得更加有趣和形象,并寻觅出解决问题的方式。希望你的网站能在新的学期得到更好的发展!
331 19
|
JSON 安全 网络协议
HTTP/HTTPS协议(请求响应模型、状态码)
本文简要介绍了HTTP与HTTPS协议的基础知识。HTTP是一种无状态的超文本传输协议,基于TCP/IP,常用80端口,通过请求-响应模型实现客户端与服务器间的通信;HTTPS为HTTP的安全版本,基于SSL/TLS加密技术,使用443端口,确保数据传输的安全性。文中还详细描述了HTTP请求方法(如GET、POST)、请求与响应头字段、状态码分类及意义,并对比了两者在请求-响应模型中的安全性差异。
1115 20