日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/1 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]关于HTTP服务器每个客户端2个连接的限制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這兩天貓在家里搞一個多線程的斷點續傳得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;
}

轉載于:https://www.cnblogs.com/fungchou/archive/2008/06/26/1230596.html

總結

以上是生活随笔為你收集整理的[转]关于HTTP服务器每个客户端2个连接的限制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。