【问题标题】:UDP Message too longUDP 消息太长
【发布时间】:2014-04-02 17:52:34
【问题描述】:

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

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

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 数据包?

【问题讨论】:

    标签: python sockets udp


    【解决方案1】:

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

    但是,计算机可以将大于 MTU 的 UDP 包分割成更小的包。这样你应该能够发送高达 65535 的 udp 包。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      出现额外字节的可能原因:

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

      2) 计算 L2 标头

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

      【讨论】:

      • > 几乎没有网卡支持它 网卡不必;这由称为 IP 分片的 IP 协议功能处理。
      猜你喜欢
      • 2013-09-04
      • 2011-08-03
      • 2022-06-15
      • 2017-04-20
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2021-03-21
      • 2011-06-15
      相关资源
      最近更新 更多