C 为什么';UDP套接字通信中是否发生错误?

C 为什么';UDP套接字通信中是否发生错误?,c,sockets,network-programming,udp,udpclient,C,Sockets,Network Programming,Udp,Udpclient,我是一名学习计算机网络的学生。 我在Ubuntu上用C语言编写了一个非常简单的服务器-客户端套接字通信程序,使用UDP协议。 我在书中读到UDP是不可靠的数据传输协议,而TCP是可靠的数据传输协议。原因是UDP只是在发送数据包,而TCP正在发送并等待接收相应的ack消息 无论如何,我尝试过多次使用UDP套接字从客户端向服务器发送一个图像文件(大约1Mb)。但是,图像文件在没有任何故障的情况下成功传输 套接字库是否具有错误更正方案(尽管UDP设置) ps)我的程序与C中常见的echo套接字代码几乎

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

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

套接字库是否具有错误更正方案(尽管UDP设置)

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


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

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


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

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

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

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

如果通过环回在单个主机上执行,则不会丢失任何数据包(除非启用某些数据包丢失测试功能)。这是因为现代OSs的网络层只传递指向数据包描述符的指针。因此,当您在套接字上执行
send()
write()
时,会围绕您的数据构造一个数据包描述符结构;这种结构“存在”于编写过程中,只有指向它的指针被传递给将接收它的人。如果这是另一个进程,则可以有效地实现IPC(如果使用正确的套接字操作,则甚至可以实现零拷贝数据传输)。只有当数据包描述符在网络接口驱动程序中结束时,才会传递不仅仅是指针

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

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

套接字库是否具有错误更正方案(尽管UDP设置)

没有

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

如果通过环回在单个主机上执行,则不会丢失任何数据包(除非启用某些数据包丢失测试功能)。这是因为现代OSs的网络层只传递指向数据包描述符的指针。因此,当您在套接字上执行
send()
write()
时,会围绕您的数据构造一个数据包描述符结构;这种结构“存在”于编写过程中,只有指向它的指针被传递给将接收它的人。如果这是另一个进程,则可以有效地实现IPC(如果使用正确的套接字操作,则甚至可以实现零拷贝数据传输)。只有当数据包描述符在网络接口驱动程序中结束时,才会传递不仅仅是指针

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

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

套接字库是否具有错误更正方案(尽管UDP设置)


否。

这样,您的网络和计算机的IP堆栈不会丢弃或损坏任何数据包,并且您可以很好地接收所有数据包。不可靠并不意味着错误会无缘无故地发生。您可以尝试发送一个(大得多的)文件,在这种情况下,在接收器处填充缓冲区的机会会增加(并且数据包会被丢弃)。@nos我怎么能看到数据包丢弃现象?我用两个终端做这个程序。一个是客户端,另一个是服务器。所以,我使用的是本地IP地址127.0.0.1和端口号9999。环回接口上的通信通过本地内存进行,不涉及网络。试试两台不同的机器。@Danny_Kim,正如我提到的,试着用一个更大的文件。UDP没有流量控制,所以如果发送速度比接收速度快,数据包将被丢弃。或者您可以尝试通过以太网交换机发送,同时也可以使用其他方式传输文件,这样您就可以最大限度地利用以太网交换机上端口的容量,在这种情况下,它将丢弃数据包。“使用UDP从客户端向服务器发送一个图像文件(大约1Mb)”,这对于单个UDP数据包来说,数据量太大,无法实际保存,因此,您必须将数据分解为多个数据包。这就引入了由于droppe而丢失数据的可能性