2014-07-22 124 views
1

使用基於代理的HTTP隧道時,TCP套接字有問題。通過HTTP代理的TCP套接字在空閒超時後斷開連接

客戶端(C++)打開一個TCP套接字到服務器(JAVA)。我添加了對HTTP代理的支持。一切工作不錯,客戶端發送「HTTP連接」的請求,這樣以後繼續爲純TCP連接:

CONNECT servername:5555 HTTP/1.1 
Host: servername:5555 
Proxy-Connection: Keep-Alive 

HTTP/1.1 200 

然而,如果空閒超時在代理配置並沒有發送任何實際數據,連接將被終止,雖然客戶端每60秒發送一次TCP保持活動數據包。空閒超時配置爲10分鐘。

TCP保持活躍被配置如下: 的WSAIoctl(插座,SIO_KEEPALIVE_VALS,&活着,的sizeof(活着),NULL,0,& dwBytesRet,NULL,NULL)

客戶端IP - 192.168.91.xxx
代理IP - 192.168.92.yyy

244 47.133017000 192.168.91.xxx 192.168.92.yyy TCP 55 [TCP Keep-Alive] 64351 > 808 [ACK] Seq=4336 Ack=13084 Win=65700 Len=1 
245 47.133336000 192.168.92.yyy 192.168.91.xxx TCP 66 [TCP Keep-Alive ACK] 808 > 64351 [ACK] Seq=13084 Ack=4337 Win=65536 Len=0 SLE=4336 SRE=4337 

任何想法如何保持連接活着嗎?

雖然HTTP1.1應該自動執行,但我試圖添加「Connection:Keep-Alive」標頭。無論如何,這並沒有幫助。

回答

2

這是應用程序層的超時,例如,由於沒有發送應用程序數據,連接處於空閒狀態。您嘗試過的內容不起作用,因爲:

  • Connection: keep-alive用於在單個連接上有多個HTTP請求。這不適用於此,因爲從代理角度看,只有一個請求(CONNECT)。
  • TCP保持活動狀態是要注意對方是否無法再訪問(在沒有關閉連接或連接斷開的情況下中斷某處)。它不適用於TCP連接仍處於活動狀態但處於空閒狀態(無應用程序數據)的情況。

代理的空閒超時值是有意義的。 HTTP的思想是,客戶端發送請求,服務器發送響應。如果它在接收請求時處於空閒狀態,或者響應通常會中斷(或者您的連接速度很慢)。如果在請求和響應完成後它處於空閒狀態,則即使客戶端請求Connection: keep-alive也是完全有效的,因爲在服務器上保持活動狀態不是必需的,但是隻有建議可以保持連接在更多的請求中處於打開狀態。服務器有足夠的資源來做到這一點。