UDP缓冲区,它们在哪里,有什么保证?

2024-04-19 08:34:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在试验pythonsocketlibrary(3.5,在linuxmint18上),试图理解UDP。我是一个涉足软件的硬件人士,UDP似乎比TCP更容易让我的头脑清醒过来。我很清楚UDP并不保证一对一地传送数据包。在

到目前为止,我可以按照教程将数据从服务器回送到客户机。在

然而,我喜欢推送东西,看看当应用程序没有遵循预期的路径时会发生什么,我不喜欢写那些在意外发生时“挂起”的东西。在

如果一个服务器将一个套接字绑定到一个端口号,那么客户机将向该端口发送多条消息,在服务器多次调用recvfrom()之前,我发现每个调用都返回一条消息,消息按顺序排列。换句话说,消息已被缓冲,稍后的消息不会覆盖队列中先前的消息。看到这种情况我并不感到惊讶,但也不会惊讶地发现只有最后收到的消息可用,即缓冲区长度为1。在

这个缓冲区及其深度是python实现细节、linuxmint/ubuntu细节,还是UDP协议定义的?在


Tags: 数据服务器消息客户机硬件软件教程数据包
2条回答

Is this buffer, and its depth, a python implementation detail, a linux mint/ubuntu detail, or defined by the UDP protocol?

UDP套接字的缓冲区大小是操作系统网络堆栈的实现细节。每个操作系统都尝试根据其预期的用例设置合理的默认大小,但是您可以通过调用socket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, newSizeInBytes)和/或socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, newSizeInBytes)以每个套接字为基础覆盖操作系统的默认大小(无论如何,可以达到某个最大值)

缓冲区将尽可能多的数据包排队等待,然后丢弃任何不能完全放入剩余空间的传入数据包。在

UDP缓冲区在操作系统的网络堆栈中。缓冲区的大小将取决于您的计算机有多少内存和内核配置设置。在拥有千兆字节内存的现代计算机上,操作系统很可能有足够的空间来存放UDP缓冲区,除非计算机严重超载,否则很难使缓冲区溢出。在

可能有一些方法可以配置操作系统来限制用于UDP缓冲区的内存量,这样就可以导致溢出并查看测试应用程序中的症状。我不知道配置设置,您可以尝试在Unix & LinuxAskUbuntu.com中询问。在

相关问题 更多 >