C# 为什么我的TCP数据包大小是590字节而不是8000+;

C# 为什么我的TCP数据包大小是590字节而不是8000+;,c#,networking,tcp,C#,Networking,Tcp,目前,我已经配置了2个PC的10GbE网卡,以使用9014(巨型)的MTU。 然后将两台PC连接到10GbE交换机。主机物理连接到的交换机上的两个端口都已配置为巨型帧(9014)。没有其他设备连接到交换机 然而,这两台电脑都有两个网卡。一个是10GbE,另一个是1GbE。两台PC上的10GbE接口均通过基于10的IP地址连接到交换机。这两台电脑上的1GbE卡都连接到公司局域网,这样我就可以远程进入任何一台电脑(它们使用基于172的IP地址,并且没有针对巨型帧进行配置) 如果我在基于10个地址的巨

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

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

如果我在基于10个地址的巨型帧10GbE网络上使用
ping-l 8000 ipaddress
从一台PC ping到另一台PC,我可以通过wire shark看到
ICMP
数据包大小约为8000,这是我所期望的

问题

我有一个小小的
TCP
服务器应用程序,运行在一台用
C#
编写的PC(嵌入式Windows 7)上。该应用程序没有什么特别之处,它所做的只是读取数据并丢弃数据。我只是用它来测试网络传输速度。如果有人觉得有趣,我可以发布服务器代码,但它非常基本

在另一台PC(Windows 10 Pro)上,我有另一个
C#
应用程序,它通过网络将100 GB的
GB
数据发送到
TCP
服务器应用程序进行测试。下面是我如何发送数据的一个非常简单的示例

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;
}
使用var tcpClient=newtcpclient();
等待tcpClient.ConnectAsync(地址、端口);
var pageSize=25165824;
var pageHeaderSize=312;
//对于本例,我将发送大约24MB的数据块。
//这是将要发送的最小“块”。
var buffer=新字节[pageSize+pageHeaderSize];
var pageCounter=0;
while(页面计数器<页面计数)
{ 
headerData.CopyTo(缓冲区,0);
//“sourceStream”实际上是正在写入的MMF视图流
//通过其他过程。
等待sourceStream.WriteAsync(缓冲区、headerData.Length、pageSize);
等待tcpClient.GetStream().WriteAsync(缓冲区,0,pageSize+pageHeaderSize);
++分页计数器;
}
这大致显示了我是如何将数据写入输出的
TCP
流的。当我发送数据时,我通过wire shark(在Windows 7机器上运行)监控网络流量,我注意到传输的每个数据包只有
590
字节(
TCP
header+payload)。我不知道为什么这些包这么小。这会导致大量不必要的网络流量

有趣的是,这里的另一个用户也有类似的问题

回答问题的用户怀疑中间有一个更小的MTU大小的设备,导致两个端点上的<代码> MTU <代码>,以适当地调整其大小。但是正如我上面所概述的,除了2个GBE开关,

中没有其他任何东西在中间。 我将其标记为
C#
,以供其他人查看我是否做了一些明显错误的事情(但我不这么认为,因为在应用程序级别,我们只处理
)。 我还将其标记为
networking
tcp-ip
,以获得
IT
人员的建议,查看是否有一些设置我没有在两台主机或交换机中设置

我不明白的是,为什么我可以通过
ping-l8000地址
ping-f-l8000地址
进行ping,并查看发送的数据包大小是否正确


编辑:作为旁注,明天早上我计划断开两台电脑上的1GbE连接。

TCP最大数据报大小约为1500字节。路由器和服务器可以拆分和合并数据报。Windows使用定时器将数据报从以太网接口传递到应用层。因此,如果数据速度较慢,它将被拆分。防火墙还使用端口转发,端口转发也可以分割数据报。MSS的配置是什么?@RonMaupin
nic
的默认值是什么。我不确定“默认”最大段大小是多少。我明天早上到的时候得检查一下。也就是说,这是网卡配置还是交换机配置,或者两者都是?。编辑,只需阅读Wiki在
MSS
上的解释,这听起来非常有希望。NIC不知道或不关心MSS,这是上层功能。你需要检查操作系统是如何设置的。您所指的数据包(“TCP头+负载”)实际上是一个段,即数据包负载。MSS控制网段大小,如果设置为590,则这是网段的最大大小。如果您在编程上依赖此大小来确定具体大小,则可能是做错了什么,或者可以通过其他方式解决问题