關於keep-alive 這個問題?
01-16
我是做.net開發的,做http協議開發。我在對自己程序進行抓包的時候,發現在訪問同一個host的時候,有時候不需要握手包鏈接直接發包,而有時候又需要先建立握手包才發包,雖然這個是程序自己封裝的,編程的時候不用操心這個事兒。但是問題來了,我為了效率考慮,
1.如何在讓我軟體與網站一直建立http鏈接,也就是keepalive2.這個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 請求是否真的有意義?