2016-03-17 64 views
3

我一直認爲web套接字保證數據的傳輸,因爲它建立在TCP可靠的基礎之上。我讀了Java web套接字API文檔此鏈接 https://docs.oracle.com/javaee/7/api/javax/websocket/RemoteEndpoint.html
它說,websocket連接可靠嗎?

沒有成功交付網絡套接字消息到對等的保證,但如果發送消息的作用導致容器已知的錯誤,API會拋出它。

TCP不應該保證消息傳遞嗎?

+2

Web socket是對TCP的抽象。換句話說,Web Socket協議的底層協議是TCP(Web套接字消息通過TCP傳輸)。就像在TCP之上使用HTTP協議一樣。 Web Socket實現具有其自己的分組或幀,其可以具有額外的保證,例如基於相關ID的消息排序。由於客戶端和服務器之間的連接可以隨時中斷,任何消息失敗都需要重新發送,而不需要雙方任何干預。這可能有助於你理解這種區別 – Bunti

+0

TCP不保證消息傳遞。在這種情況下,它具有檢測傳輸錯誤或數據包損壞並嘗試重新傳輸的內置方法,但傳輸仍可能失敗。它保證,如果數據包沒有被傳遞,調用者會得到一個錯誤,所以調用者可以知道。由於websocket是建立在TCP之上的,它有相同的問題。如果網絡連接中斷,最終可能會出現傳送錯誤。 – jfriend00

+0

@Bunti那麼在使用websocket時丟包期間會重傳數據包嗎? – Tejas

回答

4

可靠!=保證。可靠意味着如果出現故障(或成功),您將收到通知 - 如果最終用戶拔掉了他們的局域網電纜,即使tcp也無法「保證交付」。

+2

但丟包發生時是否重傳數據包? – Tejas

+1

對於tcp,是的 - 這是通過操作系統的tcp實現來處理的,並且只有在成功/失敗之後纔會通知您的應用程序(應用程序層)。 – ABuckau

1

「保證」有點誤導。 TCP將嘗試發送由一個TCP堆棧發送的有序數據,以便由另一個TCP堆棧按順序接收。如果無法完成,則TCP堆棧將出現錯誤情況。這與您從商店獲得的退款保證沒有任何區別;失敗模式意味着你會得到一個替代品,然後再試一次......最終如果失敗太多並讓你退錢(例如連接斷開)。

另外... TCP「保證」而不是表示數據「保證」在兩個堆棧的應用程序級別正確處理。這是應用程序協議的責任。工作完成後,TCP把它交給它上面的應用層,它實現諸如pub/sub,http,rpc,元組空間,email,ftp,交易,數據庫等等的東西......