UDP消息太长

时间:2014-04-02 17:52:34

标签: python sockets udp

我正在尝试通过UDP发送数据,并想知道为什么我的系统上最大数据长度限制为9253字节(Mac OS X 10.9)。

这是我发送数据的方式(简化):

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 9999
MESSAGE = "A"*9217

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

我收到了错误

Traceback (most recent call last):
  File "Untitled 2.py", line 8, in <module>
    sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
socket.error: [Errno 40] Message too long

实际上,我可以传输的最大“字符串长度”是9216.当我在客户端进行字节大小检查时

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 9999

self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.bind((UDP_IP, UDP_PORT))
data, addr = self.sock.recvfrom(65535)
print("Received {0} bytes of data.".format(sys.getsizeof(data)))

我得到了

Received 9253 bytes of data.

我不明白为什么它是9253字节长,当我发送9216字节(这是字符串长度,以字节为单位)。 28个字节是UDP头,但是剩余的9个字节中存储了什么?

我的主要问题是:如何发送和接收最多65535字节的UDP数据包?

2 个答案:

答案 0 :(得分:16)

我遇到了同样的问题,并找到了[Errno 40]的解决方案。问题不在于MTU。 MTU是可以发送的1个包的最大大小。对于以太网,此MTU为1500。

但是,计算机可以将大于MTU的UDP包分成较小的包。这样你就可以发送udp-packages到65535。

现在我们来解决你的问题。默认情况下,OSX将最大UDP包限制为9216字节,不要问我为什么。您可以使用终端中的以下命令更改此值。

    sudo sysctl -w net.inet.udp.maxdgram=65535

此更改将无法在重新启动后继续存在。

请注意,如果其中一个片段未到达其客户端,则会丢弃整个包。这就是为什么将数据报的大小保持在MTU下更为明智。

答案 1 :(得分:4)

65535字节是一个相当长的数据帧,几乎没有网卡支持它。 对于大多数千兆以太网NIC,MTU略高于9k字节。

出现其他字节的可能原因:

1)网卡可能添加到数据包末尾的零填充

2)它计算L2标题

您可以安装Wireshark并准确查看您发送和接收的内容。使用此工具是了解问题的好方法