为什么UDP套接字通信中不会发生错误?

时间:2016-08-31 11:14:05

标签: c sockets network-programming udp udpclient

我是一名学习计算机网络的学生。 我在Ubuntu上使用UDP协议在C中制作了非常简单的服务器 - 客户端套接字通信程序。 我在书中读到UDP是不可靠的数据传输协议,而TCP是可靠的数据传输协议。原因是UDP只是在TCP发送时发送数据包并等待接收相应的ack消息。

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

套接字库是否有UDP设置的错误纠正方案?

ps)我的程序几乎与C中的常见echo套接字代码相同。只是不同的东西不是回显而是复制。也就是说,客户端传输数据和服务器接收并复制它。

供参考)我使用了sys / socket头来实现套接字功能。我使用fopen,fread和fwrite复制文件。

2 个答案:

答案 0 :(得分:4)

  

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

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

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

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

  

套接字库是否有UDP设置的错误纠正方案?

没有

答案 1 :(得分:0)

UDP中没有纠错。它仍然是不可靠的,即使你成功用很多时间来传输文件。

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