为啥数据报很少超过1500字节

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥数据报很少超过1500字节相关的知识,希望对你有一定的参考价值。

1、链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。

2、至于为什么最大值设置成1500字节。
其实,这个最大传输单元MTU等于1500是国际规定的默认值而已,自己也可以将它设置的小一些,【最大值是1500】,就是规定而已,可能是大家评估考虑1500是比较合适的一个数值。
可能可以这样认为,MTU=1500是一个经过实验得到的可以最大效率传输数据的值。倘若大于1500,数据传输速度就会变慢;相反,若小于1500,链路又得不到充分利用,减小了效率。。。。所以,1500就是最好的值。
参考技术A 数据链路层MTU最大为1480字节

为啥会出现错误:“InternalCompilerError:请求的静态内存负载超过 32 个字节”?

【中文标题】为啥会出现错误:“InternalCompilerError:请求的静态内存负载超过 32 个字节”?【英文标题】:Why the error: "InternalCompilerError: Static memory load of more than 32 bytes requested"?为什么会出现错误:“InternalCompilerError:请求的静态内存负载超过 32 个字节”? 【发布时间】:2018-06-18 00:48:52 【问题描述】:

使用 Remix (https://remix.ethereum.org/) 并使用 struct。编译器是0.4.19+commit.c4cbbb05。 “优化”未选中。

pragma solidity ^0.4.4;

contract Test 
    struct FooBar 
        uint8 foo;
        uint16 bar;
    

    FooBar public fooBar;

    function getFooBar() public view returns(FooBar) 
        return fooBar;
    

    function setFooBar(FooBar value) public 
        fooBar = value;
    

它显示错误:“InternalCompilerError: Static memory load of more than 32 bytes requested.”

不知道为什么。在我看来,结构 FooBar 只有 3 个字节大。我的两个函数都读取/写入单个FooBar。我在这里错过了什么?

更新

对代码进行了一些重构,使其更清晰:

pragma solidity ^0.4.4;

contract Test 
    struct FooBar 
        uint8 foo;
        uint16 bar;
    

    FooBar public fooBar;

    // InternalCompilerError: Static memory load of more than 32 bytes requested.
    function setFooBar1(FooBar value) public 
        fooBar = value;
    

    // No such error.
    function setFooBar2(uint8 foo, uint16 bar) public 
        fooBar.foo = foo;
        fooBar.bar = bar;
    

显然直接传递结构体会导致编译错误,而传递单个字段则不会。想知道有什么区别。

【问题讨论】:

我对这个环境一无所知,但“内部编译器错误”通常意味着它所说的:编译器内部出现错误时:一个错误。您的程序可能正确也可能不正确。 【参考方案1】:

这似乎是一个可靠的错误 - 请参阅:

https://github.com/ethereum/solidity/issues/3361

和:

https://github.com/ethereum/solidity/issues/3069

现在还有一个用于以太坊的 Stack Exchange:

https://ethereum.stackexchange.com/

【讨论】:

谢谢@ligi。第一个问题(3361)似乎正是我在这里面临的问题。所以,谢谢你的指点。适当地注意到了论坛。 :) 虽然您的回答并没有解决问题(即使编译错误消失),但我仍然将其标记为已回答,因为它指向一个更好的页面,其中提出了相同的问题并将希望得到解决。

以上是关于为啥数据报很少超过1500字节的主要内容,如果未能解决你的问题,请参考以下文章

数据包大小超过 1500

icmp

MTU(Maximum Transmission Unit),最大传输单元

ASA高级配置

CANOpen中一个PDO只能传输8个字节,为啥很多资料都显示一个PDO可以超过8字节?

网络原理-2