標籤:

關於keep-alive 這個問題?

我是做.net開發的,做http協議開發。我在對自己程序進行抓包的時候,發現在訪問同一個host的時候,有時候不需要握手包鏈接直接發包,而有時候又需要先建立握手包才發包,雖然這個是程序自己封裝的,編程的時候不用操心這個事兒。但是問題來了,我為了效率考慮,

1.如何在讓我軟體與網站一直建立http鏈接,也就是keepalive

2.這個keep alive的鏈接是對每一個httprequset而言,還是對當前程序進程而言,還是對整機而言,換言之。我建立多個鏈接,他們是公用一個握手包還是自己用自己實例的握手包鏈接

說點有點亂,請各位大蝦不吝指教


呃,,,,你分清楚TCP和HTTP協議沒?

HTTP協議沒有什麼握手包。

Keep-Alive是通知伺服器,在這個HTTP Request/Responset結束後,不要立即斷開TCP連接(注意是TCP連接,和HTTP沒有關係),後面的HTTP Request仍然可以通過這個TCP連接繼續傳送。

但是!這只是個建議,伺服器可能不支持,也可能忽略掉這個建議。也可能因為時間太久而直接斷開TCP連接

總之,一切皆有可能。

Keep-Alive只是通知伺服器,您先別掛,一會兒可能還有活兒,至於它掛不掛還是看它心情。

要一直開著HTTP連接,只能是:

1、客戶端一直告訴伺服器端我請求還沒發完,您先等著。

2、伺服器端告訴客戶端,響應還沒完,等一會兒。

但是,伺服器端仍然可以根據自己的心情把你的HTTP連接給掛了,哥們你的請求發太久了老子不等了。


我開始看到KeepAlive,還以為你問的是高可用的那個工具,原來不是啊。

如果你單純只是想在HTTP協議的基礎上進行操作,那完全是可以不管什麼TCP,握手包之類的,充其量最多就是設置下HTTP協議的版本。因為握手也好,其他都好,這些都是HTTP層面以下的內容,HTTP是完全不用管這些骯脹的玩意,並且,.NET的基礎類庫已經幫你做好了,你儘管很純粹的用HTTP就好。。。


用.Net的httprequest, 默認keep-alive就是true, 理論上你可以保持長連接。但是有時候中間proxy有60秒idle就斷掉連接的情況,所以,你最好每隔一段時間就ping一下,這樣才能一直保持長連接。


如果你開發的是一個桌面 .NET 前端程序,和網站進行通訊,除了 http 協議外,如果你的伺服器用 WCF 編寫,還可以使用 net.tcp 協議綁定方式,這樣就是完全持久的 TCP 連接了。所謂 net.tcp 是 WCF 裡面的叫法,它不是 http 協議,而是一種(也是)基於 TCP 的通訊協議。

http 協議裡面 keep-alive 特性,是 http 協議層面關注的特性,一般來說基於此上的應用程序層面不要關注這個,並且你也基本控制不了。它的意思其實是「在滿足一定條件的情況下盡量復用以前發起的連接」,細節可以看看 HTTP 1.1 的 RFC。


推薦閱讀:

如何深入地學習《HTTP權威指南》這本書?
如何實現200 from cache?
「 http:// 」 中為何有兩根斜杠?
精神力量有多强大?
合併 HTTP 請求是否真的有意義?

TAG:NET | HTTP |