1

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

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

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

在服务器上也是如此。

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

4

2 回答 2

6

我强烈建议您需要对IPv4TCP以及以太网千兆以太网(尤其是巨型帧)进行进一步研究。

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

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

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

于 2012-09-04T15:25:36.923 回答
3

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

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

另见代码

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

SetTcpWindowSize

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

或者,这里有一个缓冲区处理程序,它看起来可以让您在一个部分中读取消息,即使它位于多个数据包中,它也允许您通过缓冲区管理重新组合它们。看到这个链接

于 2012-09-04T15:02:18.473 回答