[转]关于HTTP服务器每个客户端2个连接的限制
這兩天貓?jiān)诩依锔阋粋€(gè)多線程的斷點(diǎn)續(xù)傳得C#程序,發(fā)現(xiàn)同時(shí)只能開(kāi)2個(gè)線程下載,其他的線程一律要等待,這樣就導(dǎo)致下載大文件時(shí)其他線程經(jīng)常超時(shí),郁悶好久。今天回公司無(wú)意中發(fā)現(xiàn)了一個(gè)帖子,終于真相大白了, 
 ????? 現(xiàn)摘錄如下:
????? 這幾天在做IIS 6上Web Service (WSE 2.0)的性能測(cè)試。在這個(gè)過(guò)程中陸續(xù)發(fā)現(xiàn)和解決了一些問(wèn)題。
 其中有一個(gè)問(wèn)題比較有意思。我和項(xiàng)目組的同事發(fā)現(xiàn),不論我們用C#寫(xiě)的模擬客戶端用多少并發(fā)量來(lái)連接Web Service,服務(wù)器端監(jiān)測(cè)到的并發(fā)連接數(shù)(性能記數(shù)器中的Web Service\Current Connections)總是每客戶端最高2個(gè)。這使得我們無(wú)法查看服務(wù)器在大并發(fā)量下的真切反應(yīng)。
 ????? 那么為什么服務(wù)器會(huì)對(duì)每客戶端做出最高2個(gè)并發(fā)量的限制呢?
 ????? 通過(guò)查找資料,我找到了問(wèn)題的根源。原來(lái),在HTTP 1.1 Spec中針對(duì)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.
 ????? 以上內(nèi)容表明,為了提高HTTP響應(yīng)時(shí)間以及避免產(chǎn)生網(wǎng)絡(luò)堵塞,HTTP連接中的客戶端不應(yīng)該與服務(wù)器端建立超過(guò)2個(gè)的HTTP連接。如果有更多的請(qǐng)求需要,那么這些請(qǐng)求將被pipeline到這兩個(gè)HTTP連接之中,并以異步的方式傳送給服務(wù)器端。舉個(gè)例子:有上百輛汽車(chē)(requests)想從天津開(kāi)往北京,但是天津與北京之間最多只允許修建兩條公路(HTTP connection),因此這些汽車(chē)要想從天津駛往北京的話,就只能走這兩條公路。
 ????? 但是,有時(shí)的確需要突破這樣的限制。比如我一開(kāi)始提到的性能測(cè)試,我需要用盡可能少的客戶端程序來(lái)模擬盡可能多的用戶訪問(wèn),而不能為了模擬1000個(gè)并發(fā)量同時(shí)使用500臺(tái)機(jī)器來(lái)測(cè)。那么應(yīng)該怎樣通過(guò)一個(gè)測(cè)試應(yīng)用程序來(lái)產(chǎn)生指定的并發(fā)數(shù)量呢?
 ????? 不難看出,為了提高單一測(cè)試應(yīng)用程序所產(chǎn)生的并發(fā)量,就應(yīng)該增加兩個(gè)指標(biāo):網(wǎng)絡(luò)客戶端數(shù)量和單一客戶端的HTTP連接數(shù)量。就我所知,可以通過(guò)以下兩種方法來(lái)分別提高這兩個(gè)指標(biāo)。
方法一:使用AppDomain
 ????? 在. NET中,一個(gè)AppDomain就被視為網(wǎng)絡(luò)連接中的一個(gè)客戶端,因此如果希望用一個(gè)測(cè)試應(yīng)用程序模擬多個(gè)客戶端,那么只須創(chuàng)建多個(gè)AppDomain 即可。需要注意的是,對(duì)于每一個(gè)AppDomain,最高2個(gè)的連接限額仍然存在,不同之處只是我們可以使用一個(gè)測(cè)試應(yīng)用程序發(fā)送超過(guò)2個(gè)的并發(fā)請(qǐng)求了(現(xiàn)在為了模擬1000個(gè)并發(fā)量就不需要找500臺(tái)測(cè)試機(jī)器了)。請(qǐng)看下面的代碼:
AppDomain appDomain = AppDomain.CreateDomain("");
 appDomain.ExecuteAssembly(@"TestClient.exe");
 AppDomain.Unload(appDomain);
????? 在這里,我通過(guò)調(diào)用AppDomain的靜態(tài)方法CreateDomain創(chuàng)建了一個(gè)新的應(yīng)用程序域,并要求該應(yīng)用程序域執(zhí)行一個(gè)應(yīng)用程序 TestClient.exe。該應(yīng)用程序?qū)⒇?fù)責(zé)向服務(wù)器發(fā)送請(qǐng)求(最多只能建立兩個(gè)連接)。你可以通過(guò)多線程的方式來(lái)驅(qū)動(dòng)上述代碼,使得大量應(yīng)用程序域在近乎相同的時(shí)間里被創(chuàng)建,從而就可以模擬指定數(shù)量的客戶端,并產(chǎn)生所希望的并發(fā)訪問(wèn)量。
方法二:使用配置文件
 ????? 除了增加客戶端數(shù)量以外,我們還可以增加單一客戶端所能建立的HTTP連接數(shù)量。在.NET中實(shí)現(xiàn)這一目標(biāo)非常容易,只需要在客戶端(沒(méi)錯(cuò),是客戶端!)的配置文件中增加以下幾行即可:
<system.net>
 ?<connectionManagement>
 ? <add address="*" maxconnection="100"/>
 ?</connectionManagement>
 </system.net>
????? 其中,connectionManagement節(jié)點(diǎn)負(fù)責(zé)指定客戶端與某一網(wǎng)絡(luò)主機(jī)之間所能建立的最高連接數(shù)量。它在Machine.config文件中的默認(rèn)取值就是2。我們完全可以在應(yīng)用程序級(jí)的配置文件中對(duì)這一限額做出更改。address屬性表明該連接限額針對(duì)的是哪一個(gè)網(wǎng)絡(luò)地址,*表明所有的網(wǎng)絡(luò)主機(jī);如果寫(xiě)成address="www.google.com"就表明后面的maxconnection只適用于對(duì)google的訪問(wèn)。
 好了,現(xiàn)在就可以根據(jù)自己的需要來(lái)更改配置了。如果你把maxconnection的取值改成了1000,那么你的測(cè)試應(yīng)用程序與服務(wù)器之間所能建立的最高連接數(shù)量就是測(cè)試用應(yīng)用程序域的數(shù)量 * 1000,測(cè)吧!
方法三:
ServicePointManager.DefaultConnectionLimit = 1000;
方法四:
protected override WebRequest GetWebRequest(Uri uri) { 
 ??? HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(uri); 
 ??? ServicePoint currentServicePoint = req.ServicePoint; 
 ??? currentServicePoint.ConnectionLimit = 1000; 
 ?? return req; 
 }
轉(zhuǎn)載于:https://www.cnblogs.com/fungchou/archive/2008/06/26/1230596.html
總結(jié)
以上是生活随笔為你收集整理的[转]关于HTTP服务器每个客户端2个连接的限制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: 多囊卵巢是哪些原因造成的,还能治疗好吗?
 - 下一篇: 收纳达人华灯初上过关攻略