2014-10-29 50 views
4

我明白規則,即如果客戶端和服務器都支持持續連接,則可以通過第一個請求中的Connection:keep-alive標頭使用它。之後,客戶端和服務器在完成第一個請求/響應時仍然保持底層TCP連接處於打開狀態,然後在以下請求/響應中使用相同的連接。Go如何處理HTTP保持活動狀態?

我不清楚的是編程模型。考慮去下面的客戶端代碼:

resp, _ := client.Get("http://www.stackoverflow.com") 
// do some other things 
resp, _ = client.Get("http://www.stackoverflow.com/questions") 

據我所知,keep-alive是在HTTP/1.1的默認策略。

Q1:這兩個請求是否使用相同的TCP連接?

在服務器端:

當一個請求到來時,轉到HTTP框架將分派到處理器,然後由於保持活躍,該框架應爲同一TCP連接上的下一個請求準備。但是我在處理程序中看不到任何塊模式讀取代碼。所以,

Q2:Go HTTP框架是否使用某種非阻塞模式來處理保持活動?

我的意思是,處理程序不會阻塞讀取,但只是返回時完成請求,然後框架將輪詢每個非阻塞TCP連接,如果其中一個有數據到達,它將其調度到一個關聯的處理程序等。僅當請求的頭部爲Connection:Close時,框架將在處理程序返回時關閉TCP連接。

回答

3

Q1:這兩個請求是否使用相同的TCP連接?

是的,如果連接未被服務器關閉,http.Transport可以在默認配置中重新使用該連接。

問題2:http框架是否使用某種非塊模式來處理保持活動?

去HTTP服務器處理保持連接是默認的。沒有這種東西像HTTP「非塊模式」。它按照HTTP規範的描述以串行方式處理單個連接上的請求和響應。

+0

邏輯上,當http框架完成處理請求時,它應該從tcp讀取以等待下一個請求。我認爲**讀**會阻止,直到數據到來,但我不認爲框架塊。那麼這是如何實施的? – dastan 2014-10-29 16:09:13

+0

@ H.W.Du:如果你想知道它是如何實現的,請閱讀源代碼。處理請求的實際循環當前位於[http/server.go](http://golang.org/src/pkg/net/http/server.go)的'func(c * conn)serve()'中。 – JimB 2014-10-29 17:25:25

相關問題