代码之家  ›  专栏  ›  技术社区  ›  WBuck

为什么我的TCP包大小是590字节而不是8000字节+

  •  0
  • WBuck  · 技术社区  · 5 年前

    目前我已经配置了2个PC的10 GbE网卡来使用 MTU 9014(巨型)。 然后两台PC都连接到一个10GbE交换机。主机物理连接到的交换机上的两个端口都配置为巨型帧(9014)。没有其他设备连接到交换机。

    两台电脑都有2个网卡。一张卡是10GbE,另一张是1GbE。两台PC上的10GbE接口均通过基于10的IP地址连接到交换机。两台电脑上的1GbE卡都连接到公司局域网,这样我就可以远程连接到任何一台电脑(它们使用基于172的IP地址,而且它们没有针对巨型帧进行配置)。

    如果我使用 ping -l 8000 ipaddress 我可以通过wire shark看到 ICMP 包大小约为8000,这是我所期望的。

    问题

    我有一点 TCP 运行在其中一台PC(Windows 7嵌入式)上的服务器应用程序 C#

    在另一台电脑(Windows 10 Pro)上,我有另一台 发送100个 GB 用于测试的服务器应用程序。下面是我如何发送数据的一个非常简单的例子。

    using var tcpClient = new TcpClient( );
    await tcpClient.ConnectAsync( address, port );
    
    var pageSize = 25165824;
    var pageHeaderSize = 312;
    
    // For this example I'm sending about 24 MB chunks of data.
    // This is the smallest 'chunk' that'll be sent.
    var buffer = new byte[ pageSize + pageHeaderSize ];
    var pageCounter = 0;
    
    while( pageCounter < pageCount )
    { 
         headerData.CopyTo( buffer, 0 );
         // The 'sourceStream' is actually a MMF view stream being written to
         // by other processes.
         await sourceStream.WriteAsync( buffer, headerData.Length, pageSize );
         await tcpClient.GetStream( ).WriteAsync( buffer, 0, pageSize + pageHeaderSize ); 
    
         ++pageCounter;
    }
    

    这大致说明了我是如何把数据写出来的 传输控制协议 590 传输控制协议 收割台+有效载荷)。我不知道这些包裹为什么这么小。这会导致大量不需要的网络流量。

    有趣的是,这里的另一个用户也有类似的问题。 Why are TCP messages in my PC coming in frames of 590 bytes

    用户怀疑是谁用一个更小的设备回答了这个问题 MTU公司 在两个端点适当地调整它们的大小。但正如我在上面概述的,除了10 GbE交换机之外,这两台主机中间没有其他东西。。

    我把这个标记为 streams ). 我还把这个标记为 networking tcp-ip 征求意见 IT 大家看看是否有一些设置我没有设置在两个主机或交换机。

    ping -l 8000 address ping -f -l 8000 address

    0 回复  |  直到 5 年前