2016-04-27 103 views
0

我正在開發一個內部TCP服務器和TCP客戶端。當數據包丟失爲0%時,服務器和客戶端工作正常。但是,當我有20%或更多的數據包丟失時,我看到重複的TCP消息。我收到這樣的事情....Python TCP重複消息

Client <-- MessageA -- Server 
Client -- MessageB --> Server 
Client <-- MessageCMessageA -- Server 

難道MessageA沒有完全做它的客戶端,這時候出局,然後重新發送TCP,然後原來的消息使得其接收在晚些時候由客戶?

我的問題是,如果TCP是這樣工作的,並且如果這是包含20%或更多數據包丟失的網絡的可能情況。

準系統如何客戶端和服務器發送/接收數據的...

socket.recv(1024) 
socket.send(1024) 
+1

假設您正在使用內置的TCP/IP庫並假設所有的塊最終在連接超時之前到達,TCP將保證您不必擔心重複和重新傳輸。這是您選擇TCP over UDP的主要原因之一......並且保證數據的順序正確。 –

+0

好的,謝謝。我只是想在我開始尋找bug之前確定它。 – Taztingo

+0

也許你認爲你的'recv'調用將總是返回正好1024字節?緩衝區大小是將要接收的最大字節數,而不是實際的數字。向我們顯示您的完整代碼以接收消息。 –

回答

1

不,這是不可能的。 TCP確保它將按照發送順序準確傳送一次數據,或嚮應用程序發出錯誤信號。因此,您的代碼中可能存在一個錯誤。最有可能的是,你的代碼未能處理部分讀取

當您在TCP套接字執行writesend,TCP模塊將段需要數據成許多數據包。在丟包的情況下,有些數據包可能已經成功到達,但其他數據包必須重新發送。在這種情況下,相應的readrecv將僅接收部分數據 - 其餘數據將在隨後的readrecv中到達。換句話說,TCP不保留消息邊界。

您的代碼可能會將此類拆分消息解釋爲多條消息。確保在嘗試解析它之前,在緩衝區中累積完整的消息。

+0

很好的解釋。 – Taztingo