[英]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.