我目前爲我的項目實現了一個心跳機制,並且我使用TCP作爲我的底層連接。我想知道維護tcp連接的代價是多麼昂貴。每個奴隸每5秒發送一次心跳給主人(是的,我知道它經常的方式,但我有一個很好的理由這樣做)。所以我想知道應該不斷創建一個新的連接,還是應該保持連接打開。因爲如果我保持開放連接,那麼在這種情況下,我只能處理異常。但是因爲我需要知道每隔5秒鐘,如果我正在重新建立連接或保持打開狀態,那麼從屬設備就會關閉。提前致謝。在java中維護一個TCP套接字有多昂貴
回答
定期重新打開連接更爲昂貴;有一個three-way handshake開放。一旦套接字打開,該成本可以攤銷(但只有在你打開它時)。
如果我有100個奴隸,這種情況是否會成真?因爲那時我有一個專門的線程爲他們打開。而三方握手只是SYN-ACK包是否昂貴?就是想?謝謝!!! – Krish
如果您有100個從站,那麼您應該查看* multicast *。打開套接字是使用** TCP **中最昂貴的部分。其他選項包括** UDP **。但你*特別*詢問TCP。 –
如果你正在做心跳,爲什麼不使用UDP,TCP需要確認接收,UDP不需要,那麼你可以有一個監聽器,並且只接收任何廣播給它並處理的數據包。這意味着無論有多少個孩子正在向它發送,主系統上的一個端口是開放的。
TCP你需要每個孩子一個連接。
我的心跳管理員檢查奴隸已經8秒鐘或更長時間。而且由於如果我錯過了心跳,UDP是不可靠的,我的心跳管理器會將該工作者標記爲關閉,即使它不是! – Krish
因此,您在標記之前允許使用2-3個聯繫人。在我工作的系統上,我們有一個保持活動的信息,如果我們錯過1個聯繫人(15秒),我們會進入該設備的恢復模式,直到我們錯過第二次聯繫,然後我們將其標記爲關閉 - 這些是異步消息 –
順便說一句,這是我工作的系統http://image.slidesharecdn.com/homelandsecurity2013lisivo3-140204080445-phpapp02/95/security-in-large-strategic-and-complex-systems-43-638.jpg?cb=1391501394 –
如前所述,重新開放連接更加昂貴,除非有其他因素參與,例如移動性。你不僅有一個three-way握手,但你也有一個four-way握手終止連接。除此之外,您的TCP服務器應用程序可能會爲每個新連接開啓新線程,這些線程也需要分配,解除分配等。 您的連接很可能也會通過經常是NAT的防火牆,從而打開端口和狀態。這就是爲什麼我個人很少使用UDP的原因,因爲UDP可能在穿過防火牆和ISP過濾器時遇到問題。
最後,從協議的角度來看,TCP連接本身的維護很少。 TCP可以選擇keep-alive,但這些很少發送,每隔5秒鐘一次。在你的操作系統進程中有很小的上下文切換開銷,但是無論你打開和關閉連接都會發生。
保持打開狀態。
- 1. Java鎖定有多昂貴?
- 2. Thread.getStackTrace()有多昂貴?
- 3. CreateThread()有多昂貴?
- 4. Java:多個套接字在一個線程中發送和接收維護
- 5. Java(Solr)線程轉儲有多昂貴?
- 6. 線程有多昂貴?
- 7. MySQL事件有多昂貴?
- 8. OWLOntologyManager.addAxioms()操作有多昂貴?
- 9. UITableView的reloadData有多昂貴?
- 10. 靜態ArrayList有多昂貴?
- 11. SQL ORDER BY有多昂貴?
- 12. OpenGL操作有多昂貴?
- 13. 維護TCP連接
- 14. Executors.newFixedThreadPool() - 這個操作有多昂貴
- 15. Java TCP套接字
- 16. java的字符串編碼轉換有多昂貴?
- 17. 在AsyncTask中維護TCP連接
- 18. 套接字創建 - 刪除非常昂貴的過程?
- 19. 使用單線程維護多個套接字連接
- 20. 對java.util.HashMap.keySet()的調用有多昂貴?
- 21. XML的XSD驗證有多昂貴?
- 22. 類型推斷有多昂貴?
- 23. 矩陣乘法有多昂貴?
- 24. 即時壓縮有多昂貴?
- 25. 調用Web服務有多昂貴?
- 26. 調試條件語句有多昂貴?
- 27. AWS RDS「轉出」成本有多昂貴?
- 28. 提交hibernate事務有多昂貴?
- 29. Java TCP套接字塊readLine
- 30. 它創建一個NSAutoreleasePool的代價有多昂貴
保持打開狀態更可取 – DarkV1