簡體   English   中英

為什么在UDP套接字通信中不會出現錯誤?

[英]Why doesn't error occur in UDP socket communication?

我是一名學習計算機網絡的學生。 我使用UDP協議在Ubuntu上的C中制作了非常簡單的服務器-客戶端套接字通信程序。 我在書中讀到,UDP是不可靠的數據傳輸協議,而TCP是可靠的數據傳輸協議。 原因是UDP只是在發送數據包,而TCP正在發送並等待接收相應的ack消息。

無論如何,我嘗試了很多次使用UDP套接字從客戶端向服務器發送圖像文件(大約1Mb)。 但是,圖像文件已成功傳輸,沒有任何失敗。

盡管UDP設置,套接字庫是否具有錯誤糾正方案?

ps)我的程序與C中的通用回顯套接字代碼幾乎相同。不同的是,不是回顯而是復制。 即,客戶端傳輸數據,服務器接收並復制數據。

供參考)我將sys / socket標頭用於套接字函數。 我用fopen,fread和fwrite復制文件。

無論如何,我嘗試了很多次使用UDP套接字從客戶端向服務器發送圖像文件(大約1Mb)。 但是,圖像文件已成功傳輸,沒有任何失敗。

如果通過環回在單個主機上完成,則不會丟失任何數據包(除非您啟用了某些丟包測試功能)。 這是因為現代OS的網絡層僅傳遞指向數據包描述符的指針。 因此,當您在套接字上執行send()write() ,便會圍繞數據構造一個數據包描述符結構; 這種結構在編寫過程中“存在”,並且只有指向它的指針才傳遞給將要接收它的人。 如果這是另一個過程,則可以有效地實現IPC(如果使用正確的套接字操作,則甚至可以達到零復制數據傳輸)。 僅當該數據包描述符在網絡接口驅動程序中結束時,才傳遞比該指針更多的指針。

在本地網絡上,幾乎不可能丟失數據包,因為沖突檢測發生在鏈路層,而現代交換機是存儲轉發結構。 這需要龐大的網絡負載的量用於通知任何形式的分組丟失的背壓。

為了使數據包丟失變得明顯,您必須使用競爭激烈的共享介質網絡(例如,有很多客戶端在爭奪它的W-LAN)或通過至少一個接近其帶寬容量的路由器。

盡管UDP設置,套接字庫是否具有錯誤糾正方案?

沒有。

UDP中沒有錯誤糾正。 即使您成功使用該文件傳輸文件很多次,它仍然是不可靠的。

在當今的網絡中,尤其是在LAN或同一台計算機上,錯誤的可能性非常小。 也就是說,您可能需要嘗試發送數百萬次文件才能收到錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM