Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何发送大于64 KB的UDP数据包_C_Sockets_Networking_Kernel_Buffer - Fatal编程技术网

C 如何发送大于64 KB的UDP数据包

C 如何发送大于64 KB的UDP数据包,c,sockets,networking,kernel,buffer,C,Sockets,Networking,Kernel,Buffer,我无法发送大小大于64 KB的IP多播数据报(我需要这样做,用于我的实验)。我正在通过10千兆以太网链路直接连接的计算机之间传输数据包(中间没有任何跳,由traceroute确认) 所有计算机都安装了Ubuntu 12.04。通过在/etc/sysctl.conf中添加以下行,我更改了读写缓冲区的限制: net.core.rmem_max=12582912 net.core.wmem_max=12582912 net.core.rmem_default=12582912 net.core.wme

我无法发送大小大于64 KB的
IP多播数据报
(我需要这样做,用于我的实验)。我正在通过
10千兆以太网
链路直接连接的计算机之间传输数据包(中间没有任何跳,由
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
并使用sysctl-a(在运行sysctl-p之后)验证更改。我需要重新启动才能看到更改吗?(我正在共享计算机,因此不可能总是重新启动)

所有计算机中用于发送和接收的接口的
MTU
为9000字节。我已经成功地发送了大小约为60KB的数据包,对于100KB的数据包,使用
tcpdump
捕获数据包表明,这些数据包甚至没有发送,可能是内核丢弃的(我在tcpdump跟踪中没有看到它们)


我还需要做什么才能传输大数据包(最好是100 MBs大小的数据包)?

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

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

如果需要发送更大的消息,则需要将其分解为多个数据报。或者你应该考虑使用不同的传输协议,例如TCP(不幸的是,如果你正在做多播,这是不可能的)。
大于64K的IPv6支持。但在IPv4中无法做到这一点。

在最低级别,这是不可能的

根据,UDP数据包的结构类似于

              0      7 8     15 16    23 24    31
             +--------+--------+--------+--------+
             |     Source      |   Destination   |
             |      Port       |      Port       |
             +--------+--------+--------+--------+
             |                 |                 |
             |     Length      |    Checksum     |
             +--------+--------+--------+--------+
             |
             |          data octets ...
             +---------------- ...

                  User Datagram Header Format
这意味着保存数据包大小的
Length
字段的长度为16位。然后,我们得到
2^16-1
等于65535,因此该数字是
Length
字段可能包含的最大值。当然,65535距离精确的
64KiB
只有一个字节。也许有一些UDP扩展可以克服这个问题,但我不知道有任何扩展。无论如何,
Length
字段也会计算报头的大小,因此它的最小值是
8
,最大有效负载大小是
65535-8=65527

无论如何,我不确定您是否使用了正确的协议,或者至少使用了正确的数据操作模型。UDP无疑是(唯一?)用于多播目的的最佳选择,但UDP旨在传输小数据包,而不提供传输控制协议所造成的连接问题,以克服Internet协议传输信息的不可靠、无连接方式。UDP只是一个小小的改进,它在上面添加了端口


希望这对你有帮助

他正在尝试多播,这只适用于UDP,而不适用于TCP。他不确定这会有什么不同,但想指出的是,他从未声称使用UDP<代码>IP多播是他说的。@Barmar:我并不是说他应该使用TCP,但无论如何,我会编辑以避免出现问题。是的,我使用的是UDP(我感兴趣的是分析如果文件大小太大/数据包以非常高的速度发送时,数据包被丢弃的百分比)。TCP是可靠的。@SagarJha:那么,你的问题只是理论上的?实际上,您不需要发送
64KB+
UDP数据包?实际上,RFC并没有说
Length
字段也包含IP头的大小。碰巧是
sizeof(UDPHeader)==8
,所以最小值是8,最大有效负载大小是
65535-8=65527
。我不确定是谁投了反对票。我向上投票以确保它为0。@KemyLand IP报头中的总长度字段才是最重要的,因为UDP在IP数据包中传输。“总长度是数据报的长度,以八位字节为单位,包括互联网报头和数据。”RFC791如是说。IP报头的总长度也包括IP报头。@KemyLand我想您只是在查看UDP长度字段,但UDP数据报必须适合IP数据包,因此后者是最终限制。如果出现碎片,对等主机会将IP数据包重新组装成UDP数据报。这个答案是错误的。