2016-04-21 59 views
-1

我正在研究虚拟化环境(Linux over HyperV)。虚拟NIC的Linux驱动程序支持TSO和GSO(tcp分段为ON,通用分段为ON)。Linux TCP:数据包分段?

现在,我创建TCP套接字并将发送缓冲区设置为128K。 但基于ifconfig数据(TX字节和TX数据包),平均数据包大小约为11 K.所以我的问题是,我的数据包在哪里被分割(从128K到11K)?如何在套接字选项或TCP选项中控制/配置它?

谢谢!

===========编辑==================

我可以在一个10G的8Gbps达到吞吐量的应用网络有32个TCP连接 - 在这种情况下,平均数据包大小大约为20千字节,这非常好;但是当我将TCP连接增加到256时,吞吐量仅为1Gbps,因为NIC上的数据包大小降至大约3 KB。

我知道数据包的大小是对性能至关重要的,因为处理交通的成本是每包,而不是每个字节,所以对NIC的数据包,它是否越大越好。

因此,我的问题是:如何增加TCP数据包大小?有没有任何TCP设置控制这个?

+2

总之,根本不是。段的大小是NIC的MTU减去几个字节的大小。细分是正常的事情,属于“不是你的业务”。 TCP(概念上)是_stream_。它既不知道消息也不知道数据报或类似的东西。无论在“线路”上发生了什么,您都可以写入流中并从中读取,而不管这些事情是什么。另外,那些通过虚拟NIC广告的11kB已经是一个强大的MTU了,大于以太网上最大的jumbogram大小。 – Damon

+0

谢谢。我的应用程序在具有32个TCP连接的10G网络中可以达到8Gbps - 在这种情况下,平均数据包大小约为20K字节,这非常好;但是当我将TCP连接数增加到256时,吞吐量仅为1Gbps,因为NIC上的数据包大小约为3KBytes。我知道数据包的大小对性能至关重要,因为处理流量的成本是每个数据包的,而不是每个字节,所以在NIC上的数据包,如果更大,它会更好。所以,我的问题是:我如何增加TCP数据包大小?有没有任何TCP设置控制这个? –

回答

0
  • 设置套接字选项SO_SNDBUF,SO_RCVBUF可能有帮助,但TCP IP并不保证当接收/发送的大块大小。