2016-05-01 63 views
2

我目前爲我的項目實現了一個心跳機制,並且我使用TCP作爲我的底層連接。我想知道維護tcp連接的代價是多麼昂貴。每個奴隸每5秒發送一次心跳給主人(是的,我知道它經常的方式,但我有一個很好的理由這樣做)。所以我想知道應該不斷創建一個新的連接,還是應該保持連接打開。因爲如果我保持開放連接,那麼在這種情況下,我只能處理異常。但是因爲我需要知道每隔5秒鐘,如果我正在重新建立連接或保持打開狀態,那麼從屬設備就會關閉。提前致謝。在java中維護一個TCP套接字有多昂貴

+2

保持打開狀態更可取 – DarkV1

回答

3

定期重新打開連接更爲昂貴;有一個three-way handshake開放。一旦套接字打開,該成本可以攤銷(但只有在你打開它時)。

+0

如果我有100個奴隸,這種情況是否會成真?因爲那時我有一個專門的線程爲他們打開。而三方握手只是SYN-ACK包是否昂貴?就是想?謝謝!!! – Krish

+0

如果您有100個從站,那麼您應該查看* multicast *。打開套接字是使用** TCP **中最昂貴的部分。其他選項包括** UDP **。但你*特別*詢問TCP。 –

0

如果你正在做心跳,爲什麼不使用UDP,TCP需要確認接收,UDP不需要,那麼你可以有一個監聽器,並且只接收任何廣播給它並處理的數據包。這意味着無論有多少個孩子正在向它發送,主系統上的一個端口是開放的。

TCP你需要每個孩子一個連接。

+0

我的心跳管理員檢查奴隸已經8秒鐘或更長時間。而且由於如果我錯過了心跳,UDP是不可靠的,我的心跳管理器會將該工作者標記爲關閉,即使它不是! – Krish

+0

因此,您在標記之前允許使用2-3個聯繫人。在我工作的系統上,我們有一個保持活動的信息,如果我們錯過1個聯繫人(15秒),我們會進入該設備的恢復模式,直到我們錯過第二次聯繫,然後我們將其標記爲關閉 - 這些是異步消息 –

+0

順便說一句,這是我工作的系統http://image.slidesharecdn.com/homelandsecurity2013lisivo3-140204080445-phpapp02/95/security-in-large-strategic-and-complex-systems-43-638.jpg?cb=1391501394 –

1

如前所述,重新開放連接更加昂貴,除非有其他因素參與,例如移動性。你不僅有一個three-way握手,但你也有一個four-way握手終止連接。除此之外,您的TCP服務器應用程序可能會爲每個新連接開啓新線程,這些線程也需要分配,解除分配等。 您的連接很可能也會通過經常是NAT的防火牆,從而打開端口和狀態。這就是爲什麼我個人很少使用UDP的原因,因爲UDP可能在穿過防火牆和ISP過濾器時遇到問題。

最後,從協議的角度來看,TCP連接本身的維護很少。 TCP可以選擇keep-alive,但這些很少發送,每隔5秒鐘一次。在你的操作系統進程中有很小的上下文切換開銷,但是無論你打開和關閉連接都會發生。

保持打開狀態。