IIS使用指南之五 :深入理解Socket Pooling(套接字池)http://www.winsvr.org/info/info.php?sessid=&infoid=52&page=2

可能很多朋友都遇到過這個現象:在啓動IIS時,你會發現IIS會將Web站點中配置的服務端口(例如TCP 80)綁定在計算機的所有IP地址上,而不僅僅是分配給Web站點的IP地址,這是爲什麼呢?

這個特性稱爲Socket Pooling(套接字池)套接字(Socket )是IP地址和端口的組合,用於進行網絡通訊,任何應用程序需要和網絡上的其他應用程序進行通許時,必須具有相應的套接字,例如Web站點偵聽客戶的HTTP請求,那麼它就綁定在相應的套接字(IP地址和端口,例如端口爲標準的TCP 80)上。在IIS 4.0中,微軟發現當多個Web站點分別通過不同的套接字綁定在不同的IP地址時,會佔用較多的系統資源,於是在IIS 5.0中引入了Socket Pool(套接字池)這個概念,它的工作原理是這樣的:IIS啓動時會將所有Web站點配置的服務端口綁定在計算機的所有IP地址上(運行Netstat -ano可以看到,這些Web服務端口偵聽的IP地址是代表所有IP地址的“0.0.0.0”),而不管這些IP地址是否分配給了這些Web站點,IIS把綁定的這些套接字稱爲套接字池;然後IIS再將套接字池中的套接字根據Web站點的配置分配到相應的Web站點,這樣避免了不同Web站點佔用不同IP地址的相同Web服務端口時需要不同的套接字,從而減少了系統資源的佔用,提高了IIS的性能。

需要注意的是,Web站點所分配的IP地址是從IIS的套接字池中進行再分配的,因此你不能分配套接字池中不具有的IP地址給Web站點,這會導致Web站點無法工作。

IIS的所有組件均具有Socket Pooling特性。雖然這樣提高了IIS的性能,但是也導致了其他應用程序不能再綁定端口到這些IP地址上。例如Web站點偵聽TCP 80端口,那麼IIS啓動時會偵聽所有IP地址上的TCP 80端口,此時如果在ISA防火牆中做Web服務發佈,需要偵聽相應的IP地址(例如外部接口的IP地址)上的TCP 80端口,那麼ISA防火牆的端口綁定就會失敗,因爲IIS已經佔用了這些端口。

在這篇文章中,我主要給大家介紹如何處理IIS 6中Web服務的Socket Pooling(套接字池)現象。注意我在此使用的是“現象”這個詞,因爲我覺得Socket Pooling並不是問題,雖然很多人都這樣認爲。如果你並沒有其他應用程序需要佔用IIS套接字池中的端口,你根本就不需要對Socket Pooling進行任何處理。

還記得在IIS使用指南之一 :IIS 6 新特性一文中所描述的IIS 6的新架構嗎?在IIS 5中,Socket Pooling是作爲Metabase的一個可配置屬性出現;而在IIS 6中是由HTTP.sys來偵聽客戶發送的HTTP請求,因此也是由它來處理Socket Pool。HTTP.sys使用一個IP地址包含列表來決定自己偵聽HTTP請求的IP地址,在每次啓動時讀取此列表並依照此列表進行配置。默認情況下,此IP地址包含列表並不包含任何IP地址,因此HTTP.sys偵聽本地計算機的所有IP地址。此IP地址包含列表不能通過IIS管理控制檯或者修改Metabase.xml來進行配置,你必須通過微軟提供的Windows支持工具httpcfg來配置。

httpcfg工具專用於HTTP.sys的配置,它作爲Windows支持工具,附帶在Windows Server 2003的安裝光盤中。我們首先需要安裝Windows支持工具,放入Windows Server 2003安裝光盤,雙擊運行“光盤根目錄/Support/Tools/”下的Support.msi文件,跟隨提示進行安裝。

安裝完成後點擊開始所有程序,指向Windows Support Tools,然後選擇Command Prompt,此時即可運行httpcfg。

我在一臺綁定了兩個IP地址的Web服務器上給大家進行演示,如下圖所示,Web服務器綁定了10.1.1.910.1.1.10這兩個IP地址,IIS中的默認網站的Web服務端口是TCP 80,因此HTTP.sys偵聽所有IP地址的80端口。

現在我先查詢一下HTTP.sys的IP地址包含列表,運行以下命令:

httpcfg query iplisten

如下圖所示,返回的錯誤代碼1168的含義是找不到匹配元素,這代表IP地址包含列表目前沒有任何元素,因此HTTP.sys偵聽本地計算機的所有IP地址。

現在我們爲IP地址包含列表添加一個IP地址,例如,我想讓HTTP.sys只是偵聽10.1.1.9這個IP地址,則運行以下命令:

httpcfg set iplisten -i 10.1.1.9

如下圖所示,返回的錯誤代碼0代表成功完成。因爲HTTP.sys只是在啓動時讀取此IP地址包含列表,所以此時我們需要重啓HTTP.sys。

運行以下命令重啓HTTP.sys:

net stop http /y

net start w3svc

如下圖所示,HTTP.sys成功重啓。

再查詢一下IP地址包含列表和HTTP.sys偵聽Web服務的端口,如下圖所示,已經修改爲10.1.1.9了。

 

我們試着在IIS中爲Web站點分配一個並未包含在HTTP.sys IP地址包含列表中的IP地址,例如10.1.1.10

此時,你會發現,此Web站點已經停止服務了,當你試着啓動它時,錯誤提示不能訪問網絡位置

另外需要注意的是,如果你需要通過localhost來訪問Web站點,那麼你需要將環回IP地址127.0.0.1加入到IP地址包含列表中,如下圖所示:

 

最後,如果你想還原Socket Pool,則刪除IP地址包含列表中的所有IP地址即可,運行以下命令:

httpcfg delete iplisten -i 127.0.0.1

httpcfg delete iplisten -i 10.1.1.9

結果如下圖所示,

 

然後重啓HTTP.sys即可。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章