增加TCP / IP窗口大小

时间:2012-09-04 14:49:59

标签: c# tcp windows-server-2008-r2

我正在尝试通过tcp / ip在两台服务器之间发送消息。 我想发送一个30KB的消息。 但是我想把它作为一个整体发送出去。 我不希望tcp协议将其分解为段。

我正在使用2台Windows Server 2008 R2之间的通信。 客户端和服务器使用c#编码。 我尝试使用

tcpclnt.SendBufferSize = 100000;
tcpclnt.Client.DontFragment = true;

和服务器上的相同。

我也尝试配置服务器的窗口大小(编辑注册表)。

2 个答案:

答案 0 :(得分:6)

我强烈建议你进一步研究IPv4TCP,以及EthernetGigabit Ethernet(特别是Jumbo Frames

基本上,对您的问题的简短回答是,尽管IP头允许完整数据报的最大大小为64kb,但您无法发送包含30kb TCP有效负载的单个IP数据报。

这样做的原因是底层网络(很可能是以太网或千兆以太网)将具有更小的帧大小,因此需要对IP数据报进行分段,以便在帧大小内通过物理网络传输该数据报该网络的局限性。

TCP协议确保成功交付完整,未损坏的数据报(通过自动重组,自动检测损坏的数据报以及自动重传丢失或损坏的数据报),因此除非您有高度专业化的要求,否则您应该能够只需让TCP堆栈将您的消息分段并代表您重新组装。

答案 1 :(得分:3)

改变缓冲区大小会产生增加ram使用量的副作用 - 不推荐......

由于TCP实际上处理流而不是数据包(UDP使用数据包),我相信您的答案在于构建消息,请参阅message framing

另见code

稍后发现这个可能的解决方案,但认为它应该包括在这里:

SetTcpWindowSize

在底部搜索名为“为所有网络适配器设置TCP窗口大小”的VB示例

或者这里有一个缓冲处理程序,看起来它可以让你在一个部分读取一个消息,即使它在多个数据包中,它允许你通过缓冲区管理重新组装它们。见this link