2011-04-06 153 views

回答

1

需要明確的是,沒有人可以刪除除端點TCP連接。這是因爲IP網絡協議就是網絡看到的所有東西,而且它在設計上是無狀態的。

但是,什麼使「終點」可能不是你所期望的。運營商可以將透明代理或具有NAT的路由器放置在需要保持狀態的位置,以便正確轉發數據。

NAT是您最大的問題,因爲它更常見,如果路由器由於一段時間沒有看到流量而決定放棄連接狀態,並且端點在下次嘗試發送數據時纔會知道。

啓用SO_KEEPALIVE的默認值爲2小時。一個表現良好的路由器應該至少保持這種狀態,但不要在農場上下注。

回答你的具體問題......如果是我,我會用15分鐘或更少。

請注意,只有一方需要通過重新發送數據流的最後1個字節來發送保持活動狀態,就好像它在網絡上丟失一樣。接收方丟棄它,因爲它已經看到它,但發送一個新的ACK作爲回覆,從而導致雙向流量。

+0

但afaik SO_KEEPALIVE不容易配置 – Erdal 2011-04-21 06:42:47

+0

int delay = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPIDLE,&delay,sizeof(delay)); int count = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPCNT,&count,sizeof(count)); int interval = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPINTVL,&interval,sizeof(interval)); int enable = 1; setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,&enable,sizeof(enable)); – 2011-04-21 10:06:56

1

只有破損的NAT才需要這樣做。 AIUI,當需要檢查活躍性時,明智的NAT可以將TCP保持活動發送到連接的兩端,如果足夠多的連接不能引起響應,則斷開連接。

唉,很多/大部分NAT都壞了。如果您的套接字接收到數據,或者可選地以大致的時間間隔(例如keepalive),則iOS的「多任務」具有「voip」功能,它將取消暫停您的應用程序;最小間隔大約是300秒,所以300-1200之間的某個東西可能會起作用。

0

因爲我不知道你爲什麼要保持連接活着的特殊原因,即使顯然沒有任何通信流量,5分鐘曾經是與幾個美國運營商(其他有它更長)。但是,您應該知道,他們可以隨時更改此值,因此如果您的應用程序將此作爲其功能的一部分,如果選擇這樣做,可能會使您感興趣。

FYI ...