为什么UDP socket通信不出错?

Why doesn't error occur in UDP socket communication?

我是一名学习计算机网络的学生。 我使用 UDP 协议在 Ubuntu 上用 C 编写了非常简单的 server-client 套接字通信程序。 我在书上看到UDP是不可靠的数据传输协议,而TCP是可靠的数据传输协议。原因是UDP只是发送数据包,而TCP正在发送并等待接收相应的ack消息。

无论如何,我尝试了很多次使用 UDP 套接字从客户端向服务器发送图像文件(大约 1Mb)。然而,图像文件传输成功,没有任何失败。

虽然UDP设置,socket库是否有纠错方案?

ps) 我的程序和C中常见的echo socket代码几乎一样,只是不同的是不是echoing而是复制。即客户端传输数据,服务器端接收并复制。

供参考)我使用 sys/socket header 作为套接字函数。我使用 fopen、fread 和 fwrite 来复制文件。

UDP 中没有纠错。它仍然不可靠,即使您成功多次使用它传输文件。

在当今的网络中,尤其是在局域网或同一台机器上,出错的概率非常小。也就是说,在出现错误之前,您可能需要尝试发送文件数百万次。

Anyhow, I tried many times to send an image file (around 1Mb) from client to server using UDP socket. However, the image file was transmitted successfully without any one failure.

如果通过环回在单个主机上完成,则不会丢失任何数据包(除非您启用了一些数据包丢失测试功能)。这是因为现代操作系统的网络层只传递指向数据包描述符的指针。因此,当您在套接字上执行 send()write() 时,将围绕您的数据构建数据包描述符结构;在写入过程中那种结构类型 "lives" 并且只有一个指向它的指针被传递给将要接收它的任何人。如果它是另一个进程,这会在 IPC 中有效地产生(如果您使用正确的套接字操作,这甚至可以达到零拷贝数据传输)。仅当该数据包描述符在网络接口驱动程序中结束时,才会传递的不仅仅是该指针。

在本地网络上,丢失数据包几乎是不可能的,因为冲突检测发生在 link 层,而现代交换机是存储转发架构。它需要 巨大的 网络负载量才能注意到任何形式的丢包背压。

要使数据包丢失变得明显,您必须使用竞争激烈的共享媒体网络(例如,有很多客户端争用它的 W-LAN)或通过至少一个接近其带宽容量的路由器。

Does socket library have error correction scheme although UDP setting?

没有