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

时间:2018-10-13 16:33:49

标签: python sockets udp

我正在尝试python套接字库(在Linux Mint 18上为3.5),试图了解UDP。我是一个涉猎软件的硬件人员,而UDP似乎比TCP更容易理解。我很清楚UDP不能保证一一传送数据包。

到目前为止,我可以按照这些教程将数据从服务器回显到客户端。

但是,我喜欢推动事物以查看当应用程序未遵循预期的路径时会发生什么,我不愿编写在发生意外事件时会“挂起”的事物。

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

该缓冲区及其深度是python实现细节,linux mint / ubuntu细节还是由UDP协议定义?

2 个答案:

答案 0 :(得分:1)

  

是这个缓冲区及其深度,一个python实现细节,一个linux   mint / ubuntu详细信息,还是由UDP协议定义?

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

缓冲区将排队容纳足够多的数据包,然后将无法完全容纳的所有传入数据包丢弃到剩余空间中。

答案 1 :(得分:0)

UDP缓冲区位于操作系统的网络堆栈中。缓冲区的大小将取决于计算机的内存量和内核配置设置。在内存为GB的现代计算机上,操作系统可能会为UDP缓冲区留出足够的空间,除非计算机非常过载,否则很难溢出它们。

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