如何发送大小超过64 KB的UDP数据包

Sag*_*Jha 2 c sockets networking buffer kernel

我无法发送IP multicast datagrams大于64 KB的大小(对于我的实验,我需要这样做).我正在通过10 Gigabit ethernet链接直接连接的计算机之间传输数据包(中间没有任何跳跃,确认traceroute).

所有计算机都安装了Ubuntu 12.04.我通过在以下行中添加以下行来更改读取和写入缓冲区的限制/etc/sysctl.conf:

net.core.rmem_max=12582912
net.core.wmem_max=12582912
net.core.rmem_default=12582912
net.core.wmem_default=12582912
Run Code Online (Sandbox Code Playgroud)

并使用sysctl -a验证了更改(运行sysctl -p之后).我是否需要重新启动才能看到更改?(我正在共享机器,因此无法始终重启).

MTU用于发送和接收的接口是所有计算机9000个字节.我已成功发送大小约为60 KB的数据包,对于100 KB数据包,捕获使用tcpdump显示数据包甚至没有被发送并且可能被内核丢弃(我没有在tcpdump跟踪中看到它们).

我还需要做些什么才能传输大包(最好大小为100 MB)?

Bar*_*mar 7

UDP数据报必须适合单个IP数据报.Total LengthIP报头中的字段为16位,因此最大长度(包括IP和UDP报头)为65535字节.的UDP报头还具有一个16位Length字段.UDP长度字段包括UDP报头,而不是IP报头,但由于整个UDP数据报必须适合IP数据包的有效负载,因此它受IP长度的限制.

因此,不可能发送大于64KB的UDP数据报.由于IP和UDP报头的最小大小分别为20和8字节,因此实际的最大有效负载量最多为65507字节.

如果需要发送更大的消息,则需要将其分解为多个数据报.或许您应该考虑使用不同的传输协议,例如TCP(遗憾的是,如果您正在进行多播,这是不可能的).

IPv6支持大于64K的Jumbograms.但你不能在IPv4中做到这一点.